汇编语言程序设计---1~4章习题答案(王爽第二版)
检测点1.1
(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。
(2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。
(3)1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte。
(4)1GB是 1073741824 (2^30) 个Byte、1MB是 1048576(2^20) 个Byte、1KB是 1024(2^10)个Byte。
(5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为:64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。
(7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。
(8)在存储器中,数据和程序以 二进制 形式存放。
解题过程:
(1)1KB=1024B,8KB=1024B*8=2^N,N=13。
(2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。
(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。
(4)1GB=1073741824B(即230)1MB=1048576B(即220)1KB=1024B(即2^10)。
(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。
(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
(7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。
(8)在存储器中指令和数据没有任何区别,都是二进制信息。
检测点 2.1
(1) 写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3H
mov ah,31H AX=31A3H
mov al,23H AX=3123H
add ax,ax AX=6246H
mov bx,826CH BX=826CH
mov cx,ax CX=6246H
mov ax,bx AX=826CH
add ax,bx AX=04D8H
mov al,bh AX=0482H
mov ah,bl AX=6C82H
add ah,ah AX=D882H
add al,6 AX=D888H
add al,al AX=D810H
mov ax,cx AX=6246H
(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
mov ax,2 AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16
检测点2.2
(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。
解题过程:
物理地址=SA*16+EA
EA的变化范围为0h~ffffh
物理地址范围为(SA16+0h)~(SA16+ffffh)
现在SA=0001h,那么寻址范围为
(0001h16+0h)~(0001h16+ffffh)
=0010h~1000fh
(2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为 1001H ,最大为 2000H 。
当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
解题过程:
物理地址=SA*16+EA
20000h=SA*16+EA
SA=(20000h-EA)/16=2000h-EA/16
EA取最大值时,SA=2000h-ffffh/16=1001h,SA为最小值
EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值
这里的ffffH/16=fffh是通过WIN自带计算器算的
按位移来算确实应该为fff.fh,这里小数点后的f应该是省略了
单就除法来说,应有商和余数,但此题要求的是地址最大和最小,所以余数忽略了
如果根据位移的算法(段地址*16=16进制左移一位),小数点后应该是不能省略的
我们可以反过来再思考下,如果SA为1000h的话,小数点后省略
SA=1000h,EA取最大ffffh,物理地址为1ffffh,将无法寻到20000H单元
这道题不应看成是单纯的计算题
检测点2.3
下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:一共修改四次
第一次:读取mov ax,bx之后
第二次:读取sub ax,ax之后
第三次:读取jmp ax之后
第四次:执行jmp ax修改IP
最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H
实验一 查看CPU和内存,用机器指令和汇编指令编程
2实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
机器码 汇编指令 寄存器
b8 20 4e mov ax,4E20H ax=4E20H
05 16 14 add ax,1416H ax=6236H
bb 00 20 mov BX,2000H bx=2000H
01 d8 add ax,bx ax=8236H
89 c3 mov bx,ax bx=8236H
01 d8 add ax,bx ax=046CH
b8 1a 00 mov ax,001AH ax=001AH
bb 26 00 mov bx,0026H bx=0026H
00 d8 add al,bl ax=0040H
00 dc add ah,bl ax=2640H
00 c7 add bh,al bx=4026H
b4 00 mov ah,0 ax=0040H
00 d8 add al,bl ax=0066H
04 9c add al,9CH ax=0002H
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:\DOCUME~1\ADMINI~1>debug
-a
0C1C:0100 mov ax,4e20
0C1C:0103 add ax,1416
0C1C:0106 mov bx,2000
0C1C:0109 add ax,bx
0C1C:010B mov bx,ax
0C1C:010D add ax,bx
0C1C:010F mov ax,001a
0C1C:0112 mov bx,0026
0C1C:0115 add al,bl
0C1C:0117 add ah,bl
0C1C:0119 add bh,al
0C1C:011B mov ah,0
0C1C:011D add al,bl
0C1C:011F add al,9c
0C1C:0121
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC
0C1C:0100 B8204E MOV AX,4E20
-t
AX=4E20 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC
0C1C:0103 051614 ADD AX,1416
-t
AX=6236 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0106 NV UP EI PL NZ NA PE NC
0C1C:0106 BB0020 MOV BX,2000
-t
AX=6236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0109 NV UP EI PL NZ NA PE NC
0C1C:0109 01D8 ADD AX,BX
-t
AX=8236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010B OV UP EI NG NZ NA PE NC
0C1C:010B 89C3 MOV BX,AX
-t
AX=8236 BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010D OV UP EI NG NZ NA PE NC
0C1C:010D 01D8 ADD AX,BX
-t
AX=046C BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010F OV UP EI PL NZ NA PE CY
0C1C:010F B81A00 MOV AX,001A
-t
AX=001A BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0112 OV UP EI PL NZ NA PE CY
0C1C:0112 BB2600 MOV BX,0026
-t
AX=001A BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0115 OV UP EI PL NZ NA PE CY
0C1C:0115 00D8 ADD AL,BL
-t
AX=0040 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0117 NV UP EI PL NZ AC PO NC
0C1C:0117 00DC ADD AH,BL
-t
AX=2640 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0119 NV UP EI PL NZ NA PO NC
0C1C:0119 00C7 ADD BH,AL
-t
AX=2640 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011B NV UP EI PL NZ NA PO NC
0C1C:011B B400 MOV AH,00
-t
AX=0040 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011D NV UP EI PL NZ NA PO NC
0C1C:011D 00D8 ADD AL,BL
-t
AX=0066 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011F NV UP EI PL NZ NA PE NC
0C1C:011F 049C ADD AL,9C
-t
AX=0002 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0121 NV UP EI PL NZ AC PO CY
0C1C:0121 D3990075 RCR WORD PTR [BX+DI+7500],CL DS:B526=0000
-q
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:\DOCUME~1\ADMINI~1>debug
-a 2000:0
2000:0000 mov ax,1
2000:0003 add ax,ax
2000:0005 jmp 2000:0003
2000:0007
-r cs
CS 0C1C
:2000
-r ip
IP 0100
:0000
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0000 NV UP EI PL NZ NA PO NC
2000:0000 B80100 MOV AX,0001
-t
AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-q
(3) 查看内存中的内容
PC主板上的ROM中有个一出产日期,在内存FFF00H-FFFFFH的某几个单元中,请找到这个出产日期并试图改变它。
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:\DOCUME~1\ADMINI~1>debug
-d ffff:0 f
FFFF:0000 EA 5B E0 00 F0 31 32 2F-32 35 2F 30 37 00 FC 59 .[...12/25/07..Y
-q
地址C0000~FFFFF的内存单元为只读存储器,写入数据操作是无效的。
因此出产日期无法改变。
检测点3.1
(1) 在DEBUG中,用 “D 0:0 lf” 查看内存,结果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值
mov ax,1
mov ds,ax
mov ax,[0000] ax= 2662H
mov bx,[0001] bx= E626H
mov ax,bx ax= E626H
mov ax,[0000] ax= 2662H
mov bx,[0002] bx= D6E6H
add ax,bx ax= FD48H
add ax,[0004] ax= 2C14H
mov ax,0 ax= 0
mov al,[0002] ax= 00e6H
mov bx,0 bx= 0
mov bl,[000c] bx= 0026H
add al,bl ax= 000CH
(2) 内存中的情况如下图所示
各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;
① 写出CPU执行的指令序列(用汇编指令写出)。
② 写出CPU执行每条指令后,CS、IP和相关寄存器的数值。
③ 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
指令序列 | CS | IP | DS | AX | BX |
---|---|---|---|---|---|
初始值 | 2000h | 0 | 0 | 0 | 0 |
1 mov ax,6622h | 2000h | 3h | 0 | 6622h | 0 |
2 jmp 0ff0:0100 | ff0h | 100h | 0 | 6622h | 0 |
3 mov ax,2000h | ff0h | 103h | 0 | 2000h | 0 |
4 mov ds,ax | ff0h | 105h | 2000h | 2000h | 0 |
5 mov ax,[8] | ff0h | 108h | 2000h | c389h | 0 |
6 mov ax,[2] | ff0h | 10bh | 2000h | ea66h | 0 |
检测点3.2
(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,1000H
mov ds,ax
mov ax,2000H
mov ss,ax
mov sp,10h
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,2000H
mov ds,ax
mov ax,1000H
mov ss,ax
mov sp,0
pop [e]
pop [c]
pop [a]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
实验2 用机器指令和汇编指令编程
(1)使用DEBUG,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax= 5BEAH
add ax,[2] ;ax= 5CCAH
mov bx,[4] ;bx= 31F0H
add bx,[6] ;bx= 6122H
push ax ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 5CCAH
push bx ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 6122H
pop ax ;sp= 00FCH ,ax= 6122H
pop bx ;sp= 00FEH ,bx= 5CCAH
push [4] ;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 31F0
push [6] ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 2F32
此实验答案不定,需根据每台机器的实际运行情况。