将数字加载到寄存器中

时间:2012-06-04 12:30:58

标签: assembly att

我目前正忙于装配并遇到以下问题:

我正在尝试获取已输入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

1 个答案:

答案 0 :(得分:2)

您正在调用函数,因此您可以在堆栈中将参数传递给它们。在eax中返回一个整数,其余是通过输入输出指针参数再次在堆栈上返回。查看x86 calling conventions

编辑0:

leal指令将某些临时变量的有效地址存储到scanf中,eax将整数值放入scanf,然后将其传递给{堆栈上的{1}}。看看这里:What's the purpose of the LEA instruction?