data segment
a db 0,3,5,7,5
average db ?
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax,@data
mov ds,ax
mov es,ax
mov ax,0
mov bl,5
mov cx,5
lea si,a
dong:
add ax,[si]
inc si
dec cx
cmp cx,0
jne dong
jmp bak
bak:
div bl ;ax/5=al
mov average,al
mov ax, 4c00h
int 21h
ends
end start
我无法计算平均值...我的代码中缺少什么
答案 0 :(得分:2)
a db 0,3,5,7,5
对于定义为包含 byte 值的数组,您还需要将这些值读取为字节!指令add ax,[si]
正在将这些值读作单词。这显然是错的。
这里有一些解决方案:
执行级联字节大小的添加
add al, [si] ;Add 1 byte-sized array element to AL
adc ah, 0 ;Takes care of a potential carry from previous addition
读取预置零字寄存器低位的字节值,然后进行字大小的加法
mov dl, [si] ;Read 1 byte-sized array element in DL, DH was zeroed beforehand!
add ax, dx ;Add to result in AX
你的程序的其余部分没问题,但可以稍微改进一下。
mov ax,0
通过对寄存器进行异或来更好地清除寄存器。所以这里变成了xor ax, ax
。
dec cx cmp cx,0 jne dong
因为dec cx
指令已经设置了包含你想要的零标志(ZF)的标志,所以在循环之前不需要使用cmp cx,0
。
jmp bak bak:
这个jmp bak
没用,因为代码很容易落空。
应用上述内容:
xor ax, ax ;Set AX=0
mov cx, 5
lea si, a
dong:
add al, [si] ;Add 1 byte-sized array element to AL
adc ah, 0 ;Takes care of a potential carry from previous addition
inc si
dec cx
jnz dong
mov cl, 5
div cl ;AX/5 -> AL
mov average, al
请注意,我只是通过重复使用BL
来避免使用CL
。