- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。
在此示例中,EAX
是一个 32 位寄存器,如果我们调用 AX
它应该返回前 16 位,如果我们调用 AH
> 或 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
真正具有什么值(value)?
最佳答案
不,这不太正确。
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 位模式下访问:Assembly registers in 64-bit architecture
<小时/>由于历史原因,写入 AL、AH 或 AX 会使完整 AX/EAX/RAX 中的其他字节保持不变。例如,它必须将新的 AL 合并到完整的 RAX 中。 (在 32 位或 64 位代码中,如果您不特别希望进行此合并,则首选 movzx eax, byte [mem]
或 movzx eax, word [mem]
加载:Why doesn't GCC use partial registers?)
将 EAX 零扩展写入 RAX。 (Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?)
同样,所有这些都适用于每个寄存器,而不仅仅是 RAX。例如写入 DI 或 DIL 会合并到旧的 RDI 中,写入 EDI 会进行零扩展并覆盖完整的 RDI。对于 R10B 或 R10W 写入合并也是如此,写入 R10D 使 R10 独立于旧的 R10 值。
关于assembly - AX、AH、AL如何映射到EAX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15191178/
我正在慢慢尝试进入 osdev 只是为了玩。 This tutorial有一个等待驱动器准备就绪的组件: reset_drive: mov ah, 0 int 13h or ah,
我试图理解一个程序来获取箭头键。 这是代码: int getkeys( ) { union REGS i,o; while(!kbhit( ));
我不小心删除了我的一个 GAE 项目(用 Go 编写)中的 ah-builtin-datastoreservice 和 ah-builtin-python-bundle 这两个版本。这意味着我的自动备
我对x86寄存器的理解是,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器。 在此示例中,EAX 是一个 32 位寄存器,如果我们调用 AX 它应该返回前 16 位,如果我们调用
我正在尝试学习汇编并编写引导程序。以下代码将软盘驱动器的内容加载到内存中并跳转到它(从地址0x1000开始加载)。该代码应该在屏幕上打印“ X”,但是由于某种原因它会打印一个空格。有人可以告诉我怎么了
我的信息来自here。作业要求读取一个不超过20个字符的程序,然后将这些字符转换为大写字母,然后将输入内容打印为大写字母。 我不知道如何从int21/AH = 0ah访问输入。除非我了解上面的链接,否
大部分汇编代码由以下指令终止 MOV AH, 4CH INT 21H “MOV AH,4CH”是什么意思? 最佳答案 DOS中断int 21/4Ch为EXIT-TERMINATE WITH RETUR
我的 Java 应用程序引擎已经运行良好几个月了。但最近两天,在执行/_ah/warmup 时,我看到了 5 个 HardDeadlineExceededError,现在是 34 个。 错误发生在简单
来自 https://www.felixcloutier.com/x86/div : ... temp ← AX / SRC; IF temp > FFH TH
我使用 GNU 汇编器和 AT&T 语法编写了我的第一个引导加载程序。假设将 hello world 打印到屏幕上,然后通知用户按任意键将导致重新启动。只有按下某个键后才会启动重新启动。我的引导加载程
我想获取我的硬盘的参数。使用描述的技术here . 这是显示软盘正常参数的代码: mov dl,00h mov ah,08h int 13h 这是代码,显示无效的硬盘参数(可能是我的硬盘空间很大(LB
我正在尝试将第一个硬盘驱动器的一个 block 读入内存。我尝试使用不同的 LBA,但它会将空间加载到缓冲区中。在下面的代码中,我添加了 for 循环,这样我就可以看到它是否加载了除空格之外的任何其他
我计划通过公共(public) VPS 提供商托管我的网络应用程序基础设施。由于 VPS 主机的专用网络可由其托管的所有 VPS 访问,并且许多基础设施组件没有任何类型的访问控制/身份验证,因此我需要
我正在使用 Bochs 2.4.5 编写引导扇区代码。我使用 INT 13H 从软盘读取扇区。但我发现如果要读取的扇区计数 > 72,则 INT13 将失败。返回码为 AH=1。下面是代码,这里是 I
我正在尝试实现应用程序内购买,而且似乎运行良好。当我尝试购买商品时,会出现带有价格的对话框。但是,当我将我的电子邮件帐户(或与开发者帐户没有任何关系的另一封电子邮件)放入“许可测试”列表中进行测试购买
我目前正在开发一个汇编程序,但我需要让程序每隔一段时间等待一次。 所以,我一直在使用 int 15h/ah = 86h,但出于某种原因,DosBox 给我带来了困难,程序要么与像素(奇怪的颜色)混淆,
在引导加载程序的第二阶段,我尝试将虚拟软盘上的一些扇区加载到 bochs 中的内存中。 ,但是在调用 int 0x13 时,例程不会返回。 我相信我的第二阶段的相关代码是: bootsys_start
我正在尝试在 x86 程序集中创建一个简单的命令系统。命令系统是第二阶段,加载于0x1000:0000。要查看我的引导加载程序,请单击 on this stackoverflow question .
我使用了第一个扇区中的所有内存,现在我想在第二个扇区(第二阶段)中存储一个新的变量字符串并打印它。例如: hello db 'Hello World' 新字符串应该位于另一个扇区中(因为第一个扇区中没
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!