这个x86汇编代码定义了两个过程:“addev”用于计算单词中偶数位的总和,“maxArray”用于查找数组中偶数位总和最大的单词。它接受一个单词数组及其长度作为输入,遍历该数组,计算每个单词的偶数位和,并返回AX中偶数位和最大的单词。我不知道如何进行第二个步骤。到目前为止,我到了这一点。我什么都试过了,但就是做不到。请帮帮我
.model small
.stack 100h
.data
A dw 1489, 32661, 31248, 24788, 13499, 28
N dw 6
.code
mov ax, @data
mov ds, ax
push offset A
push N
call maxArray
.exit
addev proc near
push bp
mov bp, sp
mov ax, [bp + 4]
mov bx, 10
mov ch, 0
next:
mov dx, 0
div bx
mov dh, dl
and dl, 1
jnz cont
mov dl, dh
mov dh, 0
add ch, dl
cont:
cmp ax, 0
jne next
mov al, ch
mov bx,[bp+4]
pop bp
ret 2
addev endp
maxArray proc near
push bp
mov bp, sp
mov bx, 0
mov cx, 0
mov di, [bp + 6]
mov si, di
next1:
cmp cl, [bp + 4]
je ext
push [di]
call addev
pop [di]
inc di
inc di
cmp ch, al
ja cont2
cmp ch, al
jne check
cmp bx, [si]
jae cont2
mov si, di
cont2:
inc cl
jmp next1
check:
mov ch, al
mov si, di
jmp cont2
ext:
mov ax, [si]
pop bp
ret 4
maxArray endp
end
我尝试了ChatGPT、调试和问朋友,但到目前为止都没有成功。
1条答案
按热度按时间fv2wmkja1#
部分错误
我下面的代码将使用BP寄存器,因为这是一个保留的寄存器!
由于 addev 过程在退出时使用了
ret 2
,因此被压入堆栈的参数被自动删除。pop [di]
指令是有害的,必须删除。提示
要确定是否设置了最低位,最好使用非破坏性的
test dl, 1
指令。这样你就不需要先复印一份了。部分代码(未测试)