文档库 最新最全的文档下载
当前位置:文档库 › 微机原理课后习题答案

微机原理课后习题答案

2.1 8086 CPU 在内部结构上由哪几部分组成?其功能是什么?

【答】8086 的内部结构-成两部分:总线接口部件BIU,负责控制存储器读写。执行部件EU,EU 从指令队列中取出指令并执行。8086 是16 位微处理器,有16 根数据线、20 根地址线,内部寄存器、运算部件以及内部操作都是按16 位设计的。

2.2 8086 的总线接口部件有那几部分组成?

【答】8086 的总线接口部件主要由下面几部分组成:4 个段寄存器CS/DS/ES/SS, 一个16 位

的指令指针寄存器IP, 一个20 位地址加法器, 6 字节的指令队列,内部暂存器以及输入输出

电路组成.

2.3 8086 的执行部件有什么功能?由那几部分组成?

【答】8086 的执行部件主要由下面几部分组成:(1)四个16 位通用寄存器AX、BX、CX、DX, 通用四个16 位专用寄存器,包括二个指针寄存器SP、BP, 二个变址寄存器SI、DI, 算术逻辑

单元ALU,标志寄存器。

2.4 8086CPU 状态标志和控制标志又何不同?程序中是怎样利用这两类标志的? 8086 的状态

标志和控制标志分别有哪些?

【答】标志分两类:状态标志(6 位):反映刚刚完成的操作结果情况。控制标志(3 位):在某些指令操作中起控制作用。

2.5 8086/8088 和传统的计算机相比在执行指令方面有什么不同?这样的设计思想有什么优

点? 8086CPU 执行转移指令时,指令队列寄存器内容如何变化?

【答】传统的计算机一般按照取指令、指令译码/执行指令的步骤工作。在8086/8088 中,指

令的提取与执行分别由总线接口部件BIU 与执行部件EU 完成,8086/8088 可以在取指令同时

又可以执行指令,这种并行工作方式有力的提高了CPU 的工作效率。

2.6 将两数相加,即0100 1100 加0110 0101,CF、PF、AF、ZF、SF、OF 各为何值?

【答】0100 1100+0110 0101=10110001

CF=0,PF=1,AF=1,ZF=0,SF=1,OF=1

2.7 存储器的逻辑地址由哪几部分组成?存储器的物理地址是怎样形成的?一个具有20 位

地址线的CPU,其最大物理地址为多少?

【答】存储器的逻辑地址由段地址与段内偏移地址组成。存储器的物理地址:将16 位段地址

左移4 位后加上16 位段内偏移地址,形成20 位物理地址。一个具有20 位地址线的CPU,其

最大物理地址为=1MB。

3

2.8 现有6 个字节的数据分别为11H,22H,33H,44H,55H,66H,已知它们在存储器中的

物理地址为400A5H~400AAH.若当前(DS)= 4002H,请说明它们的偏移地址值。如果要从

存储器中读出这些数据,需要访问几次存储器,各读出哪些数据?

【答】由于:物理地址=400A5H=段地址*16+偏移地址=40020H+偏移地址

偏移地址=400A5+40020=85H

从奇地址400A5H 中读出:11H;从偶地址400A6H 读出一个字:22H,33H;从偶地址

400A8H 读出一个字:44H,55H;从偶地址400AAH 中读出:66H。共读4 次。

2.9 已知当前数据段中存有如下图所示的数据,现要求将最后两个

字节改成ODH,OAH,请说明需给出的段基值和偏移地址值,并说明

其写入过程。

【答】数据段段地址=150AH,偏移地址=0004H。CPU 的总线接口部件

根据数据段寄存器的内容150AH,左移4 位,在加上偏移地址0004H,

形成20 位物理地址150A4H,由总线接口送出,选中物理存储单元

150A4H、150A5H,数据0DH 通过数据总线送入150A4H,数据0AH 通

过数据总线送入150A4H。

2.10 在8088/8086 中,逻辑地址FFFF∶0001, 00A2∶37F 和B800∶173F 的物理地址分别是

多少?

2.11 在8088/8086 中,从物理地址388H 开始顺序存放下列三个双字节的数据,651AH, D761H 和007BH,请问物理地址388H, 389H, 38AH, 38BH, 38CH 和38DH 6 个单元中分别是什么数据?

2.12 8086/8088 内部有哪些通用寄存器?

2.13 8086/8088 内部有几个段寄存器,阐述各段寄存器的用途?

2.14 8086CPU 的形成三大总线时,为什么要对部分地址线进行锁存?用什么信号控制锁存?【答】为了确保CPU 对存储器和I/O 端口的正常读/写操作,要求地址和数据同时出现在地

址总线和数据总线上。而在8086CPU 中AD0--AD15 总线是地址/数据复用的,因此需在总线周期的前一部分传送出地址信息,并存于锁存器中,而用后一部分周期传送数据。8086CPU 中

是通过CPU 送出的ALE 高电平信号来控制锁存的。

2.15 段寄存器CS=1200H,指令指针寄存器IP=4000H,此时,指令的物理地址为多少?指向这一

物理地址的CS 值和IP 值是唯一的吗?

【答】此时,指令的物理地址为16000H;这一物理地址的CS 值和IP 值不是唯一的,例如:CS=1000H,IP=6000H。

(2. 80386CPU-选择教学内容)

2.14 80386 最重要的技术特点是什么?

【答】①速度大大提高:时钟达12MHZ/16MHZ,②寻址空间大大扩展:4GB 物理空间,64GB 虚拟空间,③除了保持80286 的实地址方式和保护方式外,增加了虚拟8086 方式④80386

设置了转换检测缓冲器,大大加快了存储器访问速度。

2.15 虚拟8086 方式有什么特色?为什么要设置这种方式?

【答】①可以执行8086 的应用程序。②段寄存器的用法和实地址方式时一样,即段寄存器内容左移4 位加上偏移量为线性地址。③存储器寻址空间为一兆字节,然而可以使用分业方式,将一兆字节分为256 个业面,每页4K 字节。在80386 多任务系统中,可以其中一个或几个任

4

务使用虚拟8086 方式。此时,一个任务使用的全部页面可以定位于某个物理地址空间,另一个任务的页面可以定位于其他区域,即每个虚拟8086 方式下的任务可以转换到物理存储器的不同位置,这样,把存储器虚拟化了,虚拟8086 方式的名称正是由此而来。④虚拟8086 方

式中,程序在最低特权级上运行,因此,80386 指令系统中的一些特权指令不能使用。

虚拟8086 方式是80386 中很重要的设计特点,他可以使大量的8086 软件有效的与

80386 保护方式下的软件并发运行。

2.16 80386 的实地址方式用于什么时候?为什么说它是为建立保护方式作准备的方式?实地址工作方式有什么特点?

【答】80386 的实地址方式用于为80386 进行初始化用的。常常在实地址方式,为80386 保

护方式所需要的数据结构做好各种配置和准备,因此,这是一种为建立保护方式作准备的方式。实地址工作方式的特点:1、寻址机构、存储器管理、中断处理机构均和80386 一样。2、操作数默认长度为16 位,但允许访问80386 的32 位寄存器组,在使用是,指令中要加上前

缀以表示越权存取。3、不用虚拟地址的概念存储器容量最大1M 字节。4、实地址方式下,

存储器中保留两个固定区域,一个为初始化程序区,另一个为中断向量区。5、80386 具有4 个特权级,实地址方式下,程序在最高级(0 级)上执行。

2.17 80386 采用拿几种描述符表?这些表的设置带来什么优点?

【答】80386 共设计三中描述符表即:全局描述符表,局部描述符表,中断描述浮表。采用

描述符表带来如下三方面的优点:1.可以大大扩展存储空间;2.可以实现虚拟存储;3.可以实现多任务隔离。

2.18 80386 在3 种工作方式下,"段"的长度有什么差别?

实地址方式:段的大小固定64K 字节;保护方式:段的大小是可以选择的,1 字节

到4 千兆字节;虚拟8086 方式:对程序员来说,段长度固定为64K。

2.19 Intel86 系列CPU 是从哪一种芯片开始采用RISC 技术的?你能说说RISC 技术最重要的

特点和优点吗?

【答】80486 是首次采用RISC 技术的。80486 把80386 和浮点运算协处理器80387 及8KB 的超高速缓存器集中到一个芯片中,且支持二级Cache。80486 能在一个时钟周期执行一条指令。

2.20 80486 和80386 相比,有什么技术特点?

【答】① 80486 是首次采用RISC 技术的;②采用片内高速缓存和片内浮点运算协处理器;

③ 80486 采用一种突发式总线方式实现CPU 和内存的高速数据交换;④80386 可以模拟多个8086 来实现多任务功能。

2.21 80386SL 和80486SL 芯片有什么特点?主要用于什么场合?

【答】① 80386SL 不但具有80386 的三种工作方式,还增加了一种系统管理方式(SMM),在这种方式,CPU 会根据不同的使用环境自动减速运行或停止运行,还可以控制其他部件停止

工作,从而使微机系统的功耗最小。② 80386SL 采用静态CMOS 工艺制造技术。80486SL 和80386SL 类似,采用SMI 中断以减少功耗,用于便携机。

2.22 Pentium 有哪些技术特点?你认为在Pentium 基础上主要应从哪几个方面可再作改进? 【答】①采用超标量双流水线结构,每个流水线包含5 个步级。②内部采用2 个彼此独立

的8KB 数据高速缓存,这两个高速缓存可以同时被访问。③ Pentium 内部数据总线为32 位,但是cpu 和内存进行数据交换的外部数据总线为64 位,使一个总线周期的数据传输量提高一

5

倍。④采用36 位地址总线,扩展了寻址空间。⑤对mov.push.dec.inc 等常用指令不用微

程序而用硬件实现;⑥采用分支预测技术提高流水线效能。⑥采用分支预测技术提高流水线效能。⑦浮点运算执行过程分为8 个流水步级。pentium 也存在一些缺点,如功耗大,达15w,浮点运算功能仍低于一些RISC 处理器。

习题三8086 指令系统

主要内容: 8086 指令系统。主要介绍8086 的基本数据类型、寻址方式和指令系统,重点掌握8086 指令系统的寻址方式、堆栈操作指令、算术运算指令及其对标志位的影响,串操作指令,控制传送指令。

3.1 下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。

XCHG CS,AX (′)

MOV [BX],[1000] (′)

PUSH CS ()?

POP CS (′)

IN BX,DX (′)

3.2 单选题:

(1)执行下面指令序列后,结果是( )。

MOV AL,82H

CBW

A、AX=0FF82H

B、AX=8082H

C、AX=0082H

D、AX=0F82H

【答】A

(2)与MOV BX,OFFSET VAR 指令完全等效的指令是( )。

A、MOV BX,VAR

B、LDS BX,VAR

C、LES BX,VAR

D、LEA BX,VAR

【答】D

(3)编写分支程序,在进行条件判断前,可用指令构成条件,其中不能形成条件的指令有A、CMP B、SUB C、AND D、MOV

【答】D

(4)下面指令执行后,改变AL 寄存器内容的指令是( )。

A、TEST AL,02H

B、OR AL,AL

C、CMP AL,B

D、AND AL,BL

【答】D

(5)设DH=10H,执行NEG DH 指令后,正确的结果是( )

A、DH=10H CF=1

B、DH=0F0H CF=0

C、DH=10H CF=0

D、DH=0F0H CF=1

【答】D

(6)设DS=8225H,DI=3942H,指令NEG BYTE PTR[DI]操作数的物理地址是( )。

A、85B92H

B、86192H

C、BB690H

D、12169H

【答】A

(7)检查BUF 的内容是否为正偶数,如是正偶数,则0TAL。下面程序段正确的是( )。

A、MOV AL,BUF

JS K1

SHR AL,1

6

JNC K1

MOV AL,0

K1:……

B、MOV AL,BUF

AND AL,11

JNZ K2

MOV AL,0

K2:……

C、MOV AL,BUF

TEST AL,81H

JNZ K3

MOV AL,0

K3:……

D、MOV AL,BUF

JNP K4

TEST AL,80H

JNZ K4

MOV AL,0

K4:……

【答】C

(8)下列指令中,执行速度最快的是()。

A、MOV AX,100

B、MOV AX,[BX]

C、MOV AX,BX

D、MOV AX,[BX+BP]

【答】C

3.3 已知(DS)= 091DH,(SS)= IE4AH,(AX)= 1234H,(BX)= 0024H,(CX)= 5678H,(BP)= 0024H,(SI)= 0012H,(DI)= 0032H,[09226] = 00F6H,[09228]=1E40H,[lE4F6]=091DH,试求单独执行下列指令后的结果?

(l) MOV CL ,20H [BX][SI];

【答】由于源操作数有效地址EA=20H+0024H+0012H=0056H,

其物理地址PA=DS*16+EA=091DH*16+56H=09226H, 因此(CL)= F6H

(2) MOV [BP][DI],CX;

【答】由于目的操作数有效地址EA= 0024H+0032H=0056H,

目的操作数物理地址PA= SS*16+EA=1E4A0H+0056H=1E4F6H, 因此[1E4F6]=5678H

(3) LEA BX ,20H[BX][SI]

MOV AX ,2[BX]

【答】第一条指令:源操作数物理地址PA=091D0H+(20+0024H+0012H)=09226H,因此(BX)=0056H 第二条指令:源操作数物理地址PA=091D0H+(2+0056)=09928H, 因此(AX)=1E40H

(4) LDS SI ,[BX][DI]

MOV [SI],BX

【答】第一条指令: 源操作数物理地址PA=091D0H+(0024H+0032H)=09226H

因此(SI)= 00F6H, (DS)=1E40H

第一条指令:目的操作数物理地址PA=1E400H+00F6H=1E4F6H

因此1E4F6H 单元的内容为0024H, 即[1E4F6H]=0024H

7

(5) XCHG CX,32H[BX]

XCHG 20[BX][SI] ,AX

【答】同理可得:(CX)= 00F6H(AX)= 00F6H, [ 09226H]= 1234H

3.4 8086 CPU 执行如下指令后

MOV AL,01100100B

SUB AL,58H ;(AL)=0CH,AF=1,CF=0

DAS ;(AL)=06 ,AF=1,CF=0

【答】首先用TD 调试验证上面的结果;自己定义两个数据,重新验证,写出结果。

3.5 设(IP)= 3D8F H,(CS)= 4050H,(SP)= 0F17C H,当执行CALL 2000:0094H 后,

试求出IP、CS、SP、[SP]、[SP+1][SP+2]和[SP+3]的内容?

【答】(IP)=0094H ,( CS)=2000H ,(SP)=F178H

[SP]=8FH , [SP+1]=3DH , [SP+2]=50H, [SP+3]=40H

3.6 设(DS)= 2000H,(BX)= 1256H,(SI)= 528FH,TABLE 的偏移量= 20A1H,[232F7H]=3280H,[ 264E5H] = 2450H,执行下述指令

(1)JMP BX ;IP= 1256H

(2)JMP TABLE[BX];IP= 3280H

(3)JMP [BX][SI] ;IP= 2450H

3.7 分别用一条语句实现下述指明的功能

(1)栈顶内容弹出送字变量DI。(POP DI)

(2)双字变量AYD 存放的地址指针送ES 和SI。(LES SI ,AYD )

(3)不允许中断即关中断。(CLI)

(4)子程序返回调用程序。(RET)

(5)AX 的内容加1,要求不影响CF。(INC AX )

(6)BX 的内容加1,要求影响所有标志位。(ADD BX, 1)

(7)若操作结果为零转向标号GOON。(JZ GOON)

3.8 8086/8088 用什么途径来更新CS 和IP 的值?

【答】执行CALL、JMP、INT 指令,可以改变CS 和IP 中的值,即改变程序走向。

3.9 字节扩展指令和字扩展指令用在什么场合?举例说明。

【答】需要对带符号数字节扩展为字时,要预先执行CBW 指令。需要对带符号数字扩展为双字时,要预先执行CWD。

【答】例:求-503/267=?,将商存1000H 单元.

MOV AX,-503

MOV BX,267

CWD

IDIV

MOV [1000H],AX

HLT

3.10 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作:MOV WORD PTR [BP], 2000

MOV WORD PTR [BX], 2000

8

3.11 以下是格雷码的编码表

0——0000 ,1——0001 ,2——0011, 3——0010, 4——0110

5——0111 ,6——0101, 7——0100, 8——1100, 9——1101

请用换码指令和其他指令设计一个程序段,实现格雷码往ASCII

的转换。

TABLE SEGMENT

TAB_DA DB 30H,31H,33H,32H,37H,36H,34H,35H,0,0

DB 0,0,38H,39H

GRA DB 05H

ASCII_DA DB ?

TABLE ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:TABLE

START: MOV AX,TABLE

MOV DS,AX

MOV BX,OFFSET TAB_DA

MOV AL,GRA

XLAT

MOV ASCII_DA,AL

CODE ENDS

END START

3.12 8086 状态标志寄存器中,作为控制用的标志位有( 3 )个,其中,不可用指令操作的是(DF、IF、TF)

3.13 设当前的SP=1000H,执行PUSHF 指令后,SP=(0FFE H),若改为执行INT 20H 指令后,则SP=( 0FFA H)。

【答】执行PUSHF 指令后,SP=(0FFE H)。执行INT 20H 指令后,则SP=( 0FFA H)。

3.14 设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶的地址为多少?当执行PUSH BX 指令后,栈顶地址和栈顶2 个字节的内容分别是什么?

【答】当前栈顶指针(SP)=2FF00H,物理地址=20100H+FE00H=2FF00H

当执行PUSH BX 指令后,栈顶指针(SP)=FE00-2=FDFEH,栈顶物理地址=2FDFEH,栈顶2

个字节的内容分别57H,34H。

3.15 HLT 指令用在什么场合?如CPU 在执行HLT 指令时遇到硬件中断并返回后,以下应执

行哪条指令?

【答】HLT 用在使CPU 处于暂停状态而等待硬件中断的场合。

在执行HLT 指令遇到硬件中断并返回后将执行HLT 后面的一条指令。

3.16 为什么用増量指令或减量指令设计程序时,在这类指令后面不用进位标志作为判断依

9

据?

【答】増量指令或减量指令不影响进位标志CF。

3.17 用普通运算指令执行BCD 码运算时,为什么要进行十进制调整?具体讲,在进行BCD 码的加、减、乘、除运算时,程序段的什么位置必须加上十进制调整指令?

【答】在BCD 码中,采用4 位二进制数对一个十进制数的编码,只允许0-9 这10 个数字出现,但CPU 运算结果一般会超过此范围,因此要进行十进制调整。进行加、减法或乘法运算时,调整指令必须紧跟在算术指令后面,在进行除法运算时,调整指令放在除法指令之前。3.18 中断指令执行时,堆栈的内容有什么变化?中断处理子程序的人口地址是怎样得到的?【答】中断指令执行时,堆栈内容变化如下:标志寄存器被推入堆栈,且SP 减2,然后CPU 将主程序的下一条指令地址即断点地址推入堆栈,即段值CS 推入堆栈且SP 减2,偏移量推入堆栈,且SP 减2。中断处理子程序的入口地址即中断向量,对应的中断类型号的4 倍即为中断向量地址,在该地址处的4 个字节内容,高地址单元两个字节为中断入口地址的段地址,低地址单元两个字节为中断入口地址的偏移地址。

3.19 中断返回指令IRET 和普通子程序返回指令RET 在执行时,具体操作内容什么不同?【答】IRET 从堆栈中依次弹出断点处指令指针IP、代码段CS 内容与标志寄存器的值,而RET 从堆栈中依次弹出断点处指令指针IP 值、代码段CS 内容,不需要弹出标志寄存器的值。

3.20 将存放在0A00H 单元和0A02H 单元的两个无符号数相乘,结果存放在地址为0A04H 开始的单元中。

【答】参考程序:

MOV AL,[0A00H]

MOV BL,[0A02H]

MUL BL

MOV [0A04],AX

3.21 编程序将AX 中数,最高位保持不变,其余全部左移4 位。

【答】参考程序:

MOV BX, AX

AND BX , 8000H

MOV CL, 4

SHL AX, CL

AND AX,7FFFH

OR AX, BX

3.22 将0400H 单元中的数,低4 位置零,高4 位保持不变。

【答】参考程序:

MOV AL, [0400H]

AND AL, 0F0H

MOV [0400H], AL

10

3.23 将BX 中的数,对高位字节求反,低位字节保持不变。

【答】参考程序:NOT BH

3.24 检测Bx 中第13 位(D13),为0 时,把AL 置0,为1 时,把AL 置1。

【答】参考程序:

TEST BX,0010 0000 0000 0000B

JZ ZERO

MOV AL,01H

HLT

ZERO: MOV AL,0

HLT

3.25 利用字串操作指令,将1000H~10FFH 单元全部清零。

【答】参考程序:

CLD

MOV DI,1000H

MOV CX,100H

MOV AL,0

REP STOSB

3.26 从1000H 开始,存放有200 个字节,要查出字符#(ASCII 码为23H), 把存放第一个#的单元地址送入BX 中。

【答】参考程序:

CLD

MOV DI,1000H

MOV CX,200

MOV DX,CX

MOV AL,23H

REPNZ SCASB

JZ FIND

JMP NOFOUND

FOUND: DEC DI

MOV BX,DI

NOFOUND: HLT

3.27 编程计算((X+Y)*10)+Z)/X,X、Y、Z 都是16 位无符号数,结果存在RESULT 开始的单元。

【答】参考程序:

MOV AX,X

ADD AX,Y

MOV BX,0AH

MUL BX

ADD AX,Z

ADC DX,0H

MOV BX,X

11

DIV BX

MOV RESULT,AX

MOV RESULT+2,DX

HLT

3.28 用简单指令编程求-3/2=?,将商存DL,余数存DH 单元。用TD 调试后,写出DL,DH 的内容。

【答】参考程序:

MOV AL,-3

CBW

MOV BL,2

IDIV BL

MOV DL,AL

MOV DH,AH

HLT

习题四汇编语言程序设计

主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS 和BIOS 功能调用程序、汇编语言常用伪指令。

4.1 分析执行下列指令序列后的结果:

1) MOV AX,1234H

MOV BX,00FFH

AND AX,BX

【答】(AX)=0034H

2) MOV AL,01010101B

AND AL,00011111B ;(AL)=00010101B

OR AL,11000000B ;(AL)=11010101B

XOR AL,00001111B ;(AL)=11011010B

NOT AL

【答】(AL)=00100101B

3) MOV DL,05H

MOV AX,0A00H

MOV DS,AX

MOV SI,0H

MOV CX,0FH

AGAIN: INC SI

CMP [SI],DL

LOOPNE AGAIN

HLT

本程序实现了什么功能?

【答】在以0A001H 开始的15 个单元中查找05H。

12

4) MOV AX,DSEGADDR

MOV DS, AX

MOV ES,AX

MOV SI, OFFSET B1ADDR

MOV DI,OFFSET B2ADDR

MOV CX,N

CLD

REP MOVSB

HLT

本程序实现了什么功能?

【答】将B1ADDR 中N 个字节数据传送到B2ADDR 开始的15 个存储单元。

5)MOV AX, 0H

MOV DS,AX

MOV ES, AX

MOV AL,05H

MOV DI,0A000H

MOV CX,0FH

CLD

AGAIN: SCASB

LOOPNE AGAIN

HLT

本程序实现了什么功能?

【答】从地址0A000H 开始的15 个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H 的查找。

4.2 阅读程序:

1). CLD

LEA DI,[0100H]

MOV CX, 0080H

XOR AX, AX

REP STOSW

本程序实现了什么功能?

【答】将DS 中起始地址为0100H 的128 个字节单元清零。

2).MOV AL, 08H

SAL AL,01H ;(AL)=00010000H

MOV BL, AL

MOV CL ,02H

SAL AL,CL ;(AL)=01000000H

ADD AL,BL ;(AL)=01010000H

本程序实现了什么功能?

【答】将AL 中的内容乘以10。

4.3 试分析下列程序完成什么功能?

MOV DX,3F08H

13

MOV AH,0A2H

MOV CL,4

SHL DX,CL ;(DX)=F080H

MOV BL,AH

SHL BL,CL ;(BL)=20H

SHR BL,CL ;(BL)=02H

OR DL,BL ;(DL)=82H

【答】将DX 中的低4 位数据8H 分离出来,将AH 中的低4 位数据2H 分离出来,合并为82H

存放在DL。

4.4 已知程序段如下:

MOV AX,1234H

MOV CL,4

ROL AX,CL

DEC AX

MOV CX,4

MUL CX

试问:(1)每条指令执行后,AX 寄存器的内容是什么?(2)每条指令执行后,CF,SF 及ZF 的值分别是什么?(3)程序运行结束时,AX 及DX 寄存器的值为多少?

【答】MOV AX,1234H ; (AX)=1234H, CF=SF=ZF=0

MOV CL,4

ROL AX,CL ; (AX)=2341H ,CF=1,SF=ZF=0

DEC AX ; (AX)=2340H, CF=1,SF=ZF=0

MOV CX,4 ;

MUL CX ;(AX)= 8000H ,CF=ZF=0,SF=1,DX=0

4.5 试分析下列程序段:

ADD AX,BX

JNC L2

SUB AX,BX

JNC L3

JMP SHORTL5

如果AX、BX 的内容给定如下:

AX BX

(1)14C6H 80DCH (程序转向L2)

(2)B568H 54B7H (程序转向SHORTL5 )

问该程序在上述情况下执行后,程序转向何处?

【答】(1) 程序转向L2。(2) 程序转向SHORTL5。

4.6 以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节?

DATA SEGMENT

VAR1 DW 9 ;2 字节

VAR2 DD 10 DUP(?),2 ;44 字节

VAR3 DB 2 DUP(?,10 DUP(?)) ;22 字节

14

VAR4 DB ‘HOW ARE YOU' ;11 字节

DATA ENDS

【答】该数据段共占79 字节。

4.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。

VAR1 DB 10,2 ;2 字节

VAR2 DW 5DUP(?),0 ;12 字节

VAR3 DB ‘HOW ARE YOU?',‘$' ;13 字节

VAR4 DD -1,1,0 ;12 字节

4.8 编写一段程序,比较两个5 字节的字符串OLDS 和NEWS,若相同,在RESULT 置0,否则置0FFH。

【答】参考程序:

OLDS DB 1,2,3,4,5

NEWS DB 1,2,3,4,5

RESULT DB ?

MOV SI,OFFSET OLDS

MOV DI,OFFSET NEWS

MOV CX,10

CLD

REP CMPSB

JNZ NOEQU ;串不相等转

MOV AL,0

JMP OUTPT

NOEQU: MOV AL,0FFH

OUTPT: MOV RESULT,AL

STOP: JMP STOP

4.9 编程求和Y=A1 + A2 + …. + A100 。其中Ai 为字节变量。

【答】

DATA SEGMENT

TABLE DW 12,3,45,..

YAL DW ?

YAH DW ?

DATA ENDS

………

MIAN PROC FAR

PUSH DS

MOV AX, 0

PUSH AX

MOV AX, DATA

MOV DS, AX

MOV DX,0

XOR AX, AX ;清AX

MOV BX, OFFSET TABLE

15

MOV CX, 4

CLC

LP: ADD AX, [BX] ;求和

JNC DON

INC DX

CLC

DON: INC BX

INC BX ;指向下一个数

LOOP LP ;未加完,继续

MOV YAL,AX ;存和

MOV YAH,DX

MAIN ENDP

CODE ENDS

END START

4.10 内存中以FIRST 和SECOND 开始的单元中分别存放着两个16 位组合的十进制(BCD 码) 数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD 开始的单元。

【答】参考程序:1325+9839=?

DATA SEGMENT

FIRST DB 05H,02H,03H,01H ;

SECOND DB 09H,03H, 08H,09H;

THIRD DB 20 DUP (?)

DATA ENDS

STACK SEGMENT

ST1 DB 100 DUP (‘SA’)

TOP1 EQU LENGTH ST1

STACK ENDS

CODE SEGMENT

ASUMME CS:CODE,DS:DATA,SS:STACK

MAIN PROC FAR

START: MOV AX, DAT ;初始化数据段

MOV DS, AX

MOV AX, STACK ;初始化堆栈段

MOV SS, AX

MOV AX, TOP1

MOV SP, AX

MOV CX, 4 ;计算4 次

MOV SI , OFFSET DAT2 ;取数据地址

MOV DI , OFFSET SUM ;取结果地址

MOV AH, 00H ;将暂存标志的AH 清0

DON1: MOV AL, [BX] ;取第一个数

SAHF ;将AH 中的标志送标志寄存器

ADC AL, [DI] ;与第二个数带进位加

AAA ;十进制校正

LAHF ;将标志寄存器内容送AH

OR AL, 30H ;计算值拼成ASCII 码

MOV [DI], AL ;存结果的ASCII 码

16

INC BX ;指向第一个数的下一位

INC SI ;指向第二个数的下一位

INC DI ;指向结果单元的下一位

LOOP DON1 ;未计算完,继续

AND AH, 01H ;将最高位的进位标志送AH

OR AH, 30H ;最高位的进位位拼成ASCII 码

MOV [DI], AH ;存结果的最高位

MOV AH, 02H ;调用DOS 的02H 功能显示

MOV CX, 05H ;显示数据的位数

DON2: MOV DL,[DI] ;显示数据送DL

INT 21H ;显示

DEC DI ;显示数据所在存储单元加一

LOOP DON2 ;未显示完,继续

MOV AH, 4CH ;返回DOS

INT 21H

RET

MAIN ENDP

CODE ENDS

END START

4.11 试编程序,统计由40000H 开始的16K 个单元中所存放的字符“A“的个数,并将结果存放在DX 中。

【答】参考程序

DATA SEGMENT

DATA1 DB 'DFASFAAAFDFAAFFFA'

COUNT EQU $-DATA1

DATA ENDS

STACK SEGMENT

STA DB 100 DUP (?)

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

BEGIN: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV CX,COUNT

MOV DX,0

LEA SI,DATA1

MOV BL,'A'

NEXT : CMP [SI],BL

JNZ OTHER

OTHER: INC SI

17

LOOP NEXT

CODE ENDS

END BEGIN

4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。

【答】

BLOCK DB -1,-3,5,6,-2,0,20,10

PLUS_D DB 8 DUP(?) ;正数缓冲区

MINUS_D DB 8 DUP(?) ;负数缓冲区

PLUS DB 0

MINUS DB 0

MOV SI,OFFSET BLOCK

MOV DI,OFFSET PLUS_D

MOV BX,OFFSET MINUS_D

MOV CX, 8 ;数据个数送X

GOON: LODSB ;AL← [SI]

TEST AX, 80H

JNZ JMIUS ;为负数,转

INC PLUS ;正数个数加一

STOSB ;[DI] ←AL,传正数

JMP AGAIN

JMIUS: INC MINUS ;负数个数加一

XCHG BX, DI

STOSB ;送负数到缓冲区

XCHG BX, DI

AGAIN: DEC CX

JNZ GOON

4.13 编写一个子程序将AX 中的十六进制数,转换成ASCII 码, 存于ADR 开始的四个单元中。提示:1)、AX 中的数从左到右,转换成ASCII 码,用循环左移ROL 和AND 指令,把提出的一个十六进制数置BL 中;

2)、0 ~ 9 的ASCII 码:30 ~ 39H,A ~ F 的ASCII 码:41H ~ 46H。

(先把每个数加30H,判断是否为数字0 ~ 9?若是A ~ F,再加07H,得字母的ASCII 码。)【答】参考程序:

DATA SEGMENT

ADR DB 4 DUP(?)

DATA ENDS

CODE SEGMENT

MAIN PROC FAR

ASSUME CS:CODE,DS:DATA

START: MOV AX,7EC3H ;假设ax 中存放7ec3h

LEA SI,ADR

MOV DL,4

MOV BX,AX

18

AND BX,000FH

ADD BL,30H

CMP BL,'9'

JG ADUST

JMP STORE

ADUST: ADD BL ,07H

STORE: MOV [SI],BL

INC SI

MOV CL,4

ROL AX,CL

DEC DL

JNZ AGAIN

MAIN ENDP

CODE ENDS

END START

4.14 编写一个子程序将AX 中的2 进制数,转换成10 进制ASCII 码, 存于ADR 开始的五个单元中。

【答】参考程序:

BIN EQU 5555H;假设二进制数为5555H

DATA SEGMENT

ADR DB 4 DUP(?)

DATA ENDS

STACK SEGMENT

STA DB 100 DUP (?)

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV AX,BIN

LEA BX,ADR

MOV CX,10000D

CALL BINTODEC

MOV CX,1000D

CALL BINTODEC

MOV CX,100D

CALL BINTODEC

MOV CX,10D

CALL BINTODEC

MOV CX,01D

CALL BINTODEC

19

MOV AX,04CH ;返回DOS

INT 21H

MAIN ENDP

;十进制转二进制,完成一位运算,十进制存于ax 中,结果存于bx 所指向的地址中BINTODEC PROC NEAR

MOV DX,0

DIV CX

ADD AL,30H

MOV [BX],AL

MOV AX,DX

INC BX

RET

BINTODEC ENDP

CODE ENDS

END START

4.15 编写一个子程序,对AL 中的数据进行偶校验,并将经过校验的结果放回AL 中。

【答】参考程序:

JIAOYAN PROC FAR

MOV AL,1001110B

OR AL, AL

JNP NEXT

MOV AL,0

JMP DONE

NEXT: MOV AL,1

DONE: MOV AH,04CH

INT 21H

JIAOYAN ENDP

4.16 从2000H 单元开始的区域,存放100 个字节的字符串,其中有几个$符号(ASCII 码为24), 找出第一个$符号,送AL 中,地址送BX。

【答】参考程序:

SEARCH PROC FAR

MOV DI,2000H

MOV CX,100

MOV AL,24H

CLD

REPNZ SCASB

JNZ STOP

DEC DI

MOV BX,DI

MOV AL,[DI]

STOP: RET

SEARCH ENDP

4.17 用串操作指令实现:先将100H 个数从2170H 单元处搬到1000H 单元处,然后从中检索等20

于AL 中字符的单元,并将此单元换成空格字符。

【答】参考程序:

MOV AL,24H

MOV SI,2170H

MOV DI,1000H

MOV CX,100H

CLD

DO: REP MOVSB

MOV DI,1000H

MOV CX,100H

CLD

REPNZ SCASB

DEC DI

MOV [DI],20H

INC DI

CMP CX,0

JNZ DO

HLT

4.18 从60H 个元素中寻找一个最大的值,并放到AL 中,假设这60 个元素放在DATA1 开始的单元中。

【答】参考程序:

DATA SEGMENT

DATA1 DB 0,1,2,3,4,5,6,7,8,9 ;

DATA ENDS

STACK SEGMENT

STA DB 20 DUP (?)

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV CX,10

MOV AL,0

LEA BX,DATA1

AGAIN: CMP AL,[BX]

JGE NEXT ;大于等于转移

MOV AL,[BX]

NEXT : INC BX

LOOP AGAIN

MOV AH,4CH

INT 21H

21

CODE ENDS

END START

4.19 排序程序设计: 把表中元素按值的大小升序排列。要求显示排序前和排序后的数据。【答】参考程序:

DATA SEGMENT

TAB DB '8095554'

N=$-TAB

OK DB 0DH,0AH,'OK!$'

DATA ENDS

STACK SEGMENT

STA DB 20 DUP(?)

TOP EQU LENGTH STA

STAC ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

STAR: MOV AX,DATA

MOV DS,AX ;初始化数据段

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

CALL ARRAY

DO: MOV AH,4CH

INT 21H ;返回DOS

ARRAY PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV DL,N-1 ;置外循环次数

MOV DH,1 ;设有交换标志

XOR BX, BX

UPPER: OR DH,DH ;

JZ DISP ;无交换,已排好序,退出

MOV DH,0 ;无交换

SUB CX,BX ;CX=CX-I 内循环次数

MOV SI,0 ;指向表首

INNER: MOV AL,TAB[SI] ;字符送AL

INC SI ;指向下个字符

CMP AL,TAB[SI] ;比较表中相邻字符

JBE DON ;小于

XCHG AL,TAB[SI] ;否则交换,大字符下

MOV TAB[SI-1],AL ;小字符上浮

MOV DH,1 ;有交换,DH=1

22

DON: LOOP INNER ;内循环结束?CX-1

INC BX ;一次内循环完成,加一

DEC DL ;外循环次数减一

CMP DL,0

JNZ UPPER ;外循环次数非零,继续

DISP: MOV DX,OFFSET TAB

MOV AH,09H

INT 21H ;显示排好序的字符

POP DX

POP CX

POP BX

POP AX

RET

ARRAY ENDP

CODE ENDS

END STAR

4.20 编写一段程序,接收从键盘输入的10 个数,输入回车符表示结束,然后将这些数加密后存于BUFF 缓冲区中。加密表为:输入数字: 0,1,2,3,4,5,6,7,8,9;密码数字:7,5,9,1,3,6,8,0,2,4。

【答】参考程序:

DATA SEGMENT

TABLE DB 7,5,9,1,3,6,8,0,2,4;密码表

BUFF DB 10 DUP(?) ,'$'存放转换数字的缓冲区

DATA ENDS

STACK SEGMENT

STA DB 20 DUP(?)

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

MOV AX,STACK

MOV SS,AX

MOV DI , OFFSET BUFF

LEA BX , TABLE

相关文档
相关文档 最新文档