Assembly 装配分析问题

Assembly 装配分析问题,assembly,gdb,Assembly,Gdb,int应该是4字节,stack frame pointer应该是8字节(rbp 64位寄存器),return value应该是4字节(stack中) 我并没有亲眼目睹过(我是老派:p),但我听说这是一种推动价值观的新方式。通过直接将值存储到堆栈,它应该更快 int应该是4字节,stack frame pointer应该是8字节(rbp 64位寄存器),return value应该是4字节(stack中) 我并没有亲眼目睹过(我是老派:p),但我听说这是一种推动价值观的新方式。通过直接将值存储到堆

int应该是4字节,stack frame pointer应该是8字节(rbp 64位寄存器),return value应该是4字节(stack中)

  • 我并没有亲眼目睹过(我是老派:p),但我听说这是一种推动价值观的新方式。通过直接将值存储到堆栈,它应该更快

  • int应该是4字节,stack frame pointer应该是8字节(rbp 64位寄存器),return value应该是4字节(stack中)

  • 我并没有亲眼目睹过(我是老派:p),但我听说这是一种推动价值观的新方式。通过直接将值存储到堆栈,它应该更快

  • 为什么是16字节

    因为需要堆栈在调用指令之前对齐16字节

    为什么printf使用esi和edi

    因为指定在
    rdi
    rsi
    rdx
    rcx
    r8
    r9
    寄存器中传递(前6个)整数参数

    为什么是16字节

    因为需要堆栈在调用指令之前对齐16字节

    为什么printf使用esi和edi



    因为指定在
    rdi
    rsi
    rdx
    rcx
    r8
    r9
    寄存器中传递(前6个)整数参数。

    对于2,如果有超过1个分支,函数如何知道从何处获取参数?对于1,返回地址不应该是8字节,像
    0x00000000004004ac
    ?这个答案完全是假的。您可能会注意到,在推送帧指针之后,堆栈上保留了16个字节。使用俄语,这正是这个星球上每个程序中发生的事情。堆栈帧指针首先被按下。@soyrosp:是的,但当其按下的esp在pop和push指令时减少(或增加CAME ARCH)时。您不需要单独更改。并且在推ebp之前推送返回地址。16字节的保留是在返回地址和fp都被按下并且@employed俄语在上面回答了它之后。对于2,如果有超过1个分支,函数如何知道从哪里获取参数?对于1,返回地址不应该是8字节,比如
    0x00000000004ac
    ?这个回答完全是假的。您可能会注意到,在推送帧指针之后,堆栈上保留了16个字节。使用俄语,这正是这个星球上每个程序中发生的事情。堆栈帧指针首先被按下。@soyrosp:是的,但当其按下的esp在pop和push指令时减少(或增加CAME ARCH)时。您不需要单独更改。并且在推ebp之前推送返回地址。16字节的保留是在返回地址和fp都被推送并且@employed俄语在上面回答了它之后。感谢16字节的对齐回答。但是为什么printf使用esi而edi没有被回答?如果有超过1个分支,函数如何知道从何处获取参数?在这种情况下,将首先进行分支,并将参数加载到分支完成后注册..@zimbaao,我的意思是sub_函数如何知道从何处获取参数?我如何才能在汇编中获取对齐大小和体系结构大小?感谢16字节对齐答案。但似乎为什么printf使用esi而edi没有得到回答?如果有超过1个分支,函数如何知道从何处获取参数?在这种情况下,将首先进行分支并获取参数分支完成后加载到寄存器。@zimbaao,我的意思是sub_函数如何知道从何处获取参数?如何在汇编中获取对齐大小和架构大小?
    (gdb) l main
    1   #include <stdio.h>
    2   
    3   int main(void)
    4   {
    5       int i = 6;
    6       printf("%d",sizeof(unsigned short));
    7       return 0;
    8   }
    (gdb) disas main
    Dump of assembler code for function main:
    0x0000000000400498 <main+0>:    push   %rbp
    0x0000000000400499 <main+1>:    mov    %rsp,%rbp
    0x000000000040049c <main+4>:    sub    $0x10,%rsp
    0x00000000004004a0 <main+8>:    movl   $0x6,-0x4(%rbp)
    0x00000000004004a7 <main+15>:   mov    $0x2,%esi
    0x00000000004004ac <main+20>:   mov    $0x4005c8,%edi
    0x00000000004004b1 <main+25>:   mov    $0x0,%eax
    0x00000000004004b6 <main+30>:   callq  0x400398 <printf@plt>
    0x00000000004004bb <main+35>:   mov    $0x0,%eax
    0x00000000004004c0 <main+40>:   leaveq 
    0x00000000004004c1 <main+41>:   retq   
    
    (gdb) disas printf
    Dump of assembler code for function printf@plt:
    0x0000000000400398 <printf@plt+0>:  jmpq   *0x2004c2(%rip)        # 0x600860 <_GLOBAL_OFFSET_TABLE_+24>
    0x000000000040039e <printf@plt+6>:  pushq  $0x0
    0x00000000004003a3 <printf@plt+11>: jmpq   0x400388