博客
关于我
x86 汇编 寄存器
阅读量:224 次
发布时间:2019-02-28

本文共 1505 字,大约阅读时间需要 5 分钟。

X86 汇编寄存器与寻址方式

在 x86 汇编中,寄存器是 CPU 用于临时存储数据和程序计数器的特殊内存单元。以下是 x86 汇编中常见的寄存器类型及其作用。

1. 寄存器分类

  • 数据寄存器:包括 EAX、EBX、ECX、EDX。

    • EAX:累加器,用于乘法、除法和其他算术运算。
    • EBX:基地址寄存器,存储内存中数据段的起始地址。
    • ECX:计数器,用于循环控制和位操作中的位移。
    • EDX:数据寄存器,用于存储操作数和 I/O 端口地址。
  • 变址和指针寄存器:ESI 和 EDI。

    • ESI:源索引寄存器,用于存储段内偏移量。
    • EDI:目标索引寄存器,用于存储段内偏移量。
  • 指针寄存器:ESP 和 EBP。

    • EBP:基指针寄存器,用于存取堆栈中的数据。
    • ESP:堆栈指针寄存器,用于存取堆栈顶部的数据。
  • 段寄存器:包括 ES、CS、SS、DS、FS 和 GS。

    • ES:附加段寄存器,用于存储附加段的段值。
    • CS:代码段寄存器,用于存储代码段的段值。
    • SS:堆栈段寄存器,用于存储堆栈段的段值。
    • DS:数据段寄存器,用于存储数据段的段值。
    • FS 和 GS:用于存储附加数据段的段值。

2. 寄存器的使用

  • 数据寄存器

    • 数据寄存器的 16 位可以分割成 8 个 8 位寄存器(如 AX: AH-AL、BX: BH-BL 等),程序员可灵活处理数据。
  • 基地址寄存器

    • BX 主要用于存储内存中数据段的基地址,其他寄存器如 SI 和 DI 可以作为偏移寄存器,配合使用。
  • 计数器寄存器

    • ECX 和 EDX 在循环和位操作中发挥重要作用,ECX 用于重复指令和 LOOP 指令,EDX 用于存储除法运算的余数。
  • 指针寄存器

    • EBP 和 ESP 是通用寄存器,可用于存储算术逻辑运算结果和运算数,用于堆栈操作。

3. 寻址方式

在 x86 汇编中,内存寻址可通过间接寻址、相对寻址、基址加变址寻址等方式实现。以下是常见的寻址方式:

4. 间接寻址
  • 定义:操作数的有效地址位于 SI、DI、BX 或 BP 寄存器中。默认段寄存器为 DS(SI 和 DI)或 SS(BP)。
  • 示例
    mov ah, [bx]mov ah, cs:[bx]
5. 相对寻址
  • 定义:操作数的有效地址由基址寄存器(BX、BP)和变址寄存器(SI、DI)加上 8 位或 16 位的位移组成。位移常量采用补码表示。
  • 示例
    mov ah, [bx+6]
6. 基址加变址寻址
  • 定义:操作数的有效地址由基址寄存器(BX、BP)和变址寄存器(SI、DI)组成。默认段寄存器为 SS(BP)或 DS(SI 和 DI)。
  • 示例
    mov ah, [bx+si]
7. 相对基址加变址寻址
  • 定义:操作数的有效地址由基址寄存器(BX、BP)和变址寄存器(SI、DI)加上 8 位或 16 位的位移组成。默认段寄存器为 SS(BP)或 DS(SI 和 DI)。
  • 示例
    mov ax, [bx+di-2]

4. 寻址原则

  • 段寄存器的作用:段寄存器决定了内存单元的物理地址范围。默认段寄存器为 DS(SI 和 DI)或 SS(BP)。
  • 寄存器间接寻址:使用 BX、SI、DI、BP 寄存器来间接访问内存单元。
  • 位移的补码表示:8 位和 16 位的位移常量采用补码表示,并扩展到 16 位。

5. 示例

  • 间接寻址
    mov ax, [bx]
  • 相对寻址
    mov ax, [bx+6]
  • 基址加变址寻址
    mov ax, [bx+si]
  • 相对基址加变址寻址
    mov ax, [bx+di-2]

通过以上寄存器和寻址方式,汇编程序能够高效地访问内存单元,实现数据的读写和操作。

转载地址:http://ijzp.baihongyu.com/

你可能感兴趣的文章
PyQt QToolButton在焦点时不更新图标
查看>>
PyQt 正确使用 emit() 和 pyqtSignal()
查看>>
PyQT-将文件复制到剪贴板
查看>>
PYQT.如何在QTableView中插入小部件
查看>>
PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
查看>>
PyQt4 到 PyQt5 ->mainFrame() 已弃用,需要修复才能加载网页
查看>>
PyQt4, class:mouseButtons用法
查看>>
PyQt4参考文档
查看>>
PyTorch Lightning:通过分布式训练扩展深度学习工作流
查看>>
PyQt5 - QThread:在线程仍在运行时被销毁
查看>>
PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
查看>>
PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
查看>>
PyQt5 QLCNumber 没有更新
查看>>
PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
查看>>
PyQt5 从 PyQt4 转换信号代码
查看>>
PyQt5 和 asyncio:从永不完成的收益
查看>>
PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
查看>>
PyQt5 按钮运行功能和更新 LCD
查看>>
pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
查看>>
pyqt5 设置控件在最上层或者在下层
查看>>