字大小及其指示

2024-04-17

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

先说几个事实(如有错误,请指正)。处理器架构的字长表示(编辑:其中一些是错误的,请参阅下面 Seva 的帖子):

  1. 每个寄存器的最大尺寸
  2. 每个内存地址的最大尺寸(可寻址的内存量)
  3. CPU在单条指令中可以处理的最大整数
  4. 在单次操作中可以与工作内存之间传输的最大数据块

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

这只会让我对单词及其含义(上面列出的)的整个理解崩溃。

谢谢你帮我弄清楚这件事的真相

Magnus

编辑 2:请参阅下面关于 x86 架构的两个有用链接。

  1. 正如 altie 所发布的:http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
  2. 我偶然发现的一个简单的 x86 指南:http://www.swansontec.com/sintel.html http://www.swansontec.com/sintel.html

所有这些假设都有反例。

每条指令的大小

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

每个寄存器的最大尺寸

你的意思是 -integer寄存器,对吗?例如,Intel 上的浮点寄存器的长度为 10 个字节。这是最接近的。但 Intel x86 是一个值得注意的例外——它对“字”的定义在 16 位 CPU 时代就已经固定了;随着 ISA 的发展,这个定义被保留了下来。

类似地,在 ARM 的 AArch64 指令集上下文中,“字”表示“32 位”,而通用寄存器是 64 位。 “字”的定义在 ARM 的 32 位鼎盛时期就被固定下来,并一直沿用至今。

每个内存地址的最大大小

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

CPU在单条指令中可以处理的最大整数

这个已经很接近了——但同样,也有例外。到处都有两个寄存器命令。 MIPS 有 hi:lo - 一对专用的 32 位寄存器,可以充当单个 64 位寄存器。 Intel 具有可在 xDX:xAX 对上运行的命令。别让我开始谈论 SIMD。

在单次操作中可以与工作内存之间传输的最大数据块

ARM有“加载多个”和“存储多个”命令,最多可以一次性存储16个寄存器。 Intel有PUSHA/POPA。在物理层面上,内存总线也有所不同。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字大小及其指示 的相关文章

  • C/C++ 中的简单“Hello World”内联汇编语言程序

    我使用 devcpp 和 borland c 编译器 asm mov ax 4 I O Func mov bx 1 Output func mov cx name address of the string mov dx 6 length
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 在汇编中显示两位数? [复制]

    这个问题在这里已经有答案了 我对汇编编程完全陌生 在课堂作业的示例中 需要将两个数字相加并显示总和 我发现神秘的是当其是两位数时显示总和 这是我的代码 mov al num1 mov bl num2 add al bl add ax 303
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • CPU缓存:两个地址之间的距离是否需要小于8字节才能具有缓存优势?

    这似乎是一个奇怪的问题 假设缓存行的大小为 64 字节 此外 假设 L1 L2 L3 具有相同的缓存行大小 this https stackoverflow com a 15333156 8385554帖子说英特尔酷睿 i7 就是这种情况
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r

随机推荐

  • 如何等到File.Exists?

    我有一个应用程序 正在侦听所选文件夹中的 log 文件 我用了FileSystemWatcher 但有一个问题 负责制作该文件的另一个应用程序采取以下步骤 制作一个 gz 文件 解压到txt文件 一些随机文件名 将 txt 名称更改为带有
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创
  • JavaScript 中是否可以从子类导入父模块?

    我有两个带有自己模块的文件 Sub js and 父 js 父 js import Sub from Sub js export default class Parent static createSomething new Sub Sub
  • 保存和读取 Integer Firestore Android

    我正在尝试为我的 Android 游戏创建一个简单的统计活动 我正在使用新的 Firestore 数据库 我已经能够将文档保存到我的 Firestore 数据库中 其中包含总分数 最近分数 平均分数 总游戏数和高分 但是当我尝试从数据库读回
  • 用于下载文件的 S3 模块在 ansible 中不起作用

    这是为从 S3 存储桶 artefact test 下载文件而编写的 ansible 代码 name Download customization artifacts from S3 s3 bucket artefact test obje
  • R 中 foreach() 内的 try() 问题

    我正在尝试使用try 函数来处理并行 for 循环中发生的错误 results lt foreach i 1 2 errorhandling remove dopar res lt try myfun i TRUE with myfun l
  • clang:自定义属性在 AST 中不可见

    我按照官方手册中的描述在 clang 中实现了一个自定义属性 http clang llvm org docs InternalsManual html how to add an attribute http clang llvm org
  • VBA代码导入

    我有一个用 excel 做的 VBA 项目 我将有许多工作簿将使用相同的代码 并且如果我进行更改 我不想将代码复制到所有工作簿 是否有办法将代码放在一个中心位置 然后让所有工作簿访问该代码 是的 你有两个选择 1 将代码复制并粘贴到个人工作
  • 按钮触发单击事件两次

    似乎有时 但并非总是 我的按钮单击事件被触发两次 事实上 这种情况似乎有时会发生 但并非总是如此 这让我很困惑 这是我的按钮
  • 如何使用 PHP 获取表单身份验证票证的内容

    我需要在 PHP 中撤消以下 ASP Net 进程 以便可以获取票证中的用户名和到期日期 我已经解密了 3DES 加密 下面的步骤 3 但我不确定下一步需要做什么 解密得到的字符串是字节数组吗 我应该能够将其转换为ascii 吗 因为事实并
  • 如何访问symfony2全局帮助函数(服务)中的服务容器?

    这个问题一开始我不明白为什么我不能将变量传递给 symfony2 全局辅助函数 服务 但是感谢比我更聪明的人 我意识到我的错误是尝试在一个类中使用 security context 而该类没有没有注射所以 这是最终的结果 即有效的代码 我没
  • 最顶部和最底部的水平分隔线未显示在 ListView 中

    我正在使用列表视图 但最顶部和最底部的水平条不显示 为什么 我正在使用这个 android divider android drawable divider horizontal bright 添加虚拟页脚和页眉 listViewConta
  • 按月分组的 SQL 结果

    我正在尝试返回滚动 12 个月期间的一些结果 例如 MONTH IN OUT January 210 191 February 200 111 March 132 141 April 112 141 May 191 188 etc 如何将结
  • 在 Go 模板中使用包含内部范围 (helm)

    我有一个模板 可以使用以下命令渲染多次range迭代 我可以访问变量外部变量 例如 Release Name没有问题 但是 当我包含模板时 我无法让它工作 range key val Values resources annotations
  • jQuery 每个都返回 [object Object]

    我的问题是 html 变量返回如下所示的内容 object Object object Object object Object object Object object Object 而不是元素 我应该做什么不同的事情 var html
  • SwiftMailer 不发送邮件,为什么?

    SwiftMail 不发送我的电子邮件 而mail 确实有效 与 一样here https stackoverflow com questions 3552937 swiftmailer wont send mail but mail wi
  • mongodb,复制和错误:{“$err”:“不是master和slaveOk = false”,“code”:13435}

    我第一次尝试 mongo 副本集 我在 ec2 上使用 ubuntu 并启动了三个实例 我使用了每个实例的私有 IP 地址 我选择作为主要的 下面是代码 mongo host Private IP Address rs initiate r
  • 在 Go 泛型中,如何对联合约束中的类型使用通用方法?

    我试图了解 Go 泛型 v1 18 中类型联合约束的用法 这是我尝试过的代码 type A struct type B struct type AB interface A B func a A some bool return true
  • 配置Tomcat使用属性文件加载DB连接信息

    创建从属性文件读取配置参数的 Tomcat 部署的可接受做法是什么 如果能够提供 WAR 文件并指定客户端只需在特定目录中创建或编辑属性文件 那就太好了 这是一种比较常规的做事方式吗 还有比这更好的方法吗 我们经常通过提供 WAR 和 Co
  • 字大小及其指示

    请参阅下面关于各种指令集架构中的字长以及它与汇编语言的关系的问题 感谢您提供的所有帮助 先说几个事实 如有错误 请指正 处理器架构的字长表示 编辑 其中一些是错误的 请参阅下面 Seva 的帖子 每个寄存器的最大尺寸 每个内存地址的最大尺寸