Function x86汇编函数
我有一个由main调用的函数。假设函数名为Function x86汇编函数,function,assembly,x86-64,Function,Assembly,X86 64,我有一个由main调用的函数。假设函数名为funct1funct1调用另一个名为read\u input的函数 现在假设funct1按如下方式启动: push %rbp push %rbx sub $0x28, %rsp mov $rsp, %rsi callq 4014f0 read_input cmpl $0x0, (%rsp) jne (some terminating function) 因此,只有几个问题: 在这种情况下,read\u input是否只有一个参数,即 %rbx 此外,
funct1
funct1
调用另一个名为read\u input
的函数
现在假设funct1
按如下方式启动:
push %rbp
push %rbx
sub $0x28, %rsp
mov $rsp, %rsi
callq 4014f0 read_input
cmpl $0x0, (%rsp)
jne (some terminating function)
因此,只有几个问题:
read\u input
是否只有一个参数,即
%rbx
李>
0x28
,这意味着大小为0x28
的字符串将被推送到
堆栈(我知道这是一根绳子)mov%rsp,%rsi
调用函数之前李>
read\u input
返回时,返回值放在哪里谢谢你,很抱歉提出这些问题,但我才刚刚开始学习x86 看起来您的代码正在使用Linux/AMD ABI。我将在这方面回答你的问题
rbx
是被叫方保存的(非易失性)寄存器。您的函数正在保存它,以便它不会干扰调用者的值。它不会在您显示的代码中恢复,但这是因为您没有显示整个函数。如果这个函数还有更多的功能,我想是的,那是因为rbx
在这个例程后面的某个地方被使用了read\u input
将字符串作为参数,那么您的描述是合理的。然而,这并不一定准确。除了分配给read\u input
的缓冲区之外,这些数据中的一些可能用于其他局部变量rsi
rsi
是AMD x64调用约定的第二个参数寄存器。这意味着您将使用传递给此函数的第一个参数以及指向新堆栈缓冲区的指针调用read\u input
rax
中,如果它是64位或更小的值,则在rax
和rdx
中,如果它更大。或者如果它是浮点,则在xmm0
、ymm0
或st(0)
中。你可能应该看一下你的通话习惯的描述来了解这件事——网站上有一个很棒的PDF文件。看看表4你的代码来自哪里?您是从C源生成的吗?减少堆栈指针可能意味着在堆栈上分配了局部变量。到4:可能返回值在堆栈上,因为调用read_input后,堆栈顶部与指令中的0相比较。@Giorgio是从C源使用objdump-d生成的。@Giorgio I只有访问权限到C代码的
main
函数,其余部分对我隐藏。我不应该看到它。