二、寄存器
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执行指令的步骤:
- 从cs:ip指向的内存单元读取指令,并送入指令缓冲区
- IP=IP+所读取指令的长度(字节大小),从而读取下一条指令
- 执行指令,回到第一步,重复这个过程
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地址中
- e 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