计算一个数组的平均数(asssembly)

时间:2017-11-03 08:08:49

标签: assembly x86-16 emu8086

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

我无法计算平均值...我的代码中缺少什么

1 个答案:

答案 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