王爽《汇编语言》第二版习题答案(全)

更新时间:2023-05-09 05:03:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

教材:《汇编语言》(2008年4月第2版),王爽著,清华大学出版社。

长期以来,汇编语言被认为是一门枯燥难学的课程,但王爽老师的著作《汇编语言》解决了这个问题。

本人仅将自己在学习此书时所做的答案及一些个人笔记进行了整理并编辑成集,方便日后查阅。

后因朋友要求,发于网上共享。

检测点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(即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)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

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

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:0100 B8A3F4 MOV AX,F4A3

-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:0103 B431 MOV AH,31

-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 0C1C:0105 B023 MOV AL,23

-t

AX=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:0107 01C0 ADD AX,AX

-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 MOV BX,826C

-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 MOV CX,AX

-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 MOV AX,BX

-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:0110 01D8 ADD AX,BX

-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:0112 88F8 MOV AL,BH

-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 MOV AH,BL

-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:0116 00E4 ADD AH,AH

-t

AX=D882 BX=826C CX=6246 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0118 OV UP EI NG NZ AC PE NC

0C1C:0118 0406 ADD AL,06

-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 ADD AL,AL

-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 MOV AX,CX

-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 OR CX,[SI] DS:0000=20CD -q

检测点2.1

(2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。

mov ax,2 AX=2

add ax,ax AX=4

add ax,ax AX=8

add ax,ax AX=16

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

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:0100 B80200 MOV AX,0002

-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:0103 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=0C1C IP=0105 NV UP EI PL NZ NA PO NC

0C1C:0105 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=0C1C IP=0107 NV UP EI PL NZ NA PO NC

0C1C:0107 01C0 ADD AX,AX

-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:0109 20881615 AND [BX+SI+1516],CL DS:1516=00

-q

检测点2.2

(1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。

解题过程:

物理地址=SA*16+EA

EA的变化范围为0h~ffffh

物理地址范围为(SA*16+0h)~(SA*16+ffffh)

现在SA=0001h,那么寻址范围为

(0001h*16+0h)~(0001h*16+ffffh)

=0010h~1000fh

检测点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-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=0000 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

实验一查看CPU和内存,用机器指令和汇编指令编程

(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

实验一查看CPU和内存,用机器指令和汇编指令编程

(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的内存单元为只读存储器,写入数据操作是无效的。

因此出产日期无法改变。

下面内容摘自于网上

还有另一种情况,如果你发现你能修改ROM中的生产日期,那么原因如下:

每个计算机的结构都不一样,教材考虑的是普通8086PC机上的效果,个别计算机的效果可能不同。

也就是说在你的计算机中这个内存是可修改的

所以,认为所有的计算机某些地址的内存不能修改是片面的。

书上说rom是只读的你就不去验证了吗?如何验证呢?

我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神,怀疑之后再去验证才能跟深刻的理解知识,提升自己的能力,甚至还会发现有些书上描述的不准确甚至错误的地方。

--引用这几本书综合研究的三个问题:

都再用,我们就非得用吗?

规定了,我们就只知道遵守吗?

司空见惯,我们就不怀疑了吗?

尽信书不如无书大概也有这个道理吧^_^

检测点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

用DEBUG进行验证:

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

C:\DOCUME~1\000>debug

-e 0000:0

0000:0000 68.70 10.80 A7.f0 00.30 8B.ef 01.60 70.30 00.e2 0000:0008 16.00 00.80 AF.80 03.12 8B.66 01.20 70.22 00.60 0000:0010 8B.62 01.26 70.e6 00.d6 c42cea01cc175527072208d2 06.2e 14.3c 02.3b 0000:0018 40.ab 07.ba 14.00 02.00 FF.26 03.06 14.66 02.88

-d 0000:0 1f

0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60 p..0.`0.....f "` 0000:0010 62 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,[0000]

0DB4:0108 mov bx,[0001]

0DB4:010C mov ax,bx

0DB4:010E mov ax,[0000]

0DB4:0111 mov bx,[0002]

0DB4:0115 add ax,bx

0DB4:0117 add ax,[0004]

0DB4:011B mov ax,0

0DB4:011E mov al,[0002]

0DB4: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:0100 B80100 MOV AX,0001

-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:0103 8ED8 MOV DS,AX

-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:0105 A10000 MOV AX,[0000] DS:0000=2662 -t

AX=2662 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0001 ES=0DB4 SS=0DB4 CS=0DB4 IP=0108 NV UP EI PL NZ NA PO NC

0DB4:0108 8B1E0100 MOV BX,[0001] DS:0001=E626 -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 MOV AX,BX

-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 MOV AX,[0000] DS:0000=2662 -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:0111 8B1E0200 MOV BX,[0002] DS:0002=D6E6 -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:0115 01D8 ADD AX,BX

-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:0117 03060400 ADD AX,[0004] DS:0004=2ECC -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 MOV AX,0000

-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 MOV AL,[0002] DS:0002=E6 -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 MOV BX,0000

-t

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:0124 8A1E0C00 MOV BL,[000C] DS:000C=26 -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:0128 00D8 ADD AL,BL

-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 BYTE PTR [9917],FF DS:9917=9A -q

检测点3.1

(2) 内存中的情况如图3.6所示

各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;

①写出CPU执行的指令序列(用汇编指令写出)。

②写出CPU执行每条指令后,CS、IP和相关寄存器的数值。

③再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

图3.6内存情况示意

检测点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]

检测点3.2

(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

此实验答案不定,需根据每台机器的实际运行情况。

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

C:\DOCUME~1\ADMINI~1>debug

-a

0C1C:0100 mov ax,ffff

0C1C:0103 mov ds,ax

0C1C:0105 mov ax,2200

0C1C:0108 mov ss,ax

0C1C:010A mov sp,0100

0C1C: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 MOV AX,FFFF

-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:0103 8ED8 MOV DS,AX

-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:0105 B80022 MOV AX,2200

-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:0108 8ED0 MOV SS,AX

-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 MOV AX,[0000] DS:0000=5BEA -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:0110 03060200 ADD AX,[0002] DS:0002=00E0 -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:0114 8B1E0400 MOV BX,[0004] DS:0004=31F0 -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

0C1C:0118 031E0600 ADD BX,[0006] DS:0006=2F32

-t

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 PUSH AX

-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 PUSH BX

-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 POP AX

-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 POP BX

-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 PUSH [0004] DS:0004=31F0

-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 PUSH [0006] DS:0006=2F32

-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 PUSH SS

-q

实验2 用机器指令和汇编指令编程

(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变?

图3.19 用Debug进行实验的示例

答:因为在debug使用T等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以,你的栈里就有些不是你操作的数据了。

这个问题后面会学到,不过这里也要有个印象,因为如果是在中断过程中压栈是栈越界的话,在windows 下的命令窗口会强制关闭的。这个可能在你跟踪一些程序的时候会遇到,到时候有个思考方向。

实验3 编程、编译、连接、跟踪

(1) 将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。

assume cs:codesg

codesg segment

mov ax,2000H

mov ss,ax

mov sp,0

add sp,10

pop ax

pop bx

push ax

push bx

pop ax

pop bx

mov ax, 4c00h

int 21H

codesg ends

end

按书中所示,从DOS进入EDIT

完成后保存文件为t1.asm

退出EDIT,进行编译,连接

生成可执行文件t1.exe

实验3 编程、编译、连接、跟踪

(2) 用DEBUG跟踪t1.exe的执行过程,写出第一步执行后,相关寄存器的内容和栈顶内容。

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

C:\DOCUME~1\ADMINI~1>debug t1.exe

-r

AX=0000 BX=0000 CX=0016 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=0C79 CS=0C79 IP=0000 NV UP EI PL NZ NA PO NC

0C79:0000 B80020 MOV AX,2000

-t

AX=2000 BX=0000 CX=0016 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=0C79 CS=0C79 IP=0003 NV UP EI PL NZ NA PO NC

0C79:0003 8ED0 MOV SS,AX

-t

AX=2000 BX=0000 CX=0016 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=0008 NV UP EI PL NZ NA PO NC

0C79:0008 83C40A ADD SP,+0A

-t

AX=2000 BX=0000 CX=0016 DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=000B NV UP EI PL NZ NA PE NC

0C79:000B 58 POP AX

-d 2000:0 f

2000:0000 00 20 00 00 0B 00 79 0C-80 06 79 0C 80 06 00 1F . ....y...y.....

-t

AX=0C79 BX=0000 CX=0016 DX=0000 SP=000C BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=000C NV UP EI PL NZ NA PE NC

0C79:000C 5B POP BX

-d 2000:0 f

2000:0000 00 20 79 0C 00 00 0C 00-79 0C 80 06 80 06 00 1F . y.....y....... -t

AX=0C79 BX=0680 CX=0016 DX=0000 SP=000E BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=000D NV UP EI PL NZ NA PE NC

0C79:000D 50 PUSH AX

-d 2000:0 f

2000:0000 00 20 79 0C 79 0C 00 00-0D 00 79 0C 80 06 00 1F . y.y.....y..... -t

AX=0C79 BX=0680 CX=0016 DX=0000 SP=000C BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=000E NV UP EI PL NZ NA PE NC

0C79:000E 53 PUSH BX

-d 2000:0 f

2000:0000 00 20 79 0C 00 00 0E 00-79 0C 80 06 79 0C 00 1F . y.....y...y... -t

AX=0C79 BX=0680 CX=0016 DX=0000 SP=000A BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=000F NV UP EI PL NZ NA PE NC

0C79:000F 58 POP AX

-d 2000:0 f

2000:0000 79 0C 00 00 0F 00 79 0C-80 06 80 06 79 0C 00 1F y.....y.....y... -t

AX=0680 BX=0680 CX=0016 DX=0000 SP=000C BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=0010 NV UP EI PL NZ NA PE NC

0C79:0010 5B POP BX

-d 2000:0 f

2000:0000 79 0C 80 06 00 00 10 00-79 0C 80 06 79 0C 00 1F y.......y...y... -t

AX=0680 BX=0C79 CX=0016 DX=0000 SP=000E BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=0011 NV UP EI PL NZ NA PE NC

0C79:0011 B8004C MOV AX,4C00

-t

AX=4C00 BX=0C79 CX=0016 DX=0000 SP=000E BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=2000 CS=0C79 IP=0014 NV UP EI PL NZ NA PE NC

0C79:0014 CD21 INT 21

-p

Program terminated normally

-q

实验3 编程、编译、连接、跟踪

(3)PSP的头两个字节是CD20,用DEBUG加载t1.exe,查看PSP的内容。

Microsoft(R) Windows DOS

(C)Copyright Microsoft Corp 1990-2001.

C:\DOCUME~1\ADMINI~1>debug t1.exe

-r

AX=0000 BX=0000 CX=0016 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=0C69 ES=0C69 SS=0C79 CS=0C79 IP=0000 NV UP EI PL NZ NA PO NC

0C79:0000 B80020 MOV AX,2000

-d 0c69:0

0C69:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 80 06 8A 03 . ........O..... 0C69:0010 80 06 17 03 80 06 6F 06-01 01 01 00 02 FF FF FF ......o......... 0C69:0020 FF FF FF FF FF FF FF FF-FF FF FF FF 2D 0C 4C 01 ............-.L. 0C69:0030 40 0B 14 00 18 00 69 0C-FF FF FF FF 00 00 00 00 @.....i......... 0C69:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0C69:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........

0C69:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .....

0C69:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........ -q

检测点6.1

(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:assume cs:codesg

codesg segment

dw 0123h,0456h,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

C:\DOCUME~1\ADMINI~1>debug jc6-1.exe

-u

0C79:0010 B80000 MOV AX,0000

0C79:0013 8ED8 MOV DS,AX

0C79:0015 BB0000 MOV BX,0000

0C79:0018 B90800 MOV CX,0008

0C79:001B 8B07 MOV AX,[BX]

0C79:001D 2E CS:

0C79:001E 8907 MOV [BX],AX

0C79:0020 83C302 ADD BX,+02

0C79:0023 E2F6 LOOP 001B

0C79:0025 B8004C MOV AX,4C00

本文来源:https://www.bwwdw.com/article/o2te.html

Top