gpt4 book ai didi

assembly - 字长及其适应症

转载 作者:行者123 更新时间:2023-12-02 07:01:12 25 4
gpt4 key购买 nike

请参阅下面有关各种指令集架构中字长的问题,以及它与汇编语言的关系。感谢您的任何帮助。

首先是一些事实(如果其中任何一个错误,请纠正我)。处理器架构的字长表示 (编辑:其中一些是错误的,请参阅下面 Seva 的帖子) :

  • 每个寄存器的最大大小
  • 每个内存地址的最大大小(可寻址的内存量)
  • CPU 可以在单条指令中处理的最大整数
  • 可以在单个操作中传入和传出工作内存的最大数据

  • 现在真正奇怪的事情来了:在 IA-32 的汇编语言中 a 字被指定为 16 位长 . IA-32 是指所有支持 32 位计算的 x86 版本(即 字应该是 32 位长 )。

    这只是让我对单词的全部理解及其所表示的内容(上面的列表)分崩离析。

    谢谢你帮我查明真相,

    马格努斯

    编辑 2:请参阅下面关于 x86 架构的两个有用链接。
  • 正如下面 altie 所发布的:http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
  • 我偶然发现了一个简单的 x86 指南:http://www.swansontec.com/sintel.html
  • 最佳答案

    所有这些假设都有反例。

    The size of each instruction



    英特尔 x86 从很久以前就具有可变长度指令。 ARM 在 Thumb-2 模式下也是如此。

    The largest size of each register



    你的意思是 - 整数寄存器,对吧?例如,Intel 上的浮点寄存器有 10 个字节长。这个是最接近的。但是 Intel x86 是一个明显的异常(exception)——它对“字”的定义在 16 位 CPU 的时候是固定的;随着 ISA 的发展,定义停滞不前。

    同样,在 ARM 的 AArch64 指令集的上下文中,“字”表示“32 位”,而通用寄存器是 64 位。 “单词”的定义在 ARM 的 32 位全盛时期是固定的,并一直保留至今。

    The largest size of each memory address



    显然错了。 16 位 Intel 286 有一个 24 位地址空间。这是通过内存管理单元 (MMU) 执行的——寄存器中的用户级地址与进入内存子系统的物理地址不同。与最近的 Intel CPU 上的 PAE 相同。在过去,英特尔 x86 的线性 20 位地址由 16 位段和偏移量组成。

    The largest integer the CPU can process in a single instruction



    这个很接近 - 但同样有异常(exception)。这里和那里有两个寄存器命令。 MIPS 具有 hi:lo - 一对专用的 32 位寄存器,可以充当单个 64 位寄存器。英特尔有在 xDX:xAX 对上运行的命令。不要让我开始使用 SIMD。

    Largest piece of data that can be transferred to and from the working memory in a single operation



    ARM 具有“加载多个”和“存储多个”命令,可以一次存储多达 16 个寄存器。英特尔有 PUSHA/POPA。在物理层面上,内存总线也各不相同。

    肮脏的小事实是,在它出现的书籍和使用它的汇编程序的上下文之外,没有一个真正的单词定义。在 Intel 上,“word”从远古时代就用来表示一个 16 位的 block ;随着 CPU 变成 32 位和 64 位,它们保留了定义,现在我们谈论的是 DWORD 和 QWORD。现代 64 位 Intel CPU 上的寄存器是 QWORD 大小的。 Windows API 不再是严格意义上的 Intel,它是在 16 位 Intel 上诞生的,并且仍然保留数据类型。 WORD在 windows.h 中定义为无符号短(2 字节),并且他们永远无法更改它 - 这会破坏结构布局,因此会破坏二进制格式,适用于任何地方的每个人。

    另一方面,在 ARM 上,“字”表示 32 位,即使在 AArch64 指令集的上下文中也是如此。所以有像“加载半字”这样的汇编命令可以处理 16 位操作数。因此,当在 ARM(即 Windows Phone、Windows RT、Windows CE/Mobile)上为 Windows 编写 C 语言并为其进行汇编时,您必须记住两个不同的定义。幸运的是,考虑到模棱两可的情况,没有人会用文字来思考——至少在不将真实大小留在脑海中的情况下是这样。此外,ARM 的汇编语言强烈鼓励尽可能多地使用 32 位值,必要时提升 16 位变量。因此,即使是函数的 16 位参数也在内部作为 32 位寄存器传递。

    关于assembly - 字长及其适应症,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20523016/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com