Assembly 装配分析问题
int应该是4字节,stack frame pointer应该是8字节(rbp 64位寄存器),return value应该是4字节(stack中)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),但我听说这是一种推动价值观的新方式。通过直接将值存储到堆
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