我已经开始学习大会了,但我担心这本书的第一句:
在这本书中,我们专注于英特尔32位处理器的汇编语言,比如奔腾。
32位的大会和64位的大会有什么不同?这是值得学习两者,还是通过学习32位,我将对64位一呢?
发布于 2016-06-23 17:44:30
64位模式引入了一些架构更改。
从英特尔的手册1第3.2.1章可以找到一个不完整的列表
·地址空间-在IA-32处理器上以64位模式运行的任务或程序可以寻址最多2^64字节的线性地址空间(符合3.3.7.1节描述的规范寻址要求)和最多2^46字节的物理地址空间。软件可以查询CPUID以获得处理器支持的物理地址大小。以前只能处理4 GiB (当然不是所有的内存都可用),目前的限制是64 TiB。 ·Basic程序执行寄存器--通用寄存器的数目为16。通用寄存器宽64位,支持字节、字、双字和四字整数的操作。访问字节寄存器是一致的最低8位。指令指针寄存器变成64位。EFLAGS寄存器扩展到64位宽,称为RFLAGS寄存器。保留RFLAGS的上32位。RFLAGS的下32位与EFLAGS相同。见图3-2. x86有8个通用寄存器: EAX、EBX、EBX、EDX、ESI、EDI、EBP、EDI。每一个32位。现在有16个GP寄存器,64位: RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15。这些寄存器的下32位是旧的32位寄存器。扩展了其他寄存器并使其可寻址,如BPL。 ·XMM寄存器-有16个XMM数据寄存器用于SIMD操作。有关这些寄存器的更多信息,请参见10.2节“SSE编程环境”。 以前只有8个XMM0-XMM 7 128位SIMD寄存器.与AVX同样适用于YMM 堆栈-堆栈指针大小为64位。堆栈大小不受SS描述符中的位(在非64位模式下)的控制,指针大小也不能被指令前缀覆盖。 正如预期的那样,堆栈指针是RSP。 ·控制寄存器-控制寄存器扩展到64位。添加了一个新的控制寄存器(任务优先级寄存器: CR8或TPR)。请参阅本卷中的第2章“Intel 64和IA-32体系结构”。 ·Debug寄存器--调试寄存器扩展到64位。参见Intel 64和IA-32架构软件开发人员手册第17章“调试、分支配置文件、TSC和服务质量”,第3A卷。 这是为了容纳64位指针。
这主要是一个介绍性的列表,还有其他一些变化:
inc ax
的一个字节形式)不再可编码(即可用)。mov eax, 1
清除RAX的上DWORD )。add ebx, 0123456789abcdefh
这样的指令是不可编码的。所有这些仍然是初步的,你可以谷歌的相关条款,如果有兴趣或看看英特尔手册。
然而,当您从32位切换到64位时,最让您印象深刻的是所使用的ABI的更改,您需要调整对运行时库过程的调用。
作为改变的一个例子:
参数现在传递到寄存器上(第一个4),堆栈必须对齐,向量寄存器用于浮点,堆栈上可用一个红色区域/转储区域。
每个平台都有自己的ABI,您可以检查,例如,SysV ABI的完整列表。
发布于 2016-06-23 15:20:41
除了x64处理器可以按原样执行32位x86之外,x86指令集基本上与x64 1兼容。add ebx, eax
在x64中仍然有效。但也有一些不同之处。例如,push es
无效,指针为64位:mov dword ptr[esi], eax
是有效的,但可能无法工作,因为您可能会截断rsi
中的指针。
这意味着学习32位x86和64位x64并没有太大的区别。你对这两种都没意见。如果你有选择的话,我的观点是学习x64 :这就像学习两者都不需要额外的工作。
发布于 2016-06-23 19:29:00
ABI是不同的,但实际指令集非常相似。请参阅此关于x86-64中不同之处的快速指南从x86 标签维基链接而来。
在现代OSes中,32位和64位都有相同的系统调用ABI,尽管在ABI方面存在差异(例如,int 0x80
与syscall
)。
但是通过学习32位代码,你就不会浪费时间去学习只对DOS程序有用的DOS系统调用。
如果立即学习64位代码的话,IDK会更容易或不容易。您通常可以编写不需要真正将堆栈用于任何东西的函数;也许只是一个push
/ pop
来保存/恢复一些东西。在某些方面,这是一件好事。您可以推迟学习如何使用堆栈,而将注意力集中在其他基础知识上,如使分支逻辑正确。
32位ABI基本上迫使您立即学习堆栈布局,因为args总是在堆栈上传递。
如果您想要编写真正有效的64位代码(当32位操作数大小足够时,这不会在REX前缀上浪费指令字节),这是另一件需要考虑的事情。但是当你在学习的时候,仅仅满足于正确性是很好的;而且你只是偶尔需要担心符号--将32位带符号的int扩展到64位,以便在寻址模式中用作偏移量。
https://stackoverflow.com/questions/37994891
复制相似问题