执行指令和读/写数据时,x86 如何处理字节寻址和字寻址?

2023-12-03

所以我正在学习 x86 的工作原理,并且遇到过人们说它是字节寻址的,但可以读取字、双字等。 处理器如何决定使用哪种方法以及何时使用? 例如。为了访问下一条指令以及当用户想要读/写存储器时,使用哪种寻址模式?


每个内存访问都有一个由机器代码指令指定的操作数大小。(寻址模式不是正确的术语:不同的寻址模式是指定要访问的内存块的最低地址的不同方式,例如[rdi] vs. [rdi + rdx*8] vs. [RIP + rel32])

不同操作数大小的编码是通过前缀(16 位、32 位和 64 位整数指令)或相同助记符(8 位整数)的不同操作码来完成的。或者使用可使用 xmm、ymm 或 zmm 寄存器的 AVX / AVX512 指令的 VEX 或 EVEX 前缀中的位。

解码还取决于当前模式,即默认操作数大小:32 表示 32 位和 64 位模式,16 表示 16 位模式。 A66操作数大小前缀表示相反的大小。

在 64 位模式下,.WREX 前缀中的(宽度)位将操作数大小设置为 64 位。 (还有一些说明,例如push/pop默认为 64 位操作数大小,无需前缀,但大多数指令如add/sub/mov仍然默认为 32 位)

还有一个0x67地址大小前缀,将寻址模式交换为其他大小。 (16 与 32 或在 64 位模式下 64 -> 32。)


例如,mov [rdi], eax是一个双字存储,机器代码编码将通过在 16/32/64 位操作数大小的操作码上不使用特殊前缀来指定。 (看https://www.felixcloutier.com/x86/mov获取可用的编码。但请注意英特尔的手册doesn't提到66每个条目中的操作数大小前缀:它有 2 个相同的编码,但大小不同。你必须知道哪一个需要66基于当前模式默认值的前缀。)

16 位操作数大小如mov [rdi], ax将具有相同的机器代码66操作数大小前缀。

8 位操作数大小 (mov [rdi], al) 有自己的操作码,不需要前缀。

movzx / movsx有趣的情况是:内存访问大小与目标寄存器不同。内存访问大小(字节或字)由操作码指定。操作数大小前缀仅影响目标大小。 x86-64 除外63 /r movsxd(dword->qword 符号扩展) 其中66操作数大小前缀does将内存访问大小缩小到m16以匹配目的地。

SIMD 指令也类似;指令编码唯一地确定存储器访问大小以及读取或写入的寄存器。

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

执行指令和读/写数据时,x86 如何处理字节寻址和字寻址? 的相关文章

  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 标志寄存器中保留/未定义位的用途是什么?

    在 Z80 8080 8085 和 8086 处理器的标志寄存器中 被记录为 保留 或 未定义 的位 1 3 5 的用途是什么 这些位未使用 也就是说 没有指令明确地将它们设置为任何值 设计人员认为 5 6 个标志就足够了 他们只是将标志寄
  • PAE(物理地址扩展)如何实现大于4GB的地址空间?

    维基百科文章的摘录物理地址扩展 http en wikipedia org wiki Physical Address Extension x86 处理器硬件架构通过用于选择附加内存的附加地址线进行了增强 因此物理地址大小从 32 位增加到
  • 各种中断的区别:SCI、SMI、NMI、普通中断

    我正在学习英特尔架构 到目前为止我遇到过几种类型的中断 SCI 系统控制中断 硬件使用的系统中断 用于向操作系统通知 ACPI 事件 SCI 是一个有效 低电平 可共享的电平中断 SMI 系统管理中断 由遗留系统上的中断事件生成的操作系统透
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 难以理解汇编命令“加载有效地址”[重复]

    这个问题在这里已经有答案了 可能的重复 LEA 指令的目的是什么 https stackoverflow com questions 1658294 whats the purpose of the lea instruction LEA指
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • intfmt: db "%d", 10, 0 在汇编中的含义

    我最近在我的一个汇编文件的顶部看到了这个 并意识到我在打印整数的过程中花了很长时间使用它 而没有真正意识到它最初来自哪里 在我的基本汇编模板中使用 或 10 0 是什么结尾的意思是 section data intfmt db d 10 0
  • 嵌入式系统:使用汇编语言时的内存布局

    根据我的理解 嵌入式系统运行机器代码 有多种方法可以生成此代码 一种是用 C 等高级语言编写程序 然后使用编译器获得这样的代码 另一种方法是用汇编语言为该嵌入式系统编写指令 并使用汇编器将其转换为机器代码 现在我们得到了加载到系统并执行的机
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci

随机推荐

  • 使用内部 xml 节点和文本为节点创建 DTD

    我有非常简单的 XML 如下所示
  • 如何将命令行变量的值返回到立即窗口

    情况 我想从 Windows 命令提示符返回字符串变量的实际值 命令 cd C Users User Desktop Testfolder for f eol delims F in dir b od csv do set newest F
  • 在 Python 中读取单个字符(getch 样式)在 Unix 中不起作用

    每当我使用食谱时http code activestate com recipes 134892 我似乎无法让它发挥作用 它总是抛出以下错误 Traceback most recent call last old settings term
  • Jquery:查找文本并替换

    div p apple p p ball p p cat p p dogsss p div 我该如何改变dogsss to dollsss using jquery 您可以使用 each 循环遍历 p 元素 以及 text 更新文本 例如
  • Android M - 自定义权限对话框样式

    在实现新的 Android M 权限模型时 我注意到权限对话框不尊重 styles xml 的主题 在我的 styles xml 中 我重写对话框和警报对话框样式 如下所示
  • ECDH Nodejs 和 C# 密钥交换

    我迷失了自我 我需要帮助才能走上正确的方向 我有一个 Nodejs 服务器 它必须与用 C 编写的服务器交换一些关键数据 所以在这种情况下 我希望我的数据以某种方式加密 我正在考虑 AES 为了安全地交换密钥 我想使用 ECDH 但我不知道
  • Aptana 不会为类中的函数生成 phpdoc 块

    在 Aptana 中 我以某种方式破坏了为类中的函数自动生成 phpdoc 注释的功能 它似乎只影响我当前的项目 通常我可以在函数之前的行上输入 并按 Enter 键 Aptana 将使用正确的 param 值等创建一个 phpdoc 注释
  • Jupyter 中的内联动画

    我有一个 python 动画脚本 使用 matplotlib 的 funcAnimation 它在 Spyder 中运行 但不在 Jupyter 中运行 我尝试过遵循各种建议 例如添加 matplotlib inline 并将 matplo
  • 分配与全局变量同名的局部变量时出错

    将全局函数或局部封闭函数分配给同名的局部变量时 我看到错误 下面的代码说明了这个问题 其中f 运行良好 同时g 引发错误 看来 python 知道这一点a正在本地分配 因此它表示所有对a现在都是本地的 甚至之前的参考文献a实际上是本地分配的
  • 在 eclipse 中运行 scala 的配置

    嗨 我必须运行一个 scala 程序 我收到错误主类未找到 然后我打开首选项并在 scala 应用程序中 主类列未指定主类 你能告诉我我必须在该栏中填写什么才能运行我的程序吗 请帮助我 提前致谢 您能提供任何额外信息吗 我刚刚创建了一个 S
  • 递归对象和原子对象的定义是什么?

    R 文档 says is atomic回报TRUE if x是原子类型 或NULL and FALSE否则 is recursive回报TRUE if x有一个递归 list类似 结构 和FALSE否则 is atomic对于原子类型是正确
  • 如何反转 JavaScript 中的正则表达式?

    我有一个字符串 A 想测试另一个字符串 B 是否不属于它 这是一个非常 简单的正则表达式 其结果可以在之后反转 我可以做 foobar test email protected 然后反转它 如下所示 foobar test email pr
  • 为什么只有 1 行的 DataTable.Load 结果表现得好像是 DataRow 而不是 DataTable?

    我想查询不同服务器上的两个数据库以获取相同类型的信息 并将结果合并到一个列表中 我创建了这个示例 它可以工作 但前提是第一个服务器至少返回two rows 该示例使用整数列表 1 5 但我连接两个字符串列表的原始代码也存在相同的问题 qui
  • Mac OS X:我应该在哪里存储作为捆绑包提供的游戏的保存游戏?

    我正在将 Windows 游戏移植到 Mac OS X 我想知道应该在哪里存储游戏数据 例如保存的游戏 用户配置文件等 以及如何在 C 中以编程方式检索该路径 该游戏将按照规定作为 现代捆绑包 提供here 保存在下面 库 应用程序支持 您
  • 如何获得唯一的智能卡ID?

    我正在寻找一种方法来为我使用的每张智能卡找到唯一的号码 我听说每张卡都有唯一的 IC 制造日期 IC 序列号和 IC 批次标识符 我如何从我的卡中获取这些信息 当然 每个硬件供应商都会将上述信息集成到芯片中 不幸的是 这留下了以下问题 操作
  • (单元)测试 python 信号处理程序

    我有一个简单的 Python 服务 其中有一个无限执行某些操作的循环 根据各种信号 sys exit 0 被称为 这导致SystemExit如果可以的话 应该进行一些清理 在测试中 即标准unittest TestCase 我想测试此清理是
  • postgres 中索引元组的最大大小是多少?

    我引用的是https www postgresql org docs 11 sql createindex html关于INCLUDE clause 在向索引添加非键列 尤其是宽列 时保持保守是明智的做法 如果索引元组超过索引类型允许的最大
  • 如何关闭 show() 窗口但保持图形处于活动状态?

    如果我创建一个图形然后执行 plt close from matplotlib import pyplot as plt fig1 plt figure fig2 plt figure fig1 show plt close fig1 sh
  • 在chart.js中,如果从移动设备访问,是否可以隐藏条形图的x轴标签/文本?

    在chart js中 是否可以隐藏x axis如果从移动设备访问 则条形图的标签 文本 我想隐藏 删除标签x axis即 一月 二月 等 他们添加了这个选项 2 1 4 也许更早一点 有它 var myLineChart new Chart
  • 执行指令和读/写数据时,x86 如何处理字节寻址和字寻址?

    所以我正在学习 x86 的工作原理 并且遇到过人们说它是字节寻址的 但可以读取字 双字等 处理器如何决定使用哪种方法以及何时使用 例如 为了访问下一条指令以及当用户想要读 写存储器时 使用哪种寻址模式 每个内存访问都有一个由机器代码指令指定