AX、AH、AL如何映射到EAX?

2023-11-25

我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。

在这个例子中EAX作为一个 32 位寄存器,如果我们调用AX它应该返回前 16 位,如果我们调用AH or AL它应该返回 16 位之后的接下来的 8 位,并且AL应返回最后 8 位。

所以我的问题是,因为我并不真正相信这就是它的运作方式。如果我们存储 32 位值EAX存储:

0000 0100 0000 1000 0110 0000 0000 0111

所以如果我们访问AX它应该返回

0000 0100 0000 1000

如果我们读AH它应该返回

0000 0100

当我们阅读时AL它应该返回

0000 0111

它是否正确?如果这就是价值的作用AH真正持有吗?


不,这不太正确。

  • EAX是完整的 32 位值
  • AX是低 16 位
  • AL是低8位
  • AH是位 8 到 15(从零开始),AX 的上半部分

因此 AX 由 AH:AL 两半组成,并且本身是 EAX 的低半部分。 (EAX 的上半部分不能作为 16 位寄存器直接访问;如果您想访问它,可以移位或旋转 EAX。)

x86-64 CPU 将整数寄存器扩展到 64 位:

  • RAX是完整的 64 位值,EAX 及其子组件映射到低 32 位。 64 位寄存器的上半部分只能在 64 位模式下访问,这与 32 位寄存器不同,32 位寄存器可以在支持它们的 CPU 上以任何模式使用。

所有这些也适用于 EBX/RBX、ECX/RCX 和 EDX/RDX。其他寄存器如 EDI/RDI 有一个 DI 低 16 位部分寄存器,但没有高 8 部分,并且低 8 DIL 只能在 64 位模式下访问:64 位架构中的汇编寄存器


写入 AL、AH 或 AX 会使完整 AX/EAX/RAX 中的其他字节保持不变,由于历史原因。例如,它必须将新的 AL 合并到完整的 RAX 中。 (在 32 位或 64 位代码中,更喜欢movzx eax, byte [mem] or movzx eax, word [mem]如果您不特别想要此合并,请加载:为什么 GCC 不使用部分寄存器?)

将 EAX 零扩展写入 RAX. (为什么 32 位寄存器上的 x86-64 指令会将整个 64 位寄存器的上部清零?)

再次强调,所有这些都适用于每个寄存器,而不仅仅是 RAX。例如写入 DI 或 DIL 会合并到旧的 RDI 中,写入 EDI 会进行零扩展并覆盖完整的 RDI。对于 R10B 或 R10W 写入合并也是如此,写入 R10D 使 R10 独立于旧的 R10 值。

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

AX、AH、AL如何映射到EAX? 的相关文章

  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • AVX-512CD(冲突检测)与原子变量访问有何不同?

    所以我在看他们展示了如何 void Histogram const float age int const hist const int n const float group width const int m const float o
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 使用 (float&)int 进行类型双关可以正常工作,(float const&)int 会像 (float)int 一样转换吗?

    VS2019 发布 x86 template
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • Visual Studio 2012 本机 C++ DLL x86 编译

    我最近将我的工具集从 Win 7 x86 Visual Studio 2010 升级到 Win 8 x64 Visual Studio 2012 但是 现在我的本机 C dll 编译为 x64 而不是 x86 除了将代码移至新操作系统并将其
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 使用 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在模块化

随机推荐

  • 运行“flutter Upgrade”后出错

    运行后出现以下错误flutter upgrade 由于 sdk 中的 flutter test 的每个版本都依赖于路径 1 5 1 而 flutter advanced networkimage gt 0 2 9 1 依赖于路径 1 6 0
  • 选择时更改 TabLayout 中选项卡上的图像

    我正在使用设计选项卡布局
  • 如何在 aws lambda 机器上安装 ffmpeg?

    我正在尝试在使用 ffmpeg 的 AWS lambda 上运行节点 js 脚本 为此 我需要在计算机上安装 ffmpeg 我浏览了文档 但找不到如何连接到运行 lambda 的机器 这在 Python 中对我有用 获取 ffmpeg 的静
  • 导入/加载带块的库

    情况 我正在尝试使用 Webpack 加载库 该库本身已使用 Webpack 分成多个块 项目 A 依赖于项目 B 项目 B 是使用 Webpack 构建的 由多个块组成 项目 A 现在通过动态导入加载项目 B 当项目 A 构建时 我希望在
  • 如何更改 UITableViewCellStyleValue2 单元格上标签的大小? (UITableView iPhone)

    我在应用程序的 UITableView 中使用 UITableViewCellStyleValue2 单元格 我希望左列 蓝色文本 self textField 比默认值窄得多 我尝试在创建单元格后设置 self textField bou
  • Javascript 不上传二进制数据

    我的 javascript 函数只能正确上传文本文件 有人能帮我弄清楚如何让它也接受图像等吗 function fileUpload files if files length fileList innerHTML p No files s
  • 使用 Google Geolocation API 通过 MAC 地址对 802.11 接入点进行地理定位

    大多数浏览器现在都内置了对 Google 地理定位 API 的支持 他们通过向 Google 发送附近 802 11 接入点 其信标被您的计算机捕获的那些接入点 的 MAC 地址来实现这一点 我从不同位置捕获了大量 802 11 数据包 我
  • JSON.net:如何在不使用默认构造函数的情况下反序列化?

    我有一个类 它有一个默认构造函数和一个接受一组参数的重载构造函数 这些参数与对象上的字段匹配并在构造时分配 此时我需要默认构造函数用于其他目的 因此如果可以的话我想保留它 我的问题 如果我删除默认构造函数并传入 JSON 字符串 则对象会正
  • AVFoundation - 为视频添加模糊背景

    I am working on a video editing app in Swift In my case my output video looks like as following I am trying to fill the
  • 很好地在 gulp 任务中抛出错误

    我正在创建一个在某些情况下可能会失败的 gulp 任务 gulp task favicon function try require child process execSync icotool version catch e var er
  • 如何使用 sed 删除 \r 字符

    很简单 我有一个文件 每个换行符处都有 r n aaaa r nbbbb r ncccc 我想删除 r 字符 同时保留 n 我可以在 python 中轻松完成此操作 但使用简单的 sed 命令似乎更优雅 这可能吗 什么表达方式可以达到这个目
  • 如何使用 JavaScript 从电子邮件地址中提取用户名?

    鉴于以下电子邮件地址 电子邮件受保护 如何使用 javascript 从地址中提取某人 谢谢 正则表达式与匹配 有安全检查 var str email protected var nameMatch str match var name n
  • 我可以避免使用 JSSE 在命令行上输入密钥存储密码吗?

    我们正在使用 Maven 2 并拥有一个通过 SSL 客户端身份验证保护的 Maven 存储库管理器 为了使 Maven 能够访问存储库 必须将以下系统属性传递给 Java javax net ssl trustStore trust jk
  • 表达式模板:提高表达式求值的性能?

    通过表达式模板技术 矩阵表达式如 D A B sin C 3 就计算性能而言 几乎相当于手写的for loop 现在 假设我有以下两个表达式 D A B sin C 3 F D E cout lt lt F lt lt n 在表达式模板的
  • 如何在 Mac 上设置 LD_LIBRARY_PATH/DYLD_LIBRARY_PATH

    On macos catalina echo VARIABLE I see the value of the variable but java couldn t read the system variable 在linux中没有问题 所
  • 当 JasperViewer 出现并关闭它时,主框架/父框架也关闭[重复]

    这个问题在这里已经有答案了 When a JasperViewer出现并关闭它 主框架 父框架也关闭了 如何防止这种情况发生 这是我的代码 private void cmdprintidMouseClicked java awt event
  • Gerrit身份验证:如何禁用匿名用户

    如何阻止匿名用户在 gerrit 中查看我的项目活动 我已经用谷歌搜索了足够多的内容 但找不到所谓的项目访问控制列表的确切文件 如果您想禁止匿名用户浏览 阅读 搜索某个项目的所有更改 您只需删除Read项目中匿名用户的权限 为了允许修改权限
  • JUnit assertEquals 更改字符串

    我有一个 JUnit 测试 如下所示 Test public void testToDatabaseString DateConvertor convertor new DateConvertor Date date convertor c
  • 静态变量的实际内存位置是什么?

    静态变量是在程序执行的整个过程中分配的 因此堆栈不会 堆也不方便 那么这个变量在哪里呢 难道不应该有一个地方可以加载它吗 我们的记忆中有3段 堆栈段 包含局部变量和引用变量 保存堆中对象地址的变量 堆段 包含运行时创建的所有对象 仅对象加上
  • AX、AH、AL如何映射到EAX?

    我对x86寄存器的理解是 每个寄存器都可以被整个32位代码访问 并且它被分成多个可访问的寄存器 在这个例子中EAX作为一个 32 位寄存器 如果我们调用AX它应该返回前 16 位 如果我们调用AH or AL它应该返回 16 位之后的接下来