汇编(三)——关于寄存器的操作
汇编(三)
一、通用寄存器
AX、BX、CX、DX
1 byte = 8 bit
2 byte = 16 bit
0000 0000 0000 0000 ~ 1111 1111 1111 11111
他们可以各自分为2个8位寄存器
AX = AH*AL
BX = BH*BL
CX = CH *CL
DX = DH*DL
为什么存在通用寄存器?
1.因为为了兼容之前的8位寄存器,保证之前的程序,稍加修改就可以运行在8086CPU上
2.内存最小单元 8 bit
CPU从内存中读取一个字节 8 bit字节的数据
8位数据 -> 8位寄存器中
16根数据线
8086CPU一次性可以处理 2种尺寸的数据
字节型数据 byte 8bit 8位寄存器中
字型数据 2byte 16bit 16位寄存器中 2个字节
一个字节是高位数据,一个是低位
二、加深对AX、BX、CX、DX印象
mov ax,5
mov ax,0
mov al,5
按下r查询,按下t执行
分析下面命令
mov ax,4E20
mov bx,ax
mov ch,bl
mov cl,bh
mov dl,ch
mov ax,dx
16位寄存器和8位寄存器不能互相移动
mov ax,bl 不行,不能将8位数据移动到16位寄存器中
mov al,bx 不行,不能将16位数据移动到8位寄存器中
问题:我们使用数据处理加法,超过了al或者bx,那么是报错还是?
mov ax,18
mov bx,8
add ax,5
add 加法指令 类似C中的+=
8位寄存器进行8位计算,保存8位数据,如果超过了,那么保存在其他地方了,并没有消失
三、监测点2.1
写出每条指令执行后相关寄存器的值
mov ax,62627
mov ah,31H
mov al,23H
add ax,ax
mov bx,826cH
mov cx,ax
mov ax,bx
mov ax,bx
mov al,bh
mov ah,bl
mov ah,bh
mov ah,ah
mov al,6
四、地址寄存器
段地址寄存器,偏移地址寄存器
ds sp
es bp
ss si
cs di
lp
bx
- cs code Segment
- ds data segment
- ss stack segment
- es extra segment
8086 CPU 给了20根地址线
0000 0000 0000 0000 ~ 1111 1111 1111 1111
0 ~ FFFFF H
地址线的数量,决定了CPU的寻址能力
地址加法器 地址的计算方式
段地址 * 16 + 偏移地址 = 物理地址
段地址 * 16 = 基础地址
基础地址 + 偏移地址 = 物理地址
段地址:偏移地址
段地址 偏移地址
F230H*10H C8H
练习:
我们对地址进行修改并且查看,之后发现我们的地址确实修改了,我们也可以转换为其他地址进行修改
d 2001:1F60//查看地址
e 2001:1F60//修改地址
五、监测点2.2
段地址*10H + 偏移地址 = 物理地址
1.段地址为0001H,仅通过变化偏移进行寻址,CPU寻址范围为()~()
基础地址10H
偏移地址0~FFFFH
物理地址为10H~1000FH
2.计算SA
SA * 10H + FFFFH = 20000H
所以SA计算是小数,所以,不能首先确定逻辑地址
六、CPU如何区分指令与数据
u指令 将某个内存地址,全部当做指令
d指令 将某个内存地址,全部当做数据
r指令 查看寄存器
CS寄存器 IP寄存器
CS:code Segment
ip:instrument pointer
七、加深CPU如何区分指令和数据印象
将上面的机器码,用e指令,输入到2000H中,修改cs和ip指向2000H:0中,然后即可执行
机器码 汇编指令
b8 20 4e mov ax,4E20
05 16 14 add ax,141
bb 00 20 mov bx,2000H
01 d8 add ax,ax
89 c3 mov bx,ax
01 d8 add ax,bx
b8 1a 88 mov ax,001AH
bb 26 00 mov bx,0026H
00 d8 add al,bl
00 dc add ah,bl
00 c7 add bh,al
b4 00 mov ah,0
00 d8 add a1,b1
04 9c add a1,9c
八、IP寄存器和指令的关系
指令都是有长度的 一条指令可以由多个字节构成
指令的执行过程
- CPU 从 CS : IP 进行读取指令,存放到缓存器中
- IP = IP + 所读指令长度
- 执行指令缓存器中的内容,回到第一步