《汇编语言》第三版 王爽 课后检测持续更新
汇编语言 课后检测点
第一章
检测点1.1
- 一个CPU的寻址能力为8KB,那么它的地址总线宽度为 13
解题思路:
如果地址总线的宽度为N那么寻址能力为2^N B
1KB = 2^10B
8KB = 2^13B - 1KB的储存器有 1024 储存单元。储存单元的编号从 0 到 1023
解题思路:
一个储存单元是8为,即8bit,为1B
1KB = 2^10B = 1024B 所以有1024个储存单元 - 1KB储存器可以储存 2^13 个bit,2^10 个Byte
解题思路:
1KB = 2^10B = 1024B,1B = 8bit = 2^3bit - 1GB,1MB, 1KB分别是 230,220,2^10 Byte
解题思路:
1Byte = 1B
1KB = 2^10B
1MB = 2^20B
1GB = 2^30B - 8080,8088,80286, 80386 的地址总线分别为 16根,20根, 24根,32根。则它们寻址能力为: 2^6 (KB) 2^0 (MB) 2^4 (MB) 2^2 (GB)
解题思路:
对于地址总线来说,N根寻址能力为2^N B
则16根寻址能力为 2^16B = 2^6KB - 8080,8088,8086, 80286, 80386 的数据总线分别为 8根, 8根, 16根, 16根, 32根。则它们一次可以传输的数据为:1 (B) 1 (B) 2 (B) 2 (B) 4 (B)。
解题思路:
数据总线要注意,一根中代表的是一个bit
N根可以传输的数据就为N/8 B - 从内存从读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 几次
解题思路:
根据上题,8086一次可以传2个字节。则1024字节需要传1024/2次
同理,对于80386来说,1024字节需要传1024/4次 - 在寄存器中,数据和程序以二进制形式存放。
解题思路:
数据和机器指令都是以01组成的二进制形式
第二章
检测点2.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.2
- 给定段地址为0001H,仅通过变化偏移地址寻址,cpu的寻址范围为00010H 到,1000F
解题思路:
段地址偏移16位得 00010H 寻址范围为 00010H + 0000H ~ 00010H + FFFFH - 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元。则SA应满足的条件是:最小为 10001H 最大为2000H
解题思路:
内存地址是由段地址和偏移地址共同得到的,公式为 SAx16+EA = 20000H 其中EA的取值范围为 0H~FFFFH 将两个极端值带入得到SAx16=20000H 和 SAx16=100001H
对于EA=0H时可以直接得到SA=2000H 而对于SAx16=100001H 时会发现得不到整数值。所以最小值只可以由SAx16=100010H 得到,则SA=100010H
检测点2.3
- 下面三条指令执行后,CPU几次修改IP?都是什么时候,最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答案:
四次修改IP值,分别在每条指令之后,以及执行完最后一句指令之后跳转到0,最终的值为0
解题思路:
IP在每次执行完指令之后都会自动加上当前指令在内存中的长度。最后一句jmp指令是更改IP的指令,最终IP跳转到0
第三章
检测点3.1
- 在Debug中,用“d0:01f”查看内存结果如下。
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 = 0010H
mov al,[0002] AX = 00E6H
mov bx,0 BX = 0000H
mov bl,[000C] BX = 0026H
add al,bl AX = 000CH
- 内存的情况如图3.6所示。
各寄存器的初始值为:CS=2000H, IP=0, DS=1000H,AX=0,BX=0;
(1)写出CPU执行的指令序列(用汇编语言写出)。
(2)写出CPU执行每条指令后,CS,IP和相关寄存器中的数值
(3)再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
答案:
| 指令 | CS:IP | DS | AX | BX |
|---|---|---|---|---|
| mov ax,6622H | 2000:3 | 1000H | 6622H | 0H |
| jmp 0ff0:0100 | 2000:8->0ff0:0100 | 1000H | 6622H | 0H |
| mov ax,2000H | 0ff0:0103 | 1000H | 2000H | 0H |
| mov ds:ax | 0ff0:0105 | 2000H | 2000H | 0H |
| mov ax:[0008] | 0ff0:0108 | 2000H | C389H | 0H |
| mov ax:[0002] | 0ff0:010B | 2000H | EA66 | 0H |
数据和程序在储存方面并无区别。靠代码段寄存器和数据段寄存器来区分哪是数据哪是程序,即,看CPU如何解释。
解题思路:
根据一开始题干所给可知,CS和IP的值可以得出最开始执行的代码段。然后顺序执行。
检测点3.2
补全下面的程序,使其可以将10000H1000FH中的8个字,逆序复制20000H2000FH中。
mov ax,1000H
mov ds,ax
___________
___________
___________
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
答案:
mov ax,2000H
mov ss,ax
mov sp,0010H
补全下面程序,使其可以将10000H1000FH中的8个字,逆序复制到20000H2000FH中。
mov ax,2000H
mov ds,ax
________
________
________
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
答案:
mov ax,1000H
mov ss,ax
mov sp,0

浙公网安备 33010602011771号