[汇编语言] -- 寄存器

2年前 (2022) 程序员胖胖胖虎阿
254 0 0

本文基于16位CPU。

常用的寄存器

16位CPU寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、ES、CS、SS、DS、ES、PSW

  • 4个数据寄存器(AX、BX、CX和DX)
  • 2个变址寄存器(SI和DI) 2个指针寄存器(SP和BP)
  • 4个段寄存器(ES、CS、SS、DS)
  • 1个指令指针寄存器(IP) 1个标志寄存器(PSW)

32位CPU寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP、ES、CS、SS、DS、FS、GS、EIP、EFlags

  • 4个数据寄存器(EAX、EBX、ECX和EDX)
  • 2个变址寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
  • 6个段寄存器(ES、CS、SS、DS、FS和GS)
  • 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

32位CPU对应32位的寄存器,对低16位数据的存取,不会影响高16位的数据。

[汇编语言] -- 寄存器

数据寄存器

  • 寄存器AX又称为累加器(Accumulator)用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
  • 寄存器BX又称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
  • 寄存器CX又称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
  • 寄存器DX又称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

说明:H(high)即高位,L(low)即低位

  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

[汇编语言] -- 寄存器

字节(byte):一个字节由8个bit组成,可以存在8位寄存器中;
字(word):一个字由2个字节组成,这两个字节分别被成为高位字和地位字
一个字可以存在一个16位寄存器中

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

16位CPU结构和物理地址

16位CPU结构有如下特征:

  • 运算器一次最多处理16位的数据;
  • 寄存器的最大宽度是16位
  • 寄存器和运算器之间的通路位16位
    [汇编语言] -- 寄存器

对于16位CPU:物理地址=段地址x16+偏移地址

123C8H : 1230*16+00C8 即  12300+00C8 = 123C8H(H表示16进制表示,B表示2进制)

可以用不同的段地址和偏移地址形成同一个物理地址

段寄存器

  • CS——代码段寄存器(CodeSegmentRegister),其值为代码段的段值;
  • DS——数据段寄存器(DataSegmentRegister),其值为数据段的段值;
  • SS——堆栈段寄存器(StackSegmentRegister),其值为堆栈段的段值;
  • ES——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值;
  • FS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值(32位CPU新增);
  • GS——附加段寄存器(ExtraSegmentRegister),其值为附加数据段的段值(32位CPU新增);

变址寄存器

SI 存储器指针、串指令中的源操作数指针
DI 存储器指针、串指令中的目的操作数指针

指针寄存器

寄存器EBP、ESP称为指针寄存器(PointerRegister),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指令指针寄存器

IP(InstructionPointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。

标志寄存器

CS与IP

  • CS与IP的作用

    CS:IP提供了CPU要执行指令的地址。从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
    [汇编语言] -- 寄存器

  • 修改CS与IP的值

    mov 指令不能用于设置CS、IP的值

"jum 寄存器"功能:用寄存器的值修改IP

读取一条指令后IP中的值会自动增加,让CPU可以读取下一一条指令。即IP=IP+所读取指令的长度,从而指向下一条指令

[汇编语言] -- 寄存器

例:

jmp ax, //指令执行前: ax=1000H, CS=2000H,IP=0003H
        //指令执行前: ax=1000H,CS=2000H,IP=1000H

DS和[address]

版权声明:程序员胖胖胖虎阿 发表于 2022年11月6日 上午8:16。
转载请注明:[汇编语言] -- 寄存器 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...