1、1第 1 章 基础知识检测点 1.1(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为 13。(2)1KB 的存储器有 1024 个存储单元。存储单元的编号从 0 到 1023。(3)1KB 的存储器可以存储 1024*8 个 bit,1024 个 Byte。(4)1GB、1MB、1KB 分别是 230、220、210 Byte。(nm 的意思是 n 的 m 次幂)(5)8080、8088、80286、80386 的地址总线宽度分别是 16 根、20 根、24 根、32 根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。(6)8080、8088、
2、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=F4A3Hmov ah,31H AX=31A3Hmov al,23H AX=3123Hadd ax,ax AX=6246Hmov bx,826CH B
3、X=826CHmov cx,ax CX=6246Hmov ax,bx AX=826CHadd ax,bx AX=04D8Hmov al,bh AX=0482Hmov ah,bl AX=6C82Hadd ah,ah AX=D882Hadd al,6 AX=D888Hadd al,al AX=D810Hmov ax,cx AX=6246H(2) 只能使用目前学过的汇编指令,最多使用 4 条指令,编程计算 2 的 4 次方。解:mov ax,2add ax,axadd ax,axadd ax,ax检测点 2.2(1) 给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为 00010
4、H 到 1000FH。2(2) 有一数据存放在内存 20000H 单元中,先给定段地址为 SA,若想用偏移地址寻到此单元。则 SA 应满足的条件是:最小为 1001H,最大为 2000H。检测点 2.3下面的 3 条指令执行后,CPU 几次修改 IP?都是在什么时候?最后 IP 中的值是多少?mov ax,bxsub ax,axjmp ax解:修改 4 次;第一次在 CPU 读取“mov ax,bx”后,第二次在 CPU 读取“sub ax,ax”后,第三次在 CPU 读取“jmp ax”后,第四次在 CPU 执行完“mov ax,bx”后;最后 IP 中的值为 0。实验 1 查看 CPU 和
5、内存,用机器指令和汇编指令编程1.略2.(1)略(2)略(3)查看内存中的内容。PC 机主板上的 ROM 中写有一个生产日期,在内存 FFF00HFFFFFH 的某几个单元中,请找出这个生产日期并试图改变它。解:内存 FFF00HFFFFFH 为 ROM 区,内容可读但不可写。(4)向内存从 B8100H 开始的单元中填写数据,如:-e B810:0000 01 01 02 02 03 03 04 04请读者先填写不同的数据,观察产生的现象;在改变填写的地址,观察产生的现象。解:8086 的显存地址空间是 A0000HBFFFFH,其中 B8000HBFFFFH 为 80*25 彩色字符模式显
6、示缓冲区,当向这个地址空间写入数据时,这些数据会立即出现在显示器上。第 3 章 寄存器(内存访问)检测点 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 600000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器的值。mov ax,1mov ds,axmov ax,0000 AX=2662Hmov bx,0001 BX=E626
7、H5mov ax,bx AX=E626Hmov ax,0000 AX=2662Hmov bx,0002 BX=D6E6Hadd ax,bx AX=FD48Hadd ax,0004 AX=2C14Hmov ax,0 AX=0000Hmov al,0002 AX=00E6Hmov bx,0 BX=0000Hmov bl,000C BX=0026Hadd al,bl AX=000CH(2)内存中的情况如图 3.6 所示各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0; 写出 CPU 执行的指令序列(用汇编指令写出)。 写出 CPU 执行每条指令后,CS、IP 和相关
8、寄存器中的数值。 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?解: 初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0 mov ax,6622H AX=6622H 其他寄存器保持不变,以下同理jmp 0ff0:0100 CS=0ff0H,IP=0100Hmov ax,2000H AX=2000Hmov ds,ax DS=20000Hmov ax,0008 AX=C389Hmov ax,0002 AX=EA66H 没有区别,被 CS:IP 指向的信息是程序;被传送、运算等指令操作的是数据。检测点 3.2(1) 补全下面的程序,使其可以将 100
9、00H1000FH 中的 8 个字,逆序复制到200000H2000FH 中。逆序复制的含义如图 3.17 所示(图中内存里的数据均为假设)。mov ax,1000Hmov ds,axmov ax,2000Hmov ss,axmov sp,10Hpush 0push 2push 4push 66push 8push Apush Cpush E(2) 补全下面的程序,使其可以将 100000H1000FH 中的 8 个字,逆序复制到200000H2000FH 中。mov ax,2000Hmov ds,axmov ax,1000Hmov ss,axmov sp,0pop Epop Cpop Apo
10、p 8pop 6pop 4pop 2pop 0实验 2 用机器指令和汇编指令编程1.预备知识:Debug 的使用略2.实验任务(1) 使用 Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。mov ax,ffffmov ds,axmov ax,2200mov ss,axmov sp,0100mov ax,0 ;ax=58EAadd ax,2 ;ax=5CCAmov bx,4 ;bx=30F0add bx,6 ;bx=6021push ax ;sp=00FE;修改的内存单元的地址是 220FE,内容为 5CCA7push bx ;sp=00FC;修改的内存单元的地址
11、是 220FC,内容为 6021pop ax ;sp=00FE;ax=6021pop bx ;sp=0100;bx=5CCApush 4 ;sp=00FE;修改的内存单元的地址是 220FE,内容为 30F0push 6 ;sp=00FC;修改的内存单元的地址是 220FC,内容为 2F31注:内存中的数据会因机器、环境而异(2) 仔细观察图 3.19 中的实验过程,然后分析:为什么 2000:02000:f 中的内容会发生改变?解:t 命令为单步中断,CPU 会保护现场,即顺序把标志寄存器、CS、IP 入栈,此题是关于后面章节的中断问题。第 4 章 第一个程序实验 3 编程、编译、连接、跟踪
12、(1) 将下面的程序保存为 t1.asm,将其生成可执行文件 ti.exe。assume cs:codesgcodesg segmentmov ax,2000hmov ss,axmov sp,0add sp,10pop axpop bxpush axpush bxpop axpop bxmov ax,4c00hint 21hcodesg endsend解:略8(2) 用 Debug 跟踪 t1.exe 的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。解:(3)PSP 的头两个字节是 CD20,用 Debug 加载 ti.exe,查看 PSP 的内容。9解:第 5 章 BX和 lo
13、op 指令实验 4 bx和 loop 的使用(1)编程,向内存 0:2000:23F 依次传送数据 063(3FH)。解:assume cs:codesgcodesg segmentmov ax,0mov ds,axmov bx,200Hmov al,0mov cx,64s:mov bx,alinc bxinc alloop smov ax,4c00hint 21hcodesg endsend(2)编程,向内存 0:2000:23F 依次传送数据 063(3FH),程序中只能使用 9 条指令,9 条指令中包括“mov ax,4c00h”和“int 21h”。10解:assume cs:code
14、sgcodesg segmentmov ax,20hmov ds,axmov bx,0mov cx,64s:mov bx,blinc bxloop smov ax,4c00hint 21hcodesg endsend(3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。assume cs:codecode segmentmov ax,csmov ds,axmov ax,0020hmov es,axmov bx,0mov cx,17hs:mov al,bxmov es:bx,alinc bxloop smov ax,4c0
15、0hint 21hcode endsend11第 6 章 包含多个段的程序检测点 6.1(1) 下面的程序实现依次用内存 0:00:15 单元中的内容改写程序中的数据,完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov cs:bx,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start(2) 下面的程序实现依次用
16、内存 0:00:15 单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0,0,0 ;10 个字单元用栈空间15start:mov ax,cs mov ss,axmov sp,36 mov ax,0mov ds,axmov bx,0mov cx,8s:push bxpop cs:bxadd bx,2loop smov ax,4c00hint 21hcodesg endsend start实验 5 编写、调试具有多个段的程序(1) 将下面的程序编译连接,用 Debug 加载、跟踪,然后回答问题assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0