我所谈论的事情总是无时无刻不在盯着我,而不是,例如,API的行为略有不同。例如,
64位编译器是否采用了在32位上下文中很少看到的特定优化?
我会在64位程序中看到不同的指令吗?是32位指令集中存在还是不存在?
是否需要特别了解
x64
和x86
上的工具支持?#1 楼
x86和x86_64之间最大的区别之一是引入了RIP相对寻址。与32位ARM相似,现在可以(容易地)从当前RIP值偏移一个数据。例如,这是x86程序中__libc_csu_init()的前几条指令:
08048420 <__libc_csu_init>:
8048420: 55 push %ebp
8048421: 57 push %edi
8048422: 31 ff xor %edi,%edi
8048424: 56 push %esi
8048425: 53 push %ebx
8048426: e8 f9 fe ff ff call 8048324 <__x86.get_pc_thunk.bx>
804842b: 81 c3 79 12 00 00 add 0000000000400500 <__libc_csu_init>:
400500: 48 89 6c 24 d8 mov %rbp,-0x28(%rsp)
400505: 4c 89 64 24 e0 mov %r12,-0x20(%rsp)
40050a: 48 8d 2d 97 01 20 00 lea 0x200197(%rip),%rbp # 6006a8 <__init_array_end>
400511: 4c 8d 25 88 01 20 00 lea 0x200188(%rip),%r12 # 6006a0 <__frame_dummy_init_array_entry>
400518: 48 89 5c 24 d0 mov %rbx,-0x30(%rsp)
40051d: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp)
400522: 4c 89 74 24 f0 mov %r14,-0x10(%rsp)
400527: 4c 89 7c 24 f8 mov %r15,-0x8(%rsp)
x1279,%ebx
8048431: 83 ec 1c sub q4312078qx1c,%esp
8048434: 8b 6c 24 30 mov 0x30(%esp),%ebp
8048438: 8d b3 0c ff ff ff lea -0xf4(%ebx),%esi
它在x86_64上(注意0x40050a和0x400511):
q4312078q
您可以找到有关此约定的更多信息,请参见:http://www.codegurus.be/codegurus/programming/riprelativeaddressing_en.htm
#2 楼
调用约定将是一大不同之处–在64位上,某些参数在寄存器中传递;参见http://en.wikipedia.org/wiki/X86_calling_conventions和参考文献其他明显的东西包括更大的寄存器,更多的SSE寄存器和64位算术(
mov QWORD
/ movq
等)。 。超出您的期望,实际上情况非常相似。有关较大差异的概述,请参见http://en.wikipedia.org/wiki/X86-64#Architectural_features-大多数其他新功能对于内核空间代码而不是用户空间代码更为重要。除了将32位指令逻辑扩展到64位指令外,指令集还保持静态。
评论
链接死了~~~
– BlueRaja-Danny Pflughoeft
16年6月30日在20:13