System V Application Binary Interface AMD64 Architecture Processor Supplement
来源:互联网 发布:上海大数据竞赛 编辑:程序博客网 时间:2024/04/28 03:56
Passing
Once arguments are classified, the registers get assigned (in left-to-right
order) for passing as follows:
1. If the class is MEMORY, pass the argument on the stack.
2. If the class is INTEGER, the next available register of the sequence %rdi,
%rsi, %rdx, %rcx, %r8 and %r9 is used 13 .
3. If the class is SSE, the next available vector register is used, the registers
are taken in the order from %xmm0 to %xmm7.
4. If the class is SSEUP, the eightbyte is passed in the next available eightbyte
chunk of the last used vector register.
5. If the class is X87, X87UP or COMPLEX_X87, it is passed in memory.
Returning of Values
The returning of values is done according to the following
algorithm:
1. Classify the return type with the classification algorithm.
2. If the type has class MEMORY, then the caller provides space for the return
value and passes the address of this storage in %rdi as if it were the first
argument to the function. In effect, this address becomes a “hidden” first
argument.
On return %rax will contain the address that has been passed in by the
caller in %rdi.
3. If the class is INTEGER, the next available register of the sequence %rax,
%rdx is used.
4. If the class is SSE, the next available vector register of the sequence %xmm0,
%xmm1 is used.
5. If the class is SSEUP, the eightbyte is returned in the next available eightbyte
chunk of the last used vector register.
6. If the class is X87, the value is returned on the X87 stack in %st0 as 80-bit
x87 number.
7. If the class is X87UP, the value is returned together with the previous X87
value in %st0.
8. If the class is COMPLEX_X87, the real part of the value is returned in
%st0 and the imaginary part in %st1.
Code
/* x64abi.c */int func(int a, int b, int c, int d, int e, int f, int g, int h){ int ret; ret = a + b + c + d + e + f + g + h; return ret;}int main(void){ func(5, 6, 10, 11, 22, 23, 38, 39); return 0;}
$ objdump -d x64abi.ox64abi.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 <func>: 0:55 push %rbp 1:48 89 e5 mov %rsp,%rbp 4:89 7d ec mov %edi,-0x14(%rbp) 7:89 75 e8 mov %esi,-0x18(%rbp) a:89 55 e4 mov %edx,-0x1c(%rbp) d:89 4d e0 mov %ecx,-0x20(%rbp) 10:44 89 45 dc mov %r8d,-0x24(%rbp) 14:44 89 4d d8 mov %r9d,-0x28(%rbp) 18:8b 45 e8 mov -0x18(%rbp),%eax 1b:8b 55 ec mov -0x14(%rbp),%edx 1e:8d 04 02 lea (%rdx,%rax,1),%eax 21:03 45 e4 add -0x1c(%rbp),%eax 24:03 45 e0 add -0x20(%rbp),%eax 27:03 45 dc add -0x24(%rbp),%eax 2a:03 45 d8 add -0x28(%rbp),%eax 2d:03 45 10 add 0x10(%rbp),%eax 30:03 45 18 add 0x18(%rbp),%eax 33:89 45 fc mov %eax,-0x4(%rbp) 36:8b 45 fc mov -0x4(%rbp),%eax 39:c9 leaveq 3a:c3 retq 000000000000003b <main>: 3b:55 push %rbp 3c:48 89 e5 mov %rsp,%rbp 3f:48 83 ec 10 sub $0x10,%rsp 43:c7 44 24 08 27 00 00 movl $0x27,0x8(%rsp) 4a:00 4b:c7 04 24 26 00 00 00 movl $0x26,(%rsp) 52:41 b9 17 00 00 00 mov $0x17,%r9d 58:41 b8 16 00 00 00 mov $0x16,%r8d 5e:b9 0b 00 00 00 mov $0xb,%ecx 63:ba 0a 00 00 00 mov $0xa,%edx 68:be 06 00 00 00 mov $0x6,%esi 6d:bf 05 00 00 00 mov $0x5,%edi 72:e8 00 00 00 00 callq 77 <main+0x3c> 77:b8 00 00 00 00 mov $0x0,%eax 7c:c9 leaveq 7d:c3 retq
- System V Application Binary Interface AMD64 Architecture Processor Supplement
- System V Application Binary Interface (1)
- ABI(Application Binary Interface)
- ABI(Application Binary Interface)
- AMD64 Architecture
- AMD64 Architecture
- package architecture (i386) does not match system (amd64)
- 读书笔记: processor architecture<computer system a programmer perspective第二章>
- EABI (Extended Application Binary Interface)
- EABI (Extended Application Binary Interface)
- EABI (Extended Application Binary Interface
- EABI (Extended Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- 转贴:C++ ABI (Application Binary Interface)
- #import @class 的区别
- 高级开发人员面试宝典
- 网络安全,不应止于审核登录事件
- web应用的发布
- javascript深入理解js闭包
- System V Application Binary Interface AMD64 Architecture Processor Supplement
- C语言printf("%d",15.0/2)结果为0
- Mysql Error log
- 求最长重复子串
- CSS样式入门
- window下面的form自适应
- Android自定义垂直滚动自动选择日期控件
- 微信公众平台 消息推送实现(Java)
- JS面向对象编程之对象