《x86汇编语言》学习11 指令的格式及其操作尺寸

如题所述

x86汇编语言深度解析:指令格式与操作尺寸对比


在x86架构中,指令操作尺寸的定义是至关重要的,它决定了操作数的长度和有效地址的范围。让我们深入探讨16位与32位处理器的指令特性。


16位处理器:操作尺寸与实例

在16位处理器如8086和80286中,指令操作数通常为8/16位,有效地址固定为16位。以经典的指令为例:



    8086: mov al, cl —— 8位寄存器操作,add dx, [bx] —— 16位地址操作,push dx —— 16位值入栈。
    80286: 与8086类似,只是在实模式和保护模式中,尽管操作数和地址保持16位,但处理模式有所差异。

总结来说,16位处理器的指令设计在处理16位数据时表现出较高的效率。


32位处理器的扩展

32位处理器与16位相比,提供了显著的处理能力提升。从80386开始,32位处理器兼容16位架构,拥有更大的32位寄存器和地址线。其指令支持更为灵活的操作数尺寸,如8/16/32位,并且内存地址可为16/32位。


32位指令示例

    mov al, cl —— 8位寄存器操作
    mov cx, dx —— 16位寄存器操作
    mov eax, edx —— 32位寄存器操作
    涉及32位偏移量的指令 —— 如:内存地址根据寄存器16/32位区分。

在实模式和保护模式下,指令执行方式略有不同,但实模式中段界限限制了内存访问范围。通过一些实际操作演示,如测试代码中的偏移边界检查,我们可以看到不同尺寸操作的潜在影响。


指令格式与细节

指令格式在x86汇编中复杂且精细,操作码如'hlt'(F4)和'cli'(FA)等。例如,mov al, 3 的机器码为 B003,需要理解ModRM寻址方式和偏移量在指令编码中的作用,如 8B/r 和 88/r。


深入剖析

    8B指令:内存传至寄存器,如 8B BX+8偏移,操作码8B, ModR/M 47
    C7指令:涉及偏移量和立即数,如 C7 40, 03 AA55 —— 1字操作,机器码 031458

在某些情况下,复杂的指令可能需要处理1或4字节的偏移量,且指令可能需要通过前缀调整操作尺寸。


尺寸选择与模式切换

处理器默认支持16位或32位操作,可通过指令前缀(如66/67)或bits伪指令进行尺寸设置。在保护模式下,GDT和D位的使用决定着默认尺寸的变更。


保护模式示例

代码段描述符为保护模式的代码提供了清晰的定义,例如32位代码段的起始地址和权限。通过GDTR设置,界限值从15增大到23,允许更广泛的数据访问。


指令执行路径
- 加载GDT
- 修改CS描述符(子选择器和IP)
- 转移至保护模式下的目标地址


指令选择与尺寸影响

描述符表的选择、尺寸的设定,以及后续指令的执行,都显示了尺寸选择对程序执行路径的关键影响。


学习资源

对于深入学习x86汇编语言,推荐参考在线资源如 《X86汇编语言 - 网易云课堂》,以获取更全面的指导和实践。

温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜