(-a^2+2ab-b^2)一(2a^2+ab-3ba3b^2)解题

当前位置: >>
汇编语言(王爽)第二版课后题全答案
检测点 1.1 (1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为 13 位。 (2)1KB 的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB 的存储器可以存储 ) 个 bit, 1024 个 Byte。 (4)1GB 是
(2^30) 个 Byte、1MB 是 ^20) 个 Byte、1KB 是 1024 (2^10)个 Byte。 (5)、8 的地址总线宽度分别为 16 根、20 根、24 根、32 根,则它 们的寻址能力分别为:64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。 (6)、、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=^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=B*8Bit)。 (4)1GB=B(即 2^30)1MB=1048576B(即 2^20)1KB=1024B(即 2^10)。 (5)一个 CPU 有 N 根地址线,则可以说这个 CPU 的地址总线的宽度为 N。这样的 CPU 最 多可以寻找 2 的 N 次方个内存单元。(一个内存单元=1Byte)。 (6)8 根数据总线一次可以传送 8 位二进制数据(即一个字节)。 (7)8086 的数据总线宽度为 16 根(即一次传送的数据为 2B)2,同理 6。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。 检测点 2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H mov al,23H add ax,ax AX=31A3H AX=3123H AX=6246Hmov bx,826CH BX=826CH mov cx,ax mov ax,bx add ax,bx mov al,bh mov ah,bl CX=6246H AX=826CH AX=04D8H u AX=0482H AX=6C82H add ah,ah add al,6 add al,al mov ax,cxAX=D882H AX=D888H AX=D810H AX=6246HMicrosoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\ADMINI~1&debug -a 0C1C:0100 mov ax,f4a3 0C1C:0103 mov ah,31 0C1C:0105 mov al,23 0C1C:0107 add ax,ax 0C1C:0109 mov bx,826c 0C1C:010C mov cx,ax 0C1C:010E mov ax,bx 0C1C:0110 add ax,bx 0C1C:0112 mov al,bh 0C1C:0114 mov ah,bl 0C1C:0116 add ah,ah 0C1C:0118 add al,6 0C1C:011A add al,al 0C1C:011C mov ax,cx 0C1C:011E -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:F4 -t AX=F4A3 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: -t AX=31A3 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC MOV AH,31 MOV AX,F4A3 0C1C: -tMOVAL,23AX=3123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0107 NV UP EI PL NZ NA PO NC 0C1C: -t AX=6246 BX=0000 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 PO NC 0C1C:0109 BB6C82 -t AX=6246 BX=826C CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010C NV UP EI PL NZ NA PO NC 0C1C:010C 89C1 -t AX=6246 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010E NV UP EI PL NZ NA PO NC 0C1C:010E 89D8 -t AX=826C BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0110 NV UP EI PL NZ NA PO NC 0C1C: -t AX=04D8 BX=826C CX=6246 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 AC PE CY 0C1C: -t AX=0482 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0114 OV UP EI PL NZ AC PE CY 0C1C:0114 88DC -t AX=6C82 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0116 OV UP EI PL NZ AC PE CY 0C1C: -t AX=D882 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 ADD AH,AH MOV AH,BL MOV AL,BH ADD AX,BX MOV AX,BX MOV CX,AX MOV BX,826C ADD AX,AX DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0118 OV UP EI NG NZ AC PE NC 0C1C: -t AX=D888 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011A NV UP EI NG NZ NA PE NC 0C1C:011A 00C0 -t AX=D810 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011C OV UP EI PL NZ AC PO CY 0C1C:011C 89C8 -t AX=6246 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011E OV UP EI PL NZ AC PO CY 0C1C:011E 0B0C -q OR CX,[SI] DS:0000=20CD MOV AX,CX ADD AL,AL ADD AL,06检测点 2.1 (2) 只能使用目前学过的汇编指令,最多使用 4 条指令,编程计算 2 的 4 次方。 mov ax,2 add ax,ax add ax,ax add ax,ax AX=2 AX=4 AX=8 AX=16Microsoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\ADMINI~1&debug -a 0C1C:0100 mov ax,2 0C1C:0103 add ax,ax 0C1C:0105 add ax,ax 0C1C:0107 add ax,ax 0C1C:0109 -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: -t AX=0002 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: -t AX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC 0C1C: -t AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0107 NV UP EI PL NZ NA PO NC 0C1C: -t AX=0010 BX=0000 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 AC PO NC 0C1C:5 -q 检测点 2.2 (1) 给定段地址为 0001H, 仅通过变化偏移地址寻址, CPU 的寻址范围为 0010H 到 1000FH 。 AND [BX+SI+1516],CL DS:1516=00 ADD AX,AX ADD AX,AX ADD AX,AX MOV AX,0002解题过程: 物理地址=SA*16+EA EA 的变化范围为 0h~ffffh 物理地址范围为(SA*16+0h)~(SA*16+ffffh) 现在 SA=0001h,那么寻址范围为 (h)~(0001h*16+ffffh) =fh 检测点 2.2 (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,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 05 16 14 bb 00 20 汇编指令 mov ax,4E20H add ax,1416H mov BX,2000H 寄存器 ax=4E20H ax=6236H bx=2000H 01 d8 89 c3 01 d8 b8 1a 00 bb 26 00 00 d8 00 dc 00 c7 b4 00 00 d8 04 9cadd ax,bx mov bx,ax add ax,bxax=8236H bx=8236H ax=046CH ax=001AH bx=0026Hmov ax,001AH mov bx,0026H add al,bl add ah,bl add bh,al mov ah,0 add al,bl add al,9CHax=0040H ax=2640H bx=4026H ax=0040H ax=0066H ax=0002HMicrosoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\ADMINI~1&debug -a 0C1C:0100 mov ax,4e20 0C1C:0103 add ax,C:0106 mov bx,C:0109 add ax,bx 0C1C:010B mov bx,ax 0C1C:010D add ax,bx 0C1C:010F mov ax,001a 0C1C:0112 mov bx,C: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:E 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: -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 -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: -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 -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 -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 -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 -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: -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 ADD AL,BL MOV BX,0026 MOV AX,001A ADD AX,BX MOV BX,AX ADD AX,BX MOV BX,2000 ADD AX,1416 0C1C:0117 00DC -tADDAH,BLAX=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: -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 -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 -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 -t AX=0002 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0121 NV UP EI PL NZ AC PO CY 0C1C:5 -q 实验一 查看 CPU 和内存,用机器指令和汇编指令编程 (2)将下面的 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方。 mov ax,1 add ax,ax jmp
RCR WORD PTR [BX+DI+7500],CL DS:B526=0000 ADD AL,9C ADD AL,BL MOV AH,00 ADD BH,ALMicrosoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\ADMINI~1&debug -a 0:0000 mov ax,1
-r cs CS 0C1C :2000 -r ip IP
-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
B80100 -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 C0 -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
EBFC -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 C0 -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 C0 -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
EBFC -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 C0 ADD AX,AX JMP 0003 ADD AX,AX ADD AX,AX JMP 0003 ADD AX,AX MOV AX,0001 -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
EBFC -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 C0 -q 实验一 查看 CPU 和内存,用机器指令和汇编指令编程 (3) 查看内存中的内容 PC 主板上的 ROM 中有个一出产日期, 在内存 FFF00H-FFFFFH 的某几个单元中, 请找到这 个出产日期并试图改变它。 ADD AX,AX JMP 0003Microsoft(R) Windows DOS (C)Copyright Microsoft Corp . 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 的内存单元为只读存储器,写入数据操作是无效的。 因此出产日期无法改变。下面内容摘自于网上 还有另一种情况,如果你发现你能修改 ROM 中的生产日期,那么原因如下: 每个计算机的结构都不一样,教材考虑的是普通 8086PC 机上的效果,个别计算机的效果可 能不同。 也就是说 在你的计算机中 这个内存是可修改的 所以,认为所有的计算机某些地址的内存不能修改是片面的。书上说 rom 是只读的你就不去验证了吗?如何验证呢? 我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神, 怀疑之后再去验证才能跟深刻的理解知识, 提升自己的能力, 甚至还会发现有些书上描述的 不准确甚至错误的地方。 --引用这几本书综合研究的三个问题: 都再用,我们就非得用吗? 规定了,我们就只知道遵守吗? 司空见惯,我们就不怀疑了吗?尽信书不如无书大概也有这个道理吧^_^检测点 3.1 (1) 在 DEBUG 中,用 &D 0:0 lf& 查看内存,结果如下:
80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60
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= E626Hmov ax,[0000] ax= 2662H mov bx,[0002] bx= D6E6H add ax,bx ax= FD48Hadd ax,[0004] ax= 2C14H mov ax,0 ax= 0mov al,[0002] ax= 00e6H mov bx,0 bx= 0mov bl,[000c] bx= 0026H add al,bl ax= 000CH用 DEBUG 进行验证: Microsoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\000&debug -e 0: 10.80 A7.f0 00.30 8B.ef 01.60 70.30 00.e2 .00 00.80 AF.80 03.12 8B.66 01.20 70.22 00.60 B.62 01.26 70.e6 00.d6 B9.cc 06.2e 14.3c 02.3b .ab 07.ba 14.00 02.00 FF.26 03.06 14.66 02.88 -d f
80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60 p..0.`0.....f &`
26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88 b&....&;....&.f. -a 0DB4:0100 mov ax,1 0DB4:0103 mov ds,ax 0DB4:0105 mov ax,[:0108 mov bx,[:010C mov ax,bx 0DB4:010E mov ax,[:0111 mov bx,[:0115 add ax,bx 0DB4:0117 add ax,[:011B mov ax,0 0DB4:011E mov al,[:0121 mov bx,0 0DB4:0124 mov bl,[000c] 0DB4:0128 add al,bl 0DB4:012A -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0DB4 ES=0DB4 SS=0DB4 CS=0DB4 IP=0100 NV UP EI PL NZ NA PO NC 0DB4: -t AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0DB4 ES=0DB4 SS=0DB4 CS=0DB4 IP=0103 NV UP EI PL NZ NA PO NC 0DB4: -t AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0105 NV UP EI PL NZ NA PO NC 0DB4: -t AX=2662 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 MOV AX,[0000] DS: MOV DS,AX MOV AX,0001 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0108 NV UP EI PL NZ NA PO NC 0DB4:E0100 -t AX=2662 BX=E626 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=010C NV UP EI PL NZ NA PO NC 0DB4:010C 89D8 -t AX=E626 BX=E626 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=010E NV UP EI PL NZ NA PO NC 0DB4:010E A10000 -t AX=2662 BX=E626 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0111 NV UP EI PL NZ NA PO NC 0DB4:E0200 -t AX=2662 BX=D6E6 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0115 NV UP EI PL NZ NA PO NC 0DB4: -t AX=FD48 BX=D6E6 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0117 NV UP EI NG NZ NA PE NC 0DB4:0 -t AX=2C14 BX=D6E6 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=011B NV UP EI PL NZ AC PE CY 0DB4:011B B80000 -t AX=0000 BX=D6E6 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=011E NV UP EI PL NZ AC PE CY 0DB4:011E A00200 -t AX=00E6 BX=D6E6 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0121 NV UP EI PL NZ AC PE CY 0DB4:0121 BB0000 -t MOV BX,0000 MOV AL,[0002] DS:0002=E6 MOV AX,0000 ADD AX,[0004] DS:0004=2ECC ADD AX,BX MOV BX,[0002] DS: MOV AX,[0000] DS: MOV AX,BX MOV BX,[0001] DS: AX=00E6 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0124 NV UP EI PL NZ AC PE CY 0DB4:E0C00 -t AX=00E6 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0128 NV UP EI PL NZ AC PE CY 0DB4: -t AX=000C BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=012A NV UP EI PL NZ NA PE CY 0DB4:012A C6061799FF MOV -q BYTE PTR [9917],FF DS:9917=9A ADD AL,BL MOV BL,[000C] DS:000C=26检测点 3.1 (2) 内存中的情况如图 3.6 所示 各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0; ① ② ③ 写出 CPU 执行的指令序列(用汇编指令写出)。 写出 CPU 执行每条指令后,CS、IP 和相关寄存器的数值。 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?图 3.6 内存情况示意指令序列 初始值 1 2 3 4 5 6 mov ax,6622h jmp 0ff0:0100 mov ax,2000h mov ds,ax mov ax,[8] mov ax,[2]CS h ff0h ff0h ff0h ff0h ff0hIP 0 3h 100h 103h 105h 108h 10bhDS 0 0 0 0 h 2000hAX 0 h h c389h ea66hBX 0 0 0 0 0 0 0检测点 3.2 (1) 补全下面的程序, 使其可以将 1FH 中的 8 个字, 逆序拷贝到 2FH 中。 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] 检测点 3.2 (2) 补全下面的程序, 使其可以将 1FH 中的 8 个字, 逆序拷贝到 2FH 中。 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,0100mov ax,[0] ;ax= 5BEAH add ax,[2] ;ax= 5CCAH mov bx,[4] ;bx= 31F0H add bx,[6] ;bx= 6122Hpush ax push bx pop ax pop bx;sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 5CCAH ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 6122H ;sp= 00FCH ,ax= 6122H ;sp= 00FEH ,bx= 5CCAHpush [4] push [6];sp= 00FEH ,修改的内存单元地址是 2200:00FE 内容为 31F0 ;sp= 00FCH ,修改的内存单元地址是 2200:00FC 内容为 2F32此实验答案不定,需根据每台机器的实际运行情况。Microsoft(R) Windows DOS (C)Copyright Microsoft Corp . C:\DOCUME~1\ADMINI~1&debug -a 0C1C:0100 mov ax,ffff 0C1C:0103 mov ds,ax 0C1C:0105 mov ax,C:0108 mov ss,ax 0C1C:010A mov sp,C:010D mov ax,[0] 0C1C:0110 add ax,[2] 0C1C:0114 mov bx,[4] 0C1C:0118 add bx,[6] 0C1C:011C push ax 0C1C:011D push bx 0C1C:011E pop ax 0C1C:011F pop bx 0C1C:0120 push [4] 0C1C:0124 push [6] 0C1C:0128 -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 B8FFFF -t AX=FFFF 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: -t AX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC 0C1C: -t AX=2200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=0C1C CS=0C1C IP=0108 NV UP EI PL NZ NA PO NC 0C1C: -t AX=2200 BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=010D NV UP EI PL NZ NA PO NC 0C1C:010D A10000 -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 -t AX=5BEA BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0110 NV UP EI PL NZ NA PO NC 0C1C:0 -t AX=5CCA BX=0000 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0114 NV UP EI PL NZ NA PE NC 0C1C:E0400 -t AX=5CCA BX=31F0 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0118 NV UP EI PL NZ NA PE NC MOV BX,[0004] DS: ADD AX,[0002] DS: MOV AX,[0000] DS:0000=5BEA MOV SS,AX MOV AX,2200 MOV DS,AX MOV AX,FFFF 0C1C:0 -tADDBX,[0006]DS:AX=5CCA BX=6122 CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=011C NV UP EI PL NZ NA PE NC 0C1C:011C 50 -t AX=5CCA BX=6122 CX=0000 DX=0000 SP=00FE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=011D NV UP EI PL NZ NA PE NC 0C1C:011D 53 -t AX=5CCA BX=6122 CX=0000 DX=0000 SP=00FC BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=011E NV UP EI PL NZ NA PE NC 0C1C:011E 58 -t AX=6122 BX=6122 CX=0000 DX=0000 SP=00FE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=011F NV UP EI PL NZ NA PE NC 0C1C:011F 5B -t AX=6122 BX=5CCA CX=0000 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0120 NV UP EI PL NZ NA PE NC 0C1C:0120 FF360400 -t AX=6122 BX=5CCA CX=0000 DX=0000 SP=00FE BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0124 NV UP EI PL NZ NA PE NC 0C1C:0124 FF360600 -t AX=6122 BX=5CCA CX=0000 DX=0000 SP=00FC BP=0000 SI=0000 DI=0000 DS=FFFF ES=0C1C SS=2200 CS=0C1C IP=0128 NV UP EI PL NZ NA PE NC 0C1C:0128 16 -q PUSH SS PUSH [0006] DS: PUSH [0004] DS: POP BX POP AX PUSH BX PUSH AX实验 4 [bx]和 loop 的使用 (1) 编程,向内存 0:200~0:23f 依次传递数据 0~63(3fh)。这是个比较另类的做法,传统做法请参考实验 4(2) assume cs:code code segment mov bx,20h mov ss,bx mov sp,40h mov bx,3f3eh mov cx,32 s: push bx sub bx,202h loop s mov ax,4c00h int 21h code ends endC:\DOCUME~1\ADMINI~1&debug sy4-2.exe -d 0:200 23f
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 0C79:0000 BB: 0C79:0005 BC:0008 BB3E3F 0C79:000B B:000E 53 MOV MOV MOV MOV MOV BX,0020 SS,BX SP,0040 BX,3F3E CX,0020PUSH BX SUB LOOP MOV INT BX,E AX,4C00 210C79:000F 81EB: 0C79:C 0C79:0018 CD21 0C79:001A :001C FF508D 0C79:001F 46XCHG AL,[BX+SI] CALL [BX+SI-73] INC SI -g 0015 AX=0000 BX=FEFE CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0C69 ES=0C69 SS=0020 CS=0C79 IP=0015 NV UP EI NG NZ AC PO CY 0C79:C -d 0:200 23f
01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !&#$%&'()*+,-./
31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F :;&=&? -t AX=4C00 BX=FEFE CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0C69 ES=0C69 SS=0020 CS=0C79 IP=0018 NV UP EI NG NZ AC PO CY 0C79:0018 CD21 -p Program terminated normally -q C:\DOCUME~1\ADMINI~1& 实验 4 [bx]和 loop 的使用 (2)编程,向内存 0:200~0:23f 依次传递数据 0~63(3fh),程序中只能使用 9 条指令,9 条指中 包括“mov ax,4c00h”和“int 21h”。 INT 21 MOV AX,4C00assume cs:code code segment mov ax,20h mov ds,ax mov bx,0 mov cx,40或 mov cx,64 s: mov [bx],bl inc bx loop s mov ax,4c00h int 21h code ends end C:\DOCUME~1\ADMINI~1&debug sy4-1.exe -d 0:200 23f
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 0C79: 0C79: 0C79:0005 BB: 0C79:000B 881F 0C79:000D 43 0C79:000E E2FB 0C79:C 0C79:0013 CD21 0C79:0015 CC 0C79:0016 FFFF 0C79:0018 50 MOV MOV MOV MOV MOV INC AX,0020 DS,AX BX,0000 CX,0040 [BX],BL BX 000B AX,4C00 21 3 DILOOP MOV INT INT ???PUSH AX LEA AX,[BP+FF00]0C79:0FF 0C79:001D 50 0C79:001E 8D4680 -g 0010PUSH AX LEA AX,[BP-80]AX=0020 BX=0040 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0020 ES=0C69 SS=0C79 CS=0C79 IP=0010 NV UP EI PL NZ AC PO NC 0C79:C -d 0:200 23f
01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !&#$%&'()*+,-./
31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F :;&=&? -t AX=4C00 BX=0040 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0020 ES=0C69 SS=0C79 CS=0C79 IP=0013 NV UP EI PL NZ AC PO NC 0C79:0013 CD21 INT 21 MOV AX,4C00 -p Program terminated normally -q实验 4 [bx]和 loop 的使用 (3)下面的程序功能是将“mov ax,4c00h&之前的指令复制到内存 0:200 处,补全程序。上机调 试,跟踪运行结果。 assume cs:code code segment mov ax,或 mov ax, cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx, 18或 mov cx, 17或 sub cx,5 s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end此题有多个答案,因为 mov 用在寄存器之间传送数据的指令是 2 个字节,用在寄存器和立 即数之间是 3 个字节 答案 1:mov ax,cs (占 2 个字节) mov cx,17 答案 2:mov ax,code (占 3 个字节) mov cx,18 答案 3:mov ax,cs 或 mov ax,code 把 mov cx, 改成 sub cx,5 (因为在载入程序时,cx 保存程序的长度,减去 5 是为减去 mov ax,4c00h 和 int 21h 的长度)此题的目的是: 1、理解 CS 和 CODE 的关联 2、理解 CS 保存程序的代码段,即“复制的是什么,从哪里到哪里” 3、理解 CX 在载入程序后保存程序的长度。 4、理解数据和代码对 CPU 来说是没区别的,只要 CS:IP 指向的就是代码C:\DOCUME~1\ADMINI~1&debug sy4-3.exe -u 0C79:C 0C79: 0C79: 0C79: 0C79:000A BB:000D B: 0C79:C79:C79:C79: 0C79:C 0C79:001B CD21 0C79:001D 50 0C79:001E 8D4680 -g Program terminated normally -d 0:200
B8 79 0C 8E D8 B8 20 00-8E C0 BB 00 00 B9 18 00 .y.... ......... A 07 26 88 07 43 E2 F8-00 00 00 00 00 00 00 00 ..&..C..........
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 0:200
B8790C MOV AX,0C79 MOV MOV MOV MOV MOV MOV MOV ES: MOV INC [BX],AL BX 0010 AX,4C00 21 AX,0C79 DS,AX AX,0020 ES,AX BX,0000 CX,0018 AL,[BX]LOOP MOV INTPUSH AX LEA AX,[BP-80] ED8
B: A BB0D B:
E2F8 00 00 00 00 -q 检测点 6.1MOV MOV MOV MOV MOV MOV ES: MOV INCDS,AX AX,0020 ES,AX BX,0000 CX,0018 AL,[BX][BX],AL BX 0210 [BX+SI],AL [BX+SI],AL [BX+SI],AL [BX+SI],ALLOOP ADD ADD ADD ADD(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,完成程序: assume cs:codesg codesg segment dw h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: mov ax,[bx] mov cs:[bx],ax add bx,2 loop s mov ax,4c00h int 21h codesg ends end startC:\DOCUME~1\ADMINI~1&debug jc6-1.exe -u 0C79: 0C79: 0C79:0015 BB: 0C79:001B 8B07 0C79:001D 2E 0C79:001E : 0C79: 0C79:C 0C79:0028 CD21 0C79:002A :002C E97BFF 0C79:002F 5E -g 0025MOV MOV MOV MOV MOV CS: MOV ADD LOOP MOV INT JNZ JMP POP SIAX,0000 DS,AX BX,0000 CX,0008 AX,[BX][BX],AX BX,+02 001B AX,4C0021 002F FFAAAX=0680 BX=0010 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0000 ES=0C69 SS=0C79 CS=0C79 IP=0025 NV UP EI PL NZ AC PO NC 0C79:C -d 0:0 f
10 A7 00 BB 13 80 06-16 00 A5 03 B1 13 80 06 h............... -d 0c79:0 f 0C79: A7 00 BB 13 80 06-16 00 A5 03 B1 13 80 06 h............... -t AX=4C00 BX=0010 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=0000 ES=0C69 SS=0C79 CS=0C79 IP=0028 NV UP EI PL NZ AC PO NC 0C79:0028 CD21 -p Program terminated normally -q C:\DOCUME~1\ADMINI~1& INT 21 MOV AX,4C00检测点 6.1 (1) 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据, 完 成程序: assume cs:codesg codesg segment dw h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: mov ax,[bx] mov cs:[bx],ax add bx,2 loop s mov ax,4c00h int 21h codesg ends end start(2) 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据, 数 据的传送用栈来进行。栈空间设置在程序内。完成程序: assume cs:codesg codesg segment dw h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0 ;10 个字单元用栈空间 start: mov ax,cs mov ss,ax mov sp,36 mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: push [bx] pop cs:[bx] add bx,2 loop s mov ax,4c00h int 21h codesg ends end start实验 5 编写、调试具有多个段的程序(1) 将下面的程序编译连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code,ds:data,ss:stack data segment dw h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ① CPU 执行程序,程序返回前,data 段中的数据为多少? 解:不变 ② CPU 执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此题结果 因环境而异,但相对差值不变) ③ 设程序加载后,code 段的段地址为 X,则 data 段的段地址为 X-2,stack 段 的段地址为 X-1。(2) 将下面的程序编译连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code,ds:data,ss:stack data segment dw H data ends stack segment dw 0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start ① CPU 执行程序,程序返回前,data 段中的数据为多少? 解:不变 ② CPU 执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。 (此题结果 因环境而异,但相对差值不变) ③ 设程序加载后,code 段的段地址为 X,则 data 段的段地址为 X-2,stack 段 的段地址为 X-1。 ④对于如下定义的段: name segment ? name ends 如果段中的数据占 N 个字节,则程序加载后,这段实际占有的空间为 (N/16+1)*16. (N/16 为取整数部分) (3) 将下面的程序编译连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code,ds:data,ss:stack code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code endsdata segment dw H data ends stack segment dw 0,0 stack ends end start① CPU 执行程序,程序返回前,data 段中的数据为多少? 解:不变 ② CPU 执行程序,程序返回前,cs=155ah、ss=155eh、ds=155dh。 (此题结果 因环境而异,但相对差值不变) ③ 设程序加载后,code 段的段地址为 X,则 data 段的段地址为 X+3,stack 段 的段地址为 X+4。 (4) 如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也 就是说不指明程序的入口),则那个程序仍然可以正确执行?请说明原因。 解:(1)、(2)不能正确执行(入口默认为 data 段的第一条指令),(3)能正确执 行。 如果不指明程序的入口, 编译器自动默认整个代码的第一条指令为程序的入 口。 (经 qingxh1 指正,在此鸣谢) (5) 程序如下,编写 code 段中的内容,将 a 段和 b 段中的数据依次相加,将结 果存到 c 段中。 assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start: mov ax,a mov ds,ax mov bx,0 mov cx,8 s: mov al,ds:[bx] add al,ds:[bx+16] mov ds:[bx+32],al inc bx loop s mov ax,4c00h int 21h code ends end start (6) 程序如下, 编写 code 段中的代码, 用 push 指令将 a 段中的前 8 个字型数据, 逆序存储到 b 段中。 assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov ss,ax mov sp,16 mov cx,8 s: push [bx] inc bx inc bx loop s mov ax,4c00h int 21h code ends end start 第 7 章 更灵活的定位内存地址的方法 实验 6 实践课程中的程序 (1)略 (2) 编程,完成问题 7.9 中的程序。 编程,将 datasg 段中每个单词的前 4 个字母改写为大写字母。 assume cs:codesg,ss:stacksg,ds:datasg stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends datasg segment db '1. display ' db '2. brows ' db '3. replace ' db '4. modify ' datasg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: push cx mov si,0 mov cx,4 s: mov al,[bx+si+3] and al,b mov [bx+si+3],al inc si loop s add bx,16 pop cx loop s0 mov ax,4c00h int 21h codesg ends end start 第 8 章 数据处理的两个基本问题实验 7 寻址方式在结构化数据访问中的应用 编程, 将 data 段中的数据按如下格式写入到 table 段中,并计算 21 年中的人均 收入(取整),结果也按照下面的格式保存在 table 段中。解: assume cs:codesg,ds:data,es:table data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','1992' db '1993','1994','1995' ;以上是表示 21 年的 21 个字符串 dd 16,22,382,00,,,514 dd 827,,,5937000 ;以上是表示 21 年公司总收的 21 个 dword 型数据 dw 3,7,9,13,28,38,130,220,476,778,58,35,8226 dw , ;以上是表示 21 年公司雇员人数的 21 个 word 型数据 data ends table segment db 21 dup('year summ ne ?? ') table ends codesg segment start: mov ax,data mov ds,ax mov si,0 mov ax,table mov es,ax mov di,0 mov s: mov mov mov mov mov mov mov mov cx,21 ax,ds:[si] ;年份转送 es:[di],ax ax,ds:[si+2] es:[di+2],ax ax,ds:[si+84] ;收入转送 es:[di+5],ax dx,ds:[si+84+2] es:[di+7],dx保护 cx mov cx,ds:[84+84+bx] ;雇员数转送 mov es:[di+0ah],计算人均收入 pop cx mov es:[di+0dh],人均收入转送 add si,4 add bx,2 add di,16 loop s mov ax,4c00h int 21h codesg ends end start 第 9 章 转移指令的原理检测点 9.1(1) 程序如下。 assume cs:code data segment db 0,0,0 data ends code segment start: mov ax,data mov ds,ax mov bx,0 jmp word ptr [bx+1] code ends end start 若要使程序中的 jmp 指令执行后,CS:IP 指向程序的第一条指令,在 data 段中 应该定义哪些数据?(2) 程序如下。 assume cs:code,ds:data data segment dd h data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov [bx],bx mov [bx+2],cs jmp dword ptr ds:[0] code ends end start 补全程序,使 jmp 指令执行后,CS:IP 指向程序的第一条指令。(3)用 Debug 查看内存,结果如下:
BE 00 06 00 00 00 ......则此时,CPU 执行指令:mov ax,2000H mov es,ax jmp dword ptr es:[1000H] 后,(CS)=? , (IP)=?解:CS=0006H,IP=00BEH检测点 9.2补全编程, 利用 jcxz 指令, 实现在内存 2000H 段中找查第一个值为为 0 的字节, 找到后,将它的偏移地址存储在 dx 中。 assume cs:code code segment start: mov ax,2000H mov ds,ax mov bx,0 s: mov ch,0 mov cl,[bx] jcxz ok inc bx jmp short s ok: mov dx,bx mov ax,4c00h int 21h code ends end start检测点 9.3补全程序,利用 loop 指令,实现在内存 2000H 段中查找第一个值为 0 的字节, 找到后,将它的偏移地址存储在 dx 中。assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s: mov cl,[bx] mov ch,0 inc cx inc bx loop s ok: dec bx mov dx,bx mov ax,4c00h int 21h code ends end start实验 8 分析一个奇怪的程序分析下面的程序,在运行前思考:这个程序可以正确返回吗? 运行后再思考:为什么是这种结果? 通过这个程序加深对相关内容的理解。 assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov mov mov mov di,offset s si,offset s2 ax,cs:[si] cs:[di],axs0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nopcodesg ends end start 解:可以正常返回,jmp short s1 的机器码是 EBF6,即使当前的 IP=IP-10,将 这条指令移动到 s:处后,jmp short s1 不会指到 s1 了,而是指到相对当前位 置(jmp short s1 的下一条指令)的-10 的位置(mov ax,4c00h),所以这个程序可 以正常返回。实验 9 根据材料编程编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。解: assume cs:code data segment db 'welcome to masm!' data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov si,0 mov di,10*160+80 ;第十行中间 mov cx,16 s1: mov al,ds:[si] mov ah,B ;绿色 mov es:[di],ax inc si inc di inc di loop s1 mov si,0 mov di,11*160+80 ;第十一行中间 mov cx,16 s2: mov al,ds:[si] mov ah,B ;绿底红色 mov es:[di],ax inc si inc di inc di loop s2 mov si,0 mov di,12*160+80 ;第十二行中间 mov cx,16 s3: mov al,ds:[si] mov ah,B ;白底蓝色 mov es:[di],ax inc si inc di inc di loop s3 mov ax,4c00h int 21如果要看到完整的显示请输入:“-g 4c”,即立即运行到此条指令 code ends end start注:此程序如果利用后面所学知识,可以将三次显示嵌套简化为一次。 第 10 章 CALL 和 RET 指令检测点 10.1补全程序,实现从内存
处开始执行指令。 assume cs:code stack segment db 16 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,1000h push ax mov ax,0 push ax retf code ends end start检测点 10.2下面的程序执行后,ax 中的数值为多少? 内存地址 机器码 汇编指令
00 00 mov ax,0
01 00 call s
s:pop ax 解:ax=6 检测点 10.3下面的程序执行后,ax 中的数值为多少? 内存地址 机器码 汇编指令
00 00 mov ax,0 a 09 00 00 10 call far ptr s
s:pop ax add ax,ax pop bx add ax,bx解:ax=1010h检测点 10.4下面的程序执行后,ax 中的数值为多少? 内存地址 机器码 汇编指令
06 00 mov ax,6 1000:2 ff d0 call ax
inc ax 1000:6 mov bp,sp add ax,[bp] 解:ax=11检测点 10.5(1)下面的程序执行后,ax 中的数值为多少? 注:不能用单步中断测试程序,中断涉及堆栈操作,不能带便 CPU 的真实执行结 果。 assume cs:code stack segment dw 8 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ds,ax mov ax,0 call word ptr ds:[0EH] inc ax inc ax inc ax mov ax,4c00h int 21h code ends end start 解:ax=3(2)下面的程序执行后,ax 中的数值为多少? assume cs:code stack segment dw 8 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov word ptr ss:[0],offset s mov ss:[2],cs call dword ptr ss:[0] nop s: mov ax,offset s sub ax,ss:[0cH] mov bx,cs sub bx,ss:[0eH] mov ax,4c00h int 21h code ends end start解:ax=1,bx=0 实验 10 编写子程序1.显示字符串;名称:show_功能:在屏幕的指定位置,用指定颜色,显示一个用 0 结尾的字符串 ;参数:(dh)=行号,(dl)=列号(取值范围 0~80),(cl)=颜色,ds:si: 该字符串的首地址 ;返回:显示在屏幕上 assume cs:daima shuju segment db 'fghfghf',0 shuju endsdaima segment kaishi: mov dh,8 mov dl,21 mov cl,2 mov ax,shuju mov ds,ax mov si,0 call show_str mov ax,4c00h int 21---------------------------show_str: push ax push cx push dx push es push si push di mov ax,0b800h mov es,ax dec mov mul add dh al,160 dh dl,dl mov dh,0 ;计算显示在屏幕位置 add ax,dx mov di,ax mov ah,cl x: mov cl,ds:[si] mov ch,0 jcxz f mov al,cl mov es:[di],ax inc si inc di inc di jmp x f: pop di pop si pop es pop d-----------------------daima ends end kaishi2.解决除法溢出问题;名称:功能:除法,被除数 32 位,除数 16 位,商 32 位,余数 16 位,不会溢出 ;参数:(dx)=被除数高 16 位,(ax)=被除数低 16 位,(cx)=除数 ;返回:(dx)=商高 16 位,(ax)=商低 16 位,(cx)=余数 assume cs:daima daima segment kaishi: mov ax,2390 mov dx,0 mov cx,10 call divdw mov ax,4c00h int 21----------------------------divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,-------------------------------daima ends end kaishi3.数值显示;名称:dtoc_功能:将一个 word 型数转化为字符串 ;参数:(ax)=word 型的数据,ds:si 指向字符串的首地址 ;返回:ds:[si]放此字符串,以 0 结尾assume cs:daima shuju segment db 20 dup(1) shuju ends daima segment kaishi: mov ax,shuju mov ds,ax mov ax,10100 call dtoc_word mov ax,4c00h int 21h;-----------------------------dtoc_word: push ax push bx push cx push dx push si mov bx,0 x: mov dx,0 mov cx,10 div cx mov cx,ax add dx,'0' push dx inc bx jcxz f jmp x f: mov cx,bx x1: pop ds:[si] inc si loop x1 pop pop pop pop pop si dx cx bx ax---------------------------daima ends end kaishi 课程设计 1任务:将实验 7 中的 Power idea 公司的数据按照图 10.所示的格式在屏幕上显 示出来。 解: ;注:函数中的标号为防止冲突,都加了本函数名为前缀 ;在 Debug 中输入“-g 90”,直接运行到结束 assume cs:code data segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','1992' db '1993','1994','1995' ;以上是表示 21 年的 21 个字符串 dd 16,22,382,00,,,514 dd 827,,,5937000 ;以上是表示 21 年公司总收的 21 个 dword 型数据 dw 3,7,9,13,28,38,130,220,476,778,58,35,8226 dw , ;以上是表示 21 年公司雇员人数的 21 个 word 型数据 data ends agency segment db 8 dup(0) agency endscode segment start: mov ax,0b800h mov es,ax mov di,0 mov cx,80*24 x: mov byte ptr es:[di],' ' ;将屏幕清空 mov byte ptr es:[di+1],0 inc di inc di loop x mov mov mov mov ax,data es,ax di,0 bx,0mov ax,agency mov ds,ax mov si,0 mov dh,4 mov cx,21 x1: push cx mov ax,es:[di] mov ds:[si],ax mov ax,es:[di+2] mov ds:[si+2],ax mov byte ptr ds:[si+4],0 ;显示年份 mov dl,0 mov cl,2 call show_str mov ax,es:[84+di] push dx mov dx,es:[84+di+2] call dtoc_显示收入 pop dx mov dl,20 mov cl,2 call show_strmov ax,es:[84+84+bx] call dtoc_word mov dl,40 ;显示雇员数 mov cl,2 call show_strmov ax,es:[84+di] push dx mov dx,es:[84+di+2] div word ptr es:[84+84+bx] ;计算人均收入并显示 call dtoc_word pop dx mov dl,60 mov cl,2 call show_stradd di,4 add bx,2 add dh,1 pop cx loop x1 mov ax,4c00h int 21h;名称:show_功能:在屏幕的指定位置,用指定颜色,显示一个用 0 结尾的字符串 ;参数:(dh)=行号,(dl)=列号(取值范围 0~80),(cl)=颜色,ds:si: 该字符串的首地址 ;返回:显示在屏幕上 show_str: push ax push cx push dx push es push si push di mov ax,0b800h mov es,ax mov al,160 mul dh add mov add movdl,dl dh,0 ax,dx di,axmov ah,cl show_str_x: mov cl,ds:[si] mov ch,0 jcxz show_str_f mov al,cl mov es:[di],ax inc si inc di inc di jmp show_str_x show_str_f: pop di pop si pop es pop d名称:dtoc_功能:将一个 word 型数转化为字符串 ;参数:(ax)=word 型的数据,ds:si 指向字符串的首地址 ;返回:ds:[si]放此字符串,以 0 结尾 dtoc_word: push ax push bx push cx push dx push si mov bx,0 dtoc_word_x: mov dx,0 mov cx,10 div cx mov cx,ax add dx,'0' push dx inc bx jcxz dtoc_word_f jmp dtoc_word_x dtoc_word_f: mov cx,bx dtoc_word_x1: pop ds:[si] inc si loop dtoc_word_x1 pop 名称:dtoc_功能:将一个 double word 型数转化为字符串 ;参数:(dx)=数的高八位,(ax)=数的低八位 ;返回:ds:[si]放此字符串,以 0 结尾 ;备注:会用到 divdw 函数 dtoc_dword: push ax push bx push cx push dx push si mov bx,0 dtoc_dword_x: mov cx,10 call divdw push cx inc bx cmp ax,0 jne dtoc_dword_x cmp dx,0 jne dtoc_dword_x mov cx,bx si dx cx bx ax dtoc_dword_x1: pop ds:[si] add byte ptr ds:[si],'0' inc si loop dtoc_dword_x1 pop 名称:功能:除法,被除数 32 位,除数 16 位,商 32 位,余数 16 位,不会溢出 ;参数:(dx)=被除数高 16 位,(ax)=被除数低 16 位,(cx)=除数 ;返回:(dx)=商高 16 位,(ax)=商低 16 位,(cx)=余数 divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret si dx cx bx axcode ends end start 第 11 章 标志寄存器检测点 11.1写出下面每条指令后,ZF、PF、SF 等标志位的值。 ZF PF SF sub al,al 1 1 0 mov al,1 1 1 0 push ax 1 1 0 pop bx 1 1 0 add al,bl 0 0 0 add al,10 0 1 0 mul al 0 1 0检测点 11.2 CF OF SF ZF PF sub al,al 0 0 0 1 1 mov al,10H 0 0 0 1 1 add al,90H 0 0 1 0 1 mov al,80H 0 0 1 0 1 add al,80H 1 1 0 1 1 mov al,0FCH 1 1 0 1 1 add al,05H 1 0 0 0 0 mov al,7DH 1 0 0 0 0 add al,0BH 0 1 1 0 1 检测点 11.3 (1) 补全下面的程序, 统计 F000:0 处 32 个字节中,大小在[32,128]的数据的个 数。 mov ax,0f000h mov ds,ax mov bx,0 mov dx,0 mov cx,32 s:mov al,[bx] cmp al,32 jb s0 cmp al,120 ja s0 inc dx s0:inc bx loop s (2) 补全下面的程序, 统计 F000:0 处 32 个字节中,大小在(32,128)的数据的个 数。 mov ax,0f000h mov ds,ax mov bx,0 mov dx,0 mov cx,32 s:mov al,[bx] cmp al,32 jna s0 cmp al,120 jnb s0 inc dx s0:inc bx loop s 检测点 11.4 下面的程序执行后:(ax)=? mov ax,0 push ax popf mov ax,0fff0h add ax,0010h pushf pop ax and al,B and ah,B解:(ax)=B 实验 11 编写子程序;名称:功能:将以 0 结尾的字符串中的小写字母转变成大写字母 ;参数:ds:si 开始存放的字符串 ;返回:ds:si 开始存放的字符串assume cs:codesg datasg segment db &Beginner's All-purpose Symbolic Instruction Code.&,0 datasg ends codesg segment begin: mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h letterc: push si push ax x: mov al,ds:[si] cmp al,0 je f inc si cmp al,'a' jb x cmp al,'z' ja x add al,'A'-'a' mov ds:[si-1],al jmp x f: pop ax pop si ret codesg ends end begin 第 12 章 内中断 检测点 12.1 (1) 用 Debug 查看内存,情况如下:
10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00 则 3 号中断源对应的中断处理程序的入口地址为:B 。 (2) 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为: 4N 。 存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为: 4N+2 。实验 12 编写 0 号中断的处理程序 编写 0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串 “divide error!”,然后返回到 DOS。解:assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-安装中断例程 cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21hdo:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*10+80 mov cx,13 s: mov al,ds:[si] mov ah,2 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start 第 13 章 int 指令检测点 13.1(1) 在上面的内容中, 我们用 7ch 中断例程实现 loop 的功能, 则上面的 7ch 中 断例程能进行的最大转移位移是多少? 解:8000H~7FFFH 即(-) (2)用 7ch 中断例程完成 jmp near ptr s 指令的功能,用 bx 向中断例程传送转 移位移。 应用举例:在屏幕的第 12 行显示 data 段中,以 0 结尾的字符串。assume cs:code data segment db 'conversation',0 data endscode segment start: mov ax,cs mov ds,ax mov si,offset jp mov ax,0 mov es,ax mov di,200h mov cx,offset jpend-安装中断例程 cld rep movsb mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量表mov ax,data mov ds,ax mov si,0 mov ax,0b800h mov es,ax mov di,12*160 s:cmp byte ptr [si],0 je ok mov al,[si] mov es:[di],al inc si add di,2 mov bx,offset s-测试 int 7ch int 7ch ok:mov ax,4c00h int 21h jp:push bp mov bp,sp add [bp+2],中断例程 pop bp iret jpend:nop code ends end start检测点 13.2判断下面说法的正误: (1)我们可以编程改变 FFFF:0 处的指令,使得 CPU 不去执行 BIOS 中的硬件系统 检测和初始化程序。 答:错。因为该内存单元具有‘只读’属性。 (2)int 19h 中断例程,可以由 DOS 提供。 答:这种说法是错误的。因为 int 19h 是在 DOS 启动之前就被执行的中断例程, 是由 BIOS 提供的。实验 13 编写、应用中断例程(1)编写并安装 int 7ch 中断例程,功能为显示一个用 0 结束的字符串, 中断例程安装在 0:200 处。参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si 指向字符串首地址。 assume cs:code data segment db 'welcome to masm!',0 data endscode segment start: mov ax,cs mov ds,ax mov si,offset dp mov ax,0 mov es,ax mov di,200h mov cx,offset dpend-安装中断例程 cld rep movsb mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量表mov mov mov mov mov mov intdh,10 dl,10 cl,2 ax,data ds,测试 int 7ch si,0 7chmov ax,4c00h int 21h dp: mov mul add mov add moval,160 dh dl,dl dh,0 ax,dx di,axmov ax,0b800h mov es,中断例程 s: mov al,ds:[si] mov ah,0 cmp ax,0 je f mov ah,cl mov es:[di],ax inc si inc di inc di jmp s f: iret dpend:nop code ends end start(2)编写并安装 int 7ch 中断例程,功能为完成 loop 指令的功能。参数:(cx)=循环次数,(bx)=位移 assume cs:codecode segment start: mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpend-安装中断例程 cld rep movsb mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量表mov mov mov mov mov s: mov add intax,0b800h es,ax di,160*12 bx,offset s-offset se cx,80 byte ptr es:[di],'!' ;测试 int 7ch di,2 7ch se: nop mov ax,4c00h int 21h lp: push bpdec cx jcxz f mov bp,sp add [bp+2],中断例程 f: pop bp iret lpend:nop code ends end start(3)下面的程序,分别在屏幕的第 2、4、6、8 行显示四句英文诗,补全 程序。assume cs:code code segment s1: db 'Good,better,best,','$' s2: db 'Never let it rest,','$' s3: db 'Till good is better,','$' s4: db 'And better,best.','$' s: dw offset s1,offset s2,offset s3,offset s4 row: db 2,4,6,8start: mov ax,cs mov mov mov mov ok: mov mov mov intds,ax bx,offset s si,offset row cx,4 mov bh,0 dh,[si] dl,0 ah,2 10hmov dx,[bx] mov ah,9 int 21h inc si add bx,2 loop ok mov ax,4c00h int 21h code ends end start 第 14 章 端口检测点 14.1(1)编程:读取 CMOS RAM 的 2 号单元的内容。 解: assume cs:code code segment start: mov al,2 out 70h,al in al,71hmov ax,4c00h int 21h code ends end start (2) 编程:向 CMOS RAM 的 2 号单元写入 0。解: assume cs:code code segment start: mov out mov out al,2 70h,al al,0 71h,almov ax,4c00h int 21h code ends end start检测点 14.2编程:用加法和移位指令计算(ax)=(ax)*10 提示:(ax)*10=(ax)*2+(ax)*8 解: assume cs:code code segment start: mov ax,2 shl mov shl shl add ax,1 bx,ax ax,1 ax,1 ax,bx mov ax,4c00h int 21h code ends end start实验 14 访问 CMOS RAM编程:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。 解: assume cs:code data segment time db 'yy/mm/dd hh:mm:ss$' ;int 21h 显示字符串,要求以$结尾 table db 9,8,7,4,2,0 ;各时间量的存放单元 data ends code segment start: mov ax,data mov ds,ax mov si,offset table mov di,offset time mov cx,6 s: push cx mov al,ds:[si] ;读端口 out 70h,al in al,71h mov mov shr and ah,al cl,4 ah,将压缩 BCD 码分为两个 BCD 码 al,badd ah,30变为字符 add al,30h mov ds:[di],ah mov ds:[di+1],写进 time inc si add di,3 pop cx loop smov mov mov mov intah,0 bh,0 dh,10 ;置光标于 10 行 40 列 dl,40 10hmov dx,offset time mov ah,9 ;显示字符串 int 21h mov ax,4c00h int 21hcode ends end start 第 15 章 外中断检测点 15.1(1)仔细分析一下上面的 int 9 中断例程,看看是否可以精简一下? 其实在我们的 int 9 中断例程中,模拟 int 指令调用原 int 9 中断例程的程序段 是可以精简的,因为在进入中断例程后,IF 和 TF 都已经置 0,没有必要再进行 设置可。对于程序段: pushf pushf pop ax and ah,b push ax popf call dword ptr ds:[0] 可以精简为: pushf call dword ptr ds:[0] 两条指令。 (2)仔细分析上面程序中的主程序[第 269 页],看看有什么潜在的问题? 在主程序中,如果在执行设置 int 9 中断例程的段地址和偏移地址的指令之间发 生了键盘中断,则 CPU 将转去一个错误的地址执行,将发生错误。 找出这样的程序段,改写它们,排除潜在的问题。 提示:注意 sti 和 cli 指令的用法。 解: 将 mov word ptr es:[9*4],offset int9 mov es:[9*4+2],cs 扩充为: cli mov word ptr es:[9*4],offset int9 mov es:[9*4+2],cs sti实验 15 安装新的 int 9 中断例程安装一个新的 int9 中断例程, 功能: 在 DOS 下, 按下“A”键后, 除非不再松开, 如果松开,就显示满屏幕的“A”;其他的键照常处理。 提示: 按下一个键时产生的扫描码称为通码, 松开一个键产生的扫描码称为断码。 断码=通码+80H。 解: assume cs:code code segment start: mov mov mov mov mov mov mov cld rep ax,cs ds,安装自定义的 int9 中断例程 ax,0 es,ax si,offset int9 di,204h cx,offset int9end-offset int9 movsbpush es:[9*4] pop es:[200h] push es:[9*4+2] pop es:[202h] ;保存原中断向量cli mov word ptr es:[9*4],204h mov word ptr es:[9*4+2],0 ;设置自定义的中断向量 sti mov ax,4c00h int 21h int9: push ax push cx push es push di in al,60读入扫描码 pushf call dword ptr cs:[200h] ;调用原 int 9 终端 cmp al,1EH+80H ;是否为 A 的断码 jne int9ret mov ax,0b800h mov es,ax mov di,0 mov cx,80*20 s: mov byte ptr es:[di],'A' ;显示满屏 A add di,2 loop s int9ret:pop di pop es pop cx pop ax iret int9end:nop code ends end start 第 16 章 直接定址表检测点 16.1下面的程序将 code 段中 a 处的 8 个数据累加,结果存储到 b 处的双字中,补全 程序。assume cs:code code segment a dw 1,2,3,4,5,6,7,8 b dw 0,0 ;原题是 b dd 0,0 但这样下面无法体现本节内容,估计是作者写错了, 我在此更正 start: mov si,0 mov cx,8 s: mov ax,a[si] add b,ax adc b[2],0 add si,2 loop smov ax,4c00h int 21h code ends end start检测点 16.2下面的程序将 code 段中 a 处的 8 个数据累加,结果存储到 b 处的双字中,补全 程序。assume cs:code,es:data data a db b dw data segment 1,2,3,4,5,6,7,8 0 endscode segment start: mov ax,data mov es,ax mov si,0 mov cx,8 s: mov al,a[si] mov ah,0 add b,ax inc si loop smov ax,4c00h int 21h code ends end start实验 16 编写包含多个功能子程序的中断例程 安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序。 (1)清屏 (2)设置前景色 (3)设置背景色 (4)向上滚动一行 入口参数说明如下。 (1)用 ah 寄存器传递功能号:0 表示清屏,1 表示设置前景色,2 表示设置背景 色,3 表示向上滚动一行; (2)对于 2、3 号功能,用 al 传递颜色值,(al)∈{0,1,2,3,4,5,6,7}。解:;介绍:编写中断例程:显示字符串 assume cs:daima daima segment kaishi: mov ax,0 mov ds,ax mov word ptr ds:[7ch*4],200设置中断向量表 mov word ptr ds:[7ch*4+2],0 mov mov mov mov mov mov mov cld rep ax,cs ds,ax si,offset int7ch ax,0 es,ax di,200h cx,offset int7chend-offset int7安装中断例程 movsbmov ah,2 mov al,2 ;测试一下 int 7ch mov ax,4c00h int 21h ORG 200H ;此程序的点睛之笔, ;伪指令, 表示下一条指令从偏移地址 200H 开始,正好和安装后的偏移地址相同 ;因为如果没有 ORG 200H,此中断例程被安装以后,标号所代表的地址变了,和 之前编译器编译的有别int7ch: jmp short begin table dw sub1,sub2,sub3,sub4 begin: push bx cmp ah,3 ja f mov bl,ah mov bh,0 add bx,bx call word ptr table[bx] f: pop bx iretsub1: push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000 sub1s: mov byte ptr es:[bx],' ' add bx,2 loop sub1s pop es pop cx pop bx ret sub2: push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub2s: and byte ptr es:[bx],b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx retsub3: push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000 sub3s: and byte ptr es:[bx],b or es:[bx],al add bx,2 loop sub3s pop es pop cx pop bx retsub4: push cx push si push di push es push ds mov mov mov mov mov si,0b800h es,si ds,si si,160 di,0 cld mov cx,24 sub4s: push cx mov cx,160 rep movsb pop cx loop sub4s mov cx,80 mov si,0 sub4s1: mov byte ptr [160*24+si],' ' add si,2 loop sub4s1 pop pop pop pop pop ret ds es di si cxint7chend:nop daima ends end kaishi
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 a方加b方大于等于2ab 的文章

 

随机推荐