第 1 章 基础知识
检测点 1.1
(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为 13。
(2)1KB 的存储器有 1024 个存储单元。存储单元的编号从 0 到 1023。
(3)1KB 的存储器可以存储 1024*8 个 bit,1024 个 Byte。
(4)1GB、1MB、1KB 分别是 2^30、2^20、2^10 Byte。(n^m 的意思是 n 的 m 次幂)
(5)8080、8088、80286、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)在存储器中,数据和程序以二进制形式存放。
第 2 章 寄存器 答案
检测点 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
add ax,ax
add ax,ax
add ax,ax
1
检测点 2.2
(1) 给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为 00010H
到 1000FH。
(2) 有一数据存放在内存 20000H 单元中,先给定段地址为 SA,若想用偏移地
址寻到此单元。则 SA 应满足的条件是:最小为 1001H,最大为 2000H。
检测点 2.3
下面的 3 条指令执行后,CPU 几次修改 IP?都是在什么时候?最后 IP 中的值是
多少?
mov ax,bx
sub ax,ax
jmp ax
解:
修改 4 次;第一次在 CPU 读取“mov ax,bx”后,第二次在 CPU 读取“sub ax,ax”
后,第三次在 CPU 读取“jmp ax”后,第四次在 CPU 执行完“mov ax,bx”后;
最后 IP 中的值为 0。
实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
1.略
2.
(1)略
(2)略
(3)查看内存中的内容。
PC 机主板上的 ROM 中写有一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元
中,请找出这个生产日期并试图改变它。
解:内存 FFF00H~FFFFFH 为 ROM 区,内容可读但不可写。
(4)向内存从 B8100H 开始的单元中填写数据,如:
-e B810:0000 01 01 02 02 03 03 04 04
请读者先填写不同的数据,观察产生的现象;在改变填写的地址,观察产生的现
象。
解:8086 的显存地址空间是 A0000H~BFFFFH,其中 B8000H~BFFFFH 为 80*25
彩色字符模式显示缓冲区,当向这个地址空间写入数据时,这些数据会立即出现
在显示器上。
第 3 章 寄存器(内存访问)
2
检测点 3.1
(1) 在 Debug 中,用“d 0:0 1f”查看内存,结果如下。
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=0000H
mov al,[0002] AX=00E6H
mov bx,0 BX=0000H
mov bl,[000C] BX=0026H
add al,bl AX=000CH
(2)内存中的情况如图 3.6 所示
各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0;
① 写出 CPU 执行的指令序列(用汇编指令写出)。
② 写出 CPU 执行每条指令后,CS、IP 和相关寄存器中的数值。
③ 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些
是程序?
解: 初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0
① ②
mov ax,6622H AX=6622H 其他寄存器保持不变,以下同理
jmp 0ff0:0100 CS=0ff0H,IP=0100H
mov ax,2000H AX=2000H
mov ds,ax DS=20000H
mov ax,[0008] AX=C389H
mov ax,[0002] AX=EA66H
③ 没有区别,被 CS:IP 指向的信息是程序;被传送、运算等指令操作的是数据。
检测点 3.2
3
(1) 补全下面的程序,使其可以将 10000H~1000FH 中的 8 个字,逆序复制到
200000H~2000FH 中。逆序复制的含义如图 3.17 所示(图中内存里的数据均为假
设)。
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) 补全下面的程序,使其可以将 100000H~1000FH 中的 8 个字,逆序复制到
200000H~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 的使用
略
2.实验任务
(1) 使用 Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际
运行情况填空。
4
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=58EA
add ax,[2] ;ax=5CCA
mov bx,[4] ;bx=30F0
add bx,[6] ;bx=6021
push ax ;sp=00FE;修改的内存单元的地址是 220FE,内容为 5CCA
push bx ;sp=00FC;修改的内存单元的地址是 220FC,内容为 6021
pop ax ;sp=00FE;ax=6021
pop bx ;sp=0100;bx=5CCA
push [4] ;sp=00FE;修改的内存单元的地址是 220FE,内容为 30F0
push [6] ;sp=00FC;修改的内存单元的地址是 220FC,内容为 2F31
注:内存中的数据会因机器、环境而异
(2) 仔细观察图 3.19 中的实验过程,然后分析:为什么 2000:0~2000:f 中的内
容会发生改变?
解:t 命令为单步中断,CPU 会保护现场,即顺序把标志寄存器、CS、IP 入栈,
此题是关于后面章节的中断问题。
第 4 章 第一个程序
实验 3 编程、编译、连接、跟踪
(1) 将下面的程序保存为 t1.asm,将其生成可执行文件 ti.exe。
assume cs:codesg
codesg segment
mov ax,2000h
mov ss,ax
mov sp,0
add sp,10
pop ax
pop bx
5
push ax
push bx
pop ax
pop bx
mov ax,4c00h
int 21h
codesg ends
end
解:略
(2) 用 Debug 跟踪 t1.exe 的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内
容。
解:
6
(3)PSP 的头两个字节是 CD20,用 Debug 加载 ti.exe,查看 PSP 的内容。
解:
7
第 5 章 [BX]和 loop 指令
实验 4 [bx]和 loop 的使用
(1)编程,向内存 0:200~0:23F 依次传送数据 0~63(3FH)。
解:
assume cs:codesg
codesg segment
mov ax,0
mov ds,ax
mov bx,200H
mov al,0
mov cx,64
s:mov [bx],al
inc bx
inc al
loop s
mov ax,4c00h
int 21h
codesg ends
end
(2)编程,向内存 0:200~0:23F 依次传送数据 0~63(3FH),程序中只能使用 9
条指令,9 条指令中包括“mov ax,4c00h”和“int 21h”。
8