二、寄存器

二、寄存器

2.1 通用寄存器

8086CPU寄存器是16位的,可以存放两个字节

通用寄存器:用于存放一般数据,有AX BX CX DX

AX――累加器(Accumulator),使用频度最高
BX――基址寄存器(Base Register),常存放存储器地址
CX――计数器(Count Register),常作为计数器
DX――数据寄存器(Data Register),存放数据

为了兼容之前8位的寄存器,所以将这四个寄存器各自一分为二:

AX = AH + AL

BX = BH + BL

CX = CH + CL

DX = DH + DL

其中ABCD是四个寄存器的编号,后面的H(high)代表高位,L(low)代表低位

分割后的寄存器都是8位的,例如:AH寄存器和AL寄存器都是八位的

分割的好处:

  • 可以存放两种尺寸的数据。一次性可以存储8位的数据,也可以存放16位的数据。

1)两条指令:

(1)把同位数十六进制数据/同类型同位数寄存器的值复制到寄存器中

mov 寄存器,同位数十六进制数据/同类型同位数寄存器
例如:
mov ax,1234
mov al,bh

(2)寄存器加法:

add 寄存器1,同位十六进制数据/同类型同位数寄存器2
例如:
add ax,1234
add ax,bx 

2)总结:

一致性原则:其中存放8位数据的称为字节数据,存放16位数据称为字型数据

问题:对数据处理时,比如加法,得到的结果超过了ax或者al会出现什么状况?

-a	//输入指令
mov al, ff
add al, 1
-t	//执行指令

结果是,溢出的位会直接被存到其他地方。

结论:寄存之间都是互相独立的,哪怕是分割的后的al和ah

练习题:

最多使用四条汇编指令,计算2的4次方

mov ax,2
add ax,ax
add ax,ax
add ax,ax

2.2 地址寄存器

段地址寄存器(SA): 偏移地址寄存器(EA)
在这里插入图片描述

8086CPU有20根地址总线,CPU的寻址能力0~FFFFH

由于该CPU的寄存器位数是16位,无法找到属于20位的地址,所以段地址寄存器和偏移地址寄存器之间通过“协议”(地址加法器)的计算后,达到20位的地址。

1)地址加法器:

  • 段地址*16 = 基础地址
  • 物理地址 == 段地址*16(10h)+偏移地址
  • 物理地址 == 基础地址 + 偏移地址

2)地址加法器测试:

e 2000:1f60	//修改该地址下的值,为1

在这里插入图片描述

**个人理解:计算机的地址总线>寄存器的位数,所以要想真正得到物理地址,就要通过地址加法器进行物理地址的映射。**满足物理地址映射公式的段地址:偏移地址都可以找到同一块物理地址对应的空间。

2.3 段寄存器

8086有四个段寄存器:CS 、DS、 SS、 ES

2.4 CS段代码和IP指令指针寄存器

8086CPU把cs:ip 地址对应的的内容当做读取汇编指令的起点(可以用来区分指令和数据)

1)体验把一个指定的地址对应的内容作为汇编指令来读取并执行:

在这里插入图片描述

2)总结:

CPU执行指令的步骤:

  1. 从cs:ip指向的内存单元读取指令,并送入指令缓冲区
  2. IP=IP+所读取指令的长度(字节大小),从而读取下一条指令
  3. 执行指令,回到第一步,重复这个过程

jmp指令(无条件跳转)的使用:

  • jmp 段地址:偏移地址 用段地址修改cs寄存器的内容,用偏移地址修改IP寄存器的内容
    • jmp 某一合法寄存器 用某一寄存器中的值来修改ip寄存器中的值

call指令:(将此时ip寄存器的值保存在内存中)

  • call 函数名(有条件转移)

当执行到ret指令后 ip = 内存中记录IP寄存器的值;返回并执行下一条指令

2.5 代码段

存在一组地址连续、起始地址为10H倍数的,可以认为是用来存放代码的段

例如:123B0H~123B9H

代码段的起始地址是123B0H/10H = 123BH,长度为10个字节

2.6 debug使用

常用指令:

  • r(register)查看、改变CPU寄存器的内容

    • r
    • r ax
  • d 查看内存中的内容

    • d
    • d cs:ip
  • e 改写内存中的内容

    • e cs:ip
      • e cs:ip “字符串” //将字符串中每个字符对应的ascii值写入cs:ip地址中
  • u 将内存中的机器指令翻译成汇编指令

    • u cs:ip
  • t 执行一条机器指令

    • t //默认执行cs:ip指向地址的机器指令
  • a 以汇编指令的格式在内存中写入一条机器指令

    • a
    • a cs:ip
      e cs:ip “字符串” //将字符串中每个字符对应的ascii值写入cs:ip地址中
  • u 将内存中的机器指令翻译成汇编指令

    • u cs:ip
  • t 执行一条机器指令

    • t //默认执行cs:ip指向地址的机器指令
  • a 以汇编指令的格式在内存中写入一条机器指令

    • a
    • a cs:ip

Guess you like

Origin blog.csdn.net/xiaoxiaoguailou/article/details/121076319