Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/function/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function x86汇编函数_Function_Assembly_X86 64 - Fatal编程技术网

Function x86汇编函数

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 此外,

我有一个由main调用的函数。假设函数名为
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
    在这个例程后面的某个地方被使用了
  • 是,堆栈上正在为0x28字节的数据留出空间。假设
    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
    函数,其余部分对我隐藏。我不应该看到它。