复习时可以先不看答案,再把题目做一遍:
检测点2.1:
(1)写出每条汇编指令执行后相关寄存器中的值。
mov ax, 62627 ; AX=_______
mov ah, 31H ; AX=_______
mov al, 23H ; AX=_______
add ax, ax ; AX=_______
mov bx, 826CH ; BX=_______
mov cx, ax ; CX=_______
mov ax, bx ; AX=_______
add ax, bx ; AX=_______
mov al, bh ; AX=_______
mov ah, bl ; AX=_______
add ah, ah ; AX=_______
add al, 6 ; AX=_______
add al, al ; AX=_______
mov ax, cx ; AX=_______
(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
答案与解析:
(1)写出每条汇编指令执行后相关寄存器中的值。
序号 | 汇编指令 | AX | BX | CX |
---|---|---|---|---|
1 | mov ax, 62627 | F4A3H | - | - |
2 | mov ah, 31H | 31A3H | - | - |
3 | mov al, 23H | 3123H | - | - |
4 | add ax, ax | 6246H | - | - |
5 | mov bx, 826CH | 6246H | 826CH | - |
6 | mov cx, ax | 6246H | 826CH | 6246H |
7 | mov ax, bx | 826CH | 826CH | 6246H |
8 | add ax, bx | 04D8(al)H | 82(bh)6CH | 6246H |
9 | mov al, bh | 04(ah)82H | 826C(bl)H | 6246H |
10 | mov ah, bl | 6C82H | 826CH | 6246H |
11 | add ah, ah | D882H | 826CH | 6246H |
12 | add al, 6 | D888H | 826CH | 6246H |
13 | add al, al | D810H | 826CH | 6246H |
14 | mov ax, cx | 6246H | 826CH | 6246H |
注:
- 指令1中存入ax中的62627需转化为十六进制F4A3H,从而方便观察和计算:十进制整数转换为十六进制整数采用"除16取余,逆序排列"法。
- AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器(一个8位寄存器所能存储的数据的最大值为1111 1111B=2^8-1=255)
- 为了区分不同的进制,十六进制数据后面加H,二进制数据后面加B,十进制数据后面什么也不加。
- 指令9中需要计算826CH+826CH=?
- 最末位C+C(H)=12+12=16+8=向前一位进1最末位留下8(H);
- 倒数第二位为6+6(H)=C,加上最末位向前进的1,得D;
- 第二位计算2+2(H)=4(H);
- 第一位8+8(H)=16=向前进1,该位得0;
- 综上826CH+826CH=104D8H,但是由于AX是16位寄存器,只能存放4位十六进制数据,所以最高位的1丢失,AX中的数据为04D8H。
- 指令13中,AL+AL即88+88(H),最末位8+8(H)=16=往前进1,该位得0,第一位8+8(H)=16=往前进1,该位得0与后一位进的1相加最后得1,即88+88(H)=110H。但是由于AL是8位寄存器只能存储2位十六进制数据,所以最后AL中的数据是10H,110H首位的1丢失了。
- 请记住,汇编指令mov ax, bx的意思是将寄存器bx中的数据送入寄存器ax,add ax,bx的意思是将ax和bx中的数值相加,结果送入ax中。寄存器名和汇编指令不区分大小写。
(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
mov ax, 2
add ax, ax
add ax, ax
add ax, ax
注:
上述汇编指令每一步寄存及内的数据变化:
2^4=2*2*2*2,指令2~4所对应的高级语言含义ax=ax+ax也可以理解为ax=ax*2,所以步骤就被拆分为:①ax=2;②ax=ax*2(2*2=4);③ax=ax*2(4*2=8);④ax=ax*2(8*2=16)。即可以理解为2^4=[(2*2)*2]*2。
序号 汇编指令 AX 对应高级语言表示 1 mov ax, 2 2 ax=2 2 add ax, ax 4 ax=ax+ax(等号后的ax值为2) 3 add ax, ax 8 ax=ax+ax(等号后ax的值为4) 4 add ax, ax 16 ax=ax+ax(等号后ax的值为8)
总结:
1、需牢记从0~15二进制、十进制、十六进制的一一对应关系,做到熟练计算。
十进制 | 二进制 | 十六进制 |
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
2、当16位寄存器AX被分为两个8位寄存器AH,AL时,AL是作为一个独立的8位寄存器来使用的,和AH没有关系,CPU在执行这条指令时认为AH和AL是两个不想管的寄存器。不要错误地认为,诸如add al, 93H的指令产生的进位会存储在AH中,add al, 93H进行的是8位运算。
本博文是我在学习《汇编语言》王爽第三版时,一边学习一边做的笔记,可能会存在一些错误,欢迎大家来讨论和指正。