提问人:P.I.S 提问时间:9/29/2023 最后编辑:Sep RolandP.I.S 更新时间:10/2/2023 访问量:55
查找偶数点后十进制数字最大总和的单词
Finding the word with the maximum sum of even decimal digits
问:
此 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,调试,并询问了朋友,但到目前为止我没有成功。
答:
0赞
Sep Roland
10/2/2023
#1
一些错误
maxArray 过程使用 CH 寄存器来存储中间结果,但 addev 过程也使用 CH 来实现自己的目的。要么在 addev 中保留寄存器,要么使用另一个寄存器。您可以期望的最大总和是 36(来自像 48888 这样的数组元素),因此字节大小的寄存器就可以了。
我下面的代码将改用 BP 寄存器,因为无论如何它都是一个保留的寄存器!-
push [di] call addev pop [di]
由于在退出时使用了 addev 过程,因此会自动删除推送到堆栈的参数。该指令是有害的,必须删除。
ret 2
pop [di]
一些提示
-
mov bx,[bp+4]
addev 过程无需在 BX 寄存器中返回数组元素的值。父过程可以很容易地使用 DI 中的地址重新读取数组元素。
-
mov dh, dl and dl, 1 jnz cont
要确定是否设置了最低位,最好使用非破坏性指令。这样你就不需要先制作副本了。
test dl, 1
一些代码(未经测试)
.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] ; An array element
mov di, 10 ; CONST
xor bp, bp ; Sum of the even digits
next:
xor dx, dx
div di
test dx, 1
jnz IsOdd
add bp, dx ; DX={0,2,4,6,8}
IsOdd:
test ax, ax
jnz next
mov ax, bp
pop bp
ret 2
addev endp
maxArray proc near
push bp
mov bp, sp
xor ax, ax ; Always return something meaningful
mov cx, [bp + 4] ; Length of the array
jcxz done
mov si, [bp + 6] ; Address of the array
xor bp, bp ; Largest sum of even digits
next1:
lodsw
push ax
call addev ; -> AX
cmp ax, bp
jbe NotBetter
mov bp, ax
mov bx, si ; Because of LODSW that adds 2 to SI, this points behind the concerned array element
NotBetter:
dec cx
jnz next1
mov ax, [bx - 2] ; The element with the largest sum of even digits
done:
pop bp
ret 4
maxArray endp
end
评论