计算数组的平均数(程序集)

calculate average number an array (asssembly)

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

对于定义为包含 byte 值的数组,您还需要将这些值 读取为 bytes!指令 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

请注意,我只是通过重新使用 CL.

来避免使用 BL