7.02 通用寄存器

心得

# 通用寄存器
其中又分为4个数据寄存器:AX、BX、CX、DX
两个16位指针寄存器:SP、BP;
两个16位变址寄存器:SI、DI;
1个16为指令指针:IP
4个16位段寄存器:CS、DS、SS、ES
1个16位标志寄存器:FLAG

- 常用来寻址的寄存器:
BP、SI、DI、BX

- 常用来做累加器(故名思意:即不断的做加法保存数据)的寄存器:
AX

- 其中AX、BX、CX、DX可分为高字节与低字节
AX -> AH、AL两个8位寄存器
BX -> BH、BL
CX -> CH、CL
DX -> DH、DL

# debugger指令
r:查看当前所有寄存器的值
a: 向内存写入指令
t: 单步执行,一次执行一条指令

作业

# 作业答案如下:
1.写出每条汇编指令执行后相关寄存器中的值。(自己网上查阅相关汇编指令的含义和作用)
mov ax,62627  AX=AX=2627 # 在debugger里不能输入mov ax, 62627,会报错;只能输入mov ax, 2627

mov ah,31H   AX=?       
AX = 3127

mov al,23H   AX=?
AX = 3123

add ax,ax   AX=? 
AX = 6246

mov bx,826CH  BX=?
BX = 826C

mov cx,ax   CX=?
CX = 6246

mov ax,bx   AX=?
AX = 826C

add ax,bx   AX=?
AX = 04D8

mov al,bh   AX=?
AX = 0482

mov ah,bl   AX=?
AX = 6C82

add ah,ah   AX=?
AX = D882

add al,6    AX=?
AX = D888

add al,al   AX=?
AX = D810

mov ax,cx   AX=?
AX = 6246

# 这道题心得:其实这道题无非就是考察的当16位寄存器不能保存比16位大的的数的时候,会怎么做;
# 当保存的数目大于目标寄存器时,进位标志位会发生变化,然后寄存器只保留能保存的数字,进位数字就不在了,不清楚到底去哪了?我猜的是放到标志寄存器了,但是不知道怎么查看标志寄存器

2.只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 

- 目前学过的汇编指令?add,mov
# 因为 2^4 = 16,所以如下可以计算出 16
mov ax, 2
add ax, ax  # ax = 4
add ax, ax  # ax = 8
add ax, ax  # ax = 16

3.8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门的用途?哪些寄存器可以作为存储器寻址方式的指针寄存器?
# 首先能回答第哪些寄存器可以作为存储器寻址方式的指针寄存器?
两个变址寄存器:SI、DI;一个数据寄存器BX;一个指针寄存器BP;

# 以下两个答案都来源于:https://blog.csdn.net/small_fish__/article/details/7176410
# 8086/8088通用寄存器的通用性表现在何处?
这个是抄的网上的,因为毕竟目前对各个寄存器的使用较少,用多了应该就明白了;
这些寄存器除了各自规定的专门用途外,均可以用于传送和暂存数据,可以保存算术逻辑运算中的操作
数和运算结果;

# 8个通用寄存器各自有何专门的用途
8个通用寄存器的专门用途如下:
AX 字乘法,字除法,字I/O # 字即WORD类型,占2个字节,而AX寄存器刚好16位
BX 存储器指针
CX 串操作或循环控制中的计数器 # 串操作不知道是啥?后续应该会学
DX 字乘法,字出发,间接I/O # 感觉跟 AX 寄存器作用比较像
# 以下寄存器都没用过。。。
SI 存储器指针(串操作中的源指针)
DI 存储器指针(串操作中的目的指针)
BP 存储器指针(存储堆栈的指针)
SP 堆栈指针

4.从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可以访问的8位寄存器?
不清楚,还是查一查;
# 参考链接:https://blog.csdn.net/small_fish__/article/details/7176410
从程序员的角度看,8086/8088有14个可访问的16位寄存器;有8个可访问的8位寄存器;
看了答案,明白啥意思了,其中AX、BX、CX、DX寄存器都可以分高位字节和低位字节,分别
为AH、AL、BH、BL、CH、CL、DH,DL;

5.寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器AX的内容:(自己网上查阅相关汇编指令的含义和作用)

# 做这道题的时候我发现因为减法会涉及到负数,我感觉和标志位扯到关系,先查一查标志位相关资料

MOV AX,1234H # 此时AX为 1234
MOV AL,98H # 此时AX 为 1298
MOV AH,76H # 此时AX 为 7698
ADD AL,81H # 此时AX 为 7619,这里AX的低位字节进位了,进位标志位NC变成了CY
SUB AL,35H # 此时AX 为 76E4,SUB为减法指令
ADD AL,AH # 此时AX 为 765A
ADC AH,AL # 此时AX 为 D15A,ADC是带进位加法指令,它利用了CF位上记录的进位值,
# 接上一行,所以ADC AH,AL => AH = AH + AL + CF = 76 + 5A + 1 = D1,此时CF位恢复0(即NC)
ADD AX,0D2H # 此时AX 为D22C
SUB AX,0FFH # 此时AX 为 D12D

6、处理器的通用寄存器是否越多越好?通用寄存器不够用怎么办?
# 参考链接:https://blog.csdn.net/small_fish__/article/details/7176410
答:   处理器的通用寄存器并非越多越好,因为如果处理器的通用寄存器数量太多,势必
       造成处理器的成本增加,同时也增加了处理器设计的复杂度;
       如果通用寄存器不够用,应该采用内存中的存储单元代替,不过速度上要有所牺牲;
Last Updated:
Contributors: Hunter-0x07