assembly 查找偶数位和最大的单词

nwlqm0z1  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(69)

这个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、调试和问朋友,但到目前为止都没有成功。

fv2wmkja

fv2wmkja1#

部分错误

  • 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

相关问题