计算数组(组件)的平均数


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

相关内容

  • 没有找到相关文章

最新更新