CMP指令和JE无法触发

问题描述

为另一个初学者q道歉,但是我不确定为什么这个比较运算符不起作用。代码遍历两个数组,并对照arr2 [i]检查arr1 [i]处的元素,如果它们相同,则打印“ Match!”。但是,这没有发生。比较将被忽略。我可以验证寄存器正确输出到终端后的值正确。

我认为这可能与我的数组元素的大小(1个qword)有关,但我确实很好,确实陷入了困境。 asm管理员可以发表一些见识吗?

有问题的代码

section .data

winner: db "Match!"

section .bss
    minex resq 10
    miney resq 10 ; arrays for x and y positions of the mines

...

check_board:
    lea r13,[rel miney]
    lea r14,[rel minex]
    xor rcx,rcx

    board_loop_num:

        mov rbx,[r13+rcx*8]
        mov [rel num],rbx
        call printNum


        mov r11,[r14+rcx*8]
        mov [rel num],r11
        call printNum



        cmp rbx,r11
        je win
        jmp end_board

        win:
            push rcx
            mov rsi,winner
            mov rdx,7
            call print
            pop rcx

        end_board:
            inc rcx

            push rcx
            mov rsi,newln
            mov rdx,1
            call print
            pop rcx

        cmp rcx,9
        jne board_loop_num
    ret


printNum:
    mov rsi,num
    mov rdx,1
    push rcx ; need to push rcx on stack because sys call in print cull
    call print
    pop rcx
    ret

然后输出显示数字是正确的:

00
33
20
95
06
73
40
15
24

解决方法

问题是printNum调用printsyscallsyscall的{​​{1}},但是您将r11与好像它仍然包含您的价值。选择一个不会r11破坏寄存器的寄存器,或者将其值保存到堆栈中,然后再将其恢复。或者,您可以将其保存在syscall中,因为您刚刚将其保存在其中。