我认为我在组装堆栈方面缺少一个重要的概念。我想推送寄存器rcx
的值,因为被调用函数使用了该寄存器,但出现了段错误。我知道,如果我将push rbx
放在push rcx
之前(对于pop
之后),代码就可以工作。这背后是否有充分的理由(对我来说似乎没有意义)?
.intel_syntax noprefix
.data
wrtfrmt: .asciz "%c\n"
rdfrmt: .asciz "%d"
.bss
.lcomm val, 4
.text
.global main
main:
enter 0,0
lea rdi, rdfrmt
lea rsi, val
call scanf
mov ebx, val
lea rdi, rdfrmt
lea esi, val
call scanf
mov ecx, val
next:
push rcx
lea rdi, rdfrmt
lea esi, val
call scanf
pop rcx
cmp ebx, val
loopne next
jne not_found
mov esi, 'y'
jmp print
not_found:
mov esi, 'y'
print:
lea rdi, wrtfrmt
call printf
leave
ret