T1 DB 'Hello World! $'
NUM EQU $ - T1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AH, 9
LEA DX, T1
INT 21H
MOV BX, 0
MOV CX, NUM
LOP:
MOV AL, T1[BX]
CMP AL, 'a'
JB NEXT
CMP AL, 'z'
JA NEXT
SUB AL, 20h
MOV T1[BX], AL
NEXT:
INC BX
LOOP LOP
MOV AH, 9
LEA DX, T1
INT
MOV AH, 4CH
INT 21H
CODE ENDS
END START
MOV DX,OFFSET dest_buffer
int 21h
MOV AH,4CH
INT 21H
code ends
end start
code segmentassume cs:code
org 100h
start: jmp begin
array db 100 dup(?)
sum db 0
begin: push cs
pop ds
push cs
pop es
lea si,array
mov cx,100
cld
@0:
lodsb
add byte ptr sum,al
loop @0
int 3
mov ah,4ch
int 21h
code ends
end start
1、程序如下:codesegment
assume cs:code, ds:code, ss:code
org 100h
main: mov si,offset x 取数组中第一个元素的内存地址
mov cx,100 数组元素个数
cld 以下使用lodsb来获得各元素值,为此先清除方向标志
xor ah,ah 因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)
lab1: lodsb 从ds:si处取一个字节放入al中,同时si增1即指向下个元素
add sum,ax 累加
looplab1循环,前面对cx的赋值规定了循环次数为100次
int 20h 循环结束后sum中为总和,此处用int 20h退出
x db 100 dup (?) 定义100个字节型元素的数组,但不指定初值
sum dw 0 sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值
codeends
end main
2、代码如下:
cmp ax,bx 比较ax与bx
jge lab2若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令
xchg ax,bx 根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值
lab2: cmp ax,cx 执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx
jge lab3方法与前次类似,至lab3时ax将存有原来三者中最大的数
xchg ax,cx 没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值
lab3:
至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。
cmp bx,cx
jge lab4
xchg bx,cx
lab4:
至此,ax>=bx>=cx
----
谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)