问题描述
为另一个初学者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
调用print
和syscall
做syscall
的{{1}},但是您将r11
与好像它仍然包含您的价值。选择一个不会r11
破坏寄存器的寄存器,或者将其值保存到堆栈中,然后再将其恢复。或者,您可以将其保存在syscall
中,因为您刚刚将其保存在其中。