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
我无法计算平均值。。。我的代码中缺少什么
a db 0,3,5,7,5
对于定义为包含字节值的数组,您还需要将这些值读取为字节取为单词。这显然是错误的。
这里有几个解决方案:
-
级联一个字节大小的加法
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
请注意,我只是通过重新使用CL
来避免使用BL
。