首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >32位英特尔处理器的大会与64位版本有什么不同?

32位英特尔处理器的大会与64位版本有什么不同?
EN

Stack Overflow用户
提问于 2016-06-23 14:43:26
回答 3查看 257关注 0票数 0

我已经开始学习大会了,但我担心这本书的第一句:

在这本书中,我们专注于英特尔32位处理器的汇编语言,比如奔腾。

32位的大会和64位的大会有什么不同?这是值得学习两者,还是通过学习32位,我将对64位一呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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位指针。

这主要是一个介绍性的列表,还有其他一些变化:

  • 所有持有地址的东西现在都是64位,这是经验法则。
  • 在64位模式(a.k.a )中禁用分段。(长模式),只有FS和GS选择的描述符基和限制被遵守。
  • 由于引入了REX前缀,一些指令(如inc ax的一个字节形式)不再可编码(即可用)。
  • 对32位寄存器的算术操作清除全部64位寄存器的上32位(即mov eax, 1清除RAX的上DWORD )。
  • 在操作码级别,大多数即时操作数仍然是32位,但符号扩展。像add ebx, 0123456789abcdefh这样的指令是不可编码的。
  • 物理地址必须是规范的,以避免混叠,即将符号扩展到64位。
  • 一种新的寻址模式是可用的: RIP相对方式,即可以使用当前指令地址的偏移量来访问数据。这有助于位置独立代码。

所有这些仍然是初步的,你可以谷歌的相关条款,如果有兴趣或看看英特尔手册

然而,当您从32位切换到64位时,最让您印象深刻的是所使用的ABI的更改,您需要调整对运行时库过程的调用。

作为改变的一个例子:

参数现在传递到寄存器上(第一个4),堆栈必须对齐,向量寄存器用于浮点,堆栈上可用一个红色区域/转储区域。

每个平台都有自己的ABI,您可以检查,例如,SysV ABI的完整列表。

票数 4
EN

Stack Overflow用户

发布于 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 :这就像学习两者都不需要额外的工作。

票数 1
EN

Stack Overflow用户

发布于 2016-06-23 19:29:00

ABI是不同的,但实际指令集非常相似。请参阅此关于x86-64中不同之处的快速指南x86 标签维基链接而来。

在现代OSes中,32位和64位都有相同的系统调用ABI,尽管在ABI方面存在差异(例如,int 0x80syscall)。

但是通过学习32位代码,你就不会浪费时间去学习只对DOS程序有用的DOS系统调用。

如果立即学习64位代码的话,IDK会更容易或不容易。您通常可以编写不需要真正将堆栈用于任何东西的函数;也许只是一个push / pop来保存/恢复一些东西。在某些方面,这是一件好事。您可以推迟学习如何使用堆栈,而将注意力集中在其他基础知识上,如使分支逻辑正确。

32位ABI基本上迫使您立即学习堆栈布局,因为args总是在堆栈上传递。

如果您想要编写真正有效的64位代码(当32位操作数大小足够时,这不会在REX前缀上浪费指令字节),这是另一件需要考虑的事情。但是当你在学习的时候,仅仅满足于正确性是很好的;而且你只是偶尔需要担心符号--将32位带符号的int扩展到64位,以便在寻址模式中用作偏移量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37994891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档