我目前正忙于装配并遇到以下问题:
我正在尝试获取已输入eax寄存器的数字。首先,我提出一个字符串,要求输入,然后有人必须输入一个数字。
我使用了以下代码,但我不了解它的每一点。请注意代码中的注释。
我知道现在这个数字绝对没有任何反应,除了已经被转移到eax中。我想知道的是为什么我必须使用leal:为什么以及它做什么?为什么我需要将eax推回堆栈?
由于
.text
string1: .asciz "Please enter a number\n"
input: .asciz "%d"
.global main
main:
movl %esp, %ebp
push $string1 # ask for number
call printf #print the string
leal -4(%ebp), %eax # ????
pushl %eax # the thing you pushed in eax is now pushed on the stack?
pushl $input #the number
call scanf
popl %eax
popl %eax # the number that has been entered is now in eax
call end
end:
push $0
call exit
答案 0 :(得分:2)
您正在调用函数,因此您可以在堆栈中将参数传递给它们。在eax
中返回一个整数,其余是通过输入输出指针参数再次在堆栈上返回。查看x86 calling conventions。
leal
指令将某些临时变量的有效地址存储到scanf
中,eax
将整数值放入scanf
,然后将其传递给{堆栈上的{1}}。看看这里:What's the purpose of the LEA instruction?