微机原理习 题 2 下载本文

习 题 2

2.1 8086/8088 CPU分为哪两大功能部件?其各自的主要功能是什么?8086/8088 CPU

中有哪些寄存器?各有什么用途?

解:从功能上来看,Intel 8086/8088微处理器可分为两部分,即执行单元EU(Execution Unit) 和总线接口单元BIU(Bus Interface Unit)。

执行单元EU 的功能是负责指令的译码、执行,包括算术、逻辑运算,控制等。总线接口单元BIU 的功能是负责8086/8088对存储器和I/O 设备的所有访问操作。具体包括:负责从内存单元中预取指令,并将其送到指令队列缓冲器暂存;从内存单元或外设端口中读取操作数或者将指令的执行结果传送到指定的内存单元或外设端口;根据有效地址(EA)形成物理地址(PA)。

8086/8088有4个16位数据寄存器:AX、BX,CX,DX,它们既可作为16位寄存器使用,存放数据或地址,也可以分别作为两个 8 位寄存器使用。

8086/8088有2个16位变址寄存器:SI 、DI,通常与DS联用,为访问当前数据段提供段内偏移地址或偏移地址分量。

8086/8088有2个16位地址指针寄存器:SP,BP,它们一般是用来存放堆栈操作数的偏移地址。

总线接口单元(BIU) 中设置有4 个16位的段寄存器,分别是代码段寄存器(CS),数据段寄存器(DS),堆栈段寄存器(SS)和附加段寄存器(ES)。

指令指针寄存器 (Instruction Pointer,IP) 用来存放下一条要执行的指令在当前代码段中的偏移地址。

标志寄存器也称程序状态字(PSW) 寄存器,用来存放运算结果的特征和机器工作状态。

2.2 8086/8088 CPU中标志寄存器有哪两类标志?简述各标志位的含义。

解:①(Zero Flag ,ZF)——零标志。若本次运算结果为0,则ZF=1,否则ZF=0。 ②(Sign F1ag SF)——符号标志。此标志用于反映有符号数运算结果的符号是正还是负。对于有符号数,用最高位表示数的符号,当本次运算结果最高位为1 ,表示结果为负数,则SF=1,否则SF=0。

③(Parity Flag,PF)——奇偶标志。此标志是反映运算结果中最低字节中含“1”的个数为0或偶数时,PF=1,为奇数时,PF=0。 注意,PF标志仅反映运算结果的最低8位中“1”的个数是偶数或奇数,即使是进行16位字操作也是如此。

④(Auxiliary Carry Flag ,AF)——辅助进位标志。当进行8 位数( 字节)或16位数( 字)的低8 位运算时,低4 位向高4 位( 即D3 位向D4 位) 有进位或借位时,AF=1,

1

否则AF=0。AF标志主要供 BCD码十进制算术指令判别是否要进行十进制调整,用户一般不必关心。

⑤(Carry Flag,CF)——进位标志。当本次算术运算结果使最高位产生进位( 加法运算)或借位( 减法运算) 时,则此标志位置“1”,即CF=1;若加法运算结果最高位无进位,或减法运算结果最高位无借位,则CF=0。

⑥(Overflow Flag ,OF)——溢出标志。当运算结果产生溢出时,使OF=1,否则OF=0。

2.3 简述伪指令“EQU”与“=”之间有什么区别?

解:“EQU”伪指令不能重复定义,而“=”伪指令可以重复定义。

2.4 画图说明下列语句分配的存储空间及初始化的数值

(1)FF1 DB '0100',2+5,?,'ABC'

(2)FF2 DW 2 DUP(?),'A','BC',1000H,25H (3)FF3

DB 2 DUP(1,2 DUP(2,3),4)

偏移地址 内容 变量名 0000H 30H FF1 0001H 31H 0002H 30H 0003H 30H 0004H 07H 0005H 00H 0006H 41H 0007H 42H 0008H 43H 0009H 00H FF2 000AH 00H 000BH 00H 000CH 00H 000DH 41H 000EH 00H 000FH 43H 2

0010H 0011H 0012H 0013H 0014H 0015H 42H 00H 10H 25H 00H 01H FF3 0016H 02H 0017H 03H 0018H 02H 0019H 03H 001AH 04H 001BH 01H 001CH 02H 001DH 03H 001EH 02H 001FH 03H 0020H 04H

2.5 指出下列指令的错误。

A1 DB ? A2 DB 10

K1 EQU 1024

(1)MOV K1,AX (2)MOV A1,AX (3)CMP A1,A2 (4)K1 EQU 2048 (5)MOV AX,BH (6)MOV [BP],[DI] (7)XCHG CS,AX

(8)POP CS

解:

(1) 立即数不能为目的操作数

(2) 两个操作数的类型不一致

(3) 两个操作数不能同时为存储器操作数 (4) K1不能用EQU重复定义 (5) 两个操作数类型不匹配

(6) 两个操作数不能同时为存储器操作数 (7) CS不能作为XCHG的操作数

3

(8) CS不能为目的操作数

2.6 假设在数据段进行如下的定义:

DATA

Segment

XX DB -50,71,5,65,0 YY DB 200 DUP('ABCD') ZZ DW 100 DUP(?)

WW DW 25H,1052H,370H,851H

ENDS

DATA

(1)用一条指令将YY的偏移地址送入BX (2)用一条伪指令给出该数据段占用所有字节长度 (3)用一条伪指令给出变量ZZ分配的字节数目

(4)编写一段程序将WW数组中的数据全部送入YY缓冲区 (5)将数组XX中的第二个数据与第五个数据进行调换 解:(1)LEA BX, YY

(2)在数据段的最后加上:LEN EQU $-XX (3)ZZLEN EQU WW-ZZ (4)MOV AX,WW

MOV YY,AX

MOV AX,WW+2 MOV YY+2,AX MOV AX,WW+4 MOV YY+4,AX MOV AX,WW+6 MOV YY+6,AX (5)MOV AL,XX+1 MOV XX+4,AL

2.7 什么叫寻址方式?8086/8088指令系统有哪些寻址方式? 解:指令中操作数的寻找方法称为寻址方式。

8086/8088系统所支持的七种基本寻址方式:立即寻址, 寄存器寻址, 直接寻址, 寄存器间接寻址,寄存器相对寻址,基址变址寻址和相对基址变址寻址。

2.8 将首地址为BLOCK的字数组中的第100个数送入AX中,试写出相关指令序列,

要求分别使用以下三种寻址方式:

4

(1)以BX寄存器的间接寻址 (2)以BX寄存器的相对寻址 (3)以BX、SI寄存器的基址变址寻址 解:(1)MOV BX, OFFSET BLOCK +99*2

MOV AX, [BX] (2)MOV BX, 99*2 MOV AX, BLOCK[BX]

或:

LEA BX, BLOCK MOV AX, [BX+99*2]

(3)LEA BX, BLOCK MOV SI, 99*2

MOV AX,[BX+SI] 或:

LEA SI, BLOCK MOV BX, 99*2 MOV AX,[BX+SI]

2.9 已知:(BX)=1200H,(BP)=2400H,(SI)=0100H,(DI)=0200H,(SS)=1000H,

(DS)=2000H,(ES)=3000H,变量VAR1对应地址为2000H,试分别指出下列

指令中存储器的寻址方式及物理地址。 (1)MOV AL,[020H] (2)MOV AL,[BP+010H] (3)MOV [BX+SI-20H],AX (4)MOV BL,ES:[BX+10H] (5)MOV VAR1[BX+DI],AL

解:(1)直接寻址 PA=(DS)*16+EA=20000h+020H=20020H

(2)寄存器相对寻址PA=(SS)*16+EA=10000H+2400H+010H=12410H

(3)相对基址加变址寻址PA=(DS)*16+EA=20000H+1200H+0100H-20H=212E0H (4)寄存器相对寻址PA=(ES)*16+EA=30000H+1200H+10H=31210H

(5)相对基址加变址寻址PA=(DS)*16+EA=20000H+2000H+1200H+0200H=23400H

2.10 设Block为字单元1000H:001FH的符号地址(变量),该单元的内容是01A1H,试

问以下两条含有Block的指令有什么不同?指令执行后BX的内容是多少? (1)MOV

BX,Block

5

(2)LEA

BX,Block

解:(1)BX的内容为01A1H

(2)BX的内容为001FH

2.11 什么叫堆栈?采用堆栈的意义? 解:

2.12 若在数据段中从字节变量TABLE相应的单元开始存放了0~15的平方值,试写出包

含有XLAT指令的指令序列查找N(0~15)中的某个数的平方。(设N的值存放在CL中)

解: LEA BX, TABLE

2.13 编写程序对存放在DX,AX中的双字节长数据的求补 解:NOT

NOT ADD

ADC

2.14 写出实现下列计算的指令序列。(假定X、Y、Z、W、R都为有符号数字变量)

(1)Z=(W*X)/(R+6) (3)Z= (X+Y)/R - W 解:

(1)

MOV

IMUL MOV ADD IDIV MOV MOV

(2)

MOV

MOV IMUL

AX, W X BX, R BX, 6 BX Z, AX R, DX AX, Y BX, 5 BX

6

(2)Z=((W-X)/(5*Y))*2 (4)Z= (X/Y+ W )*100+R

DX AX AX, 1

DX, 0

;最低位加1,注意:不能用INC指令 ;把进位(如果有)传递到高位 ;首先将(DX, AX)取反

MOV AL, N XLAT

MOV MOV SUB MOV IMUL IDIV MOV

BX, AX AX, W AX, X CX, 2 CX BX Z, AX

(3)

MOV AX, X

ADD AX,Y CWD IDIV SUB MOV MOV CWD IDIV ADD MOV IMUL MOV MOV MOV CWD ADD ADC

AX,BX DX,CX R AX,W Z,AX AX,X Y AX,W BX,100 BX BX,AX CX,DX AX,R

(4)

;结果存放在DX、AX中

2.15 设在AX、BX、CX、DX中均存放的是用压缩的BCD码表示的4位十进制数,试

编写程序完成以下的计算: (1)(AX)+(BX) →AX (2)(DX)-(CX) →DX 解:(1)ADD AL, BL

DAA

ADC AL, BH

7

XCHG AL, AH

DAA

XCHG AL, AH (2)MOV AL,DL

SUB AL, CL

DAS

MOV DL, AL MOV AL, DH SBB AL, CH DAS

MOV DH, AL

2.16 简述指令的“DAA”和“DAS”对BCD码运算后进行调整的规则。解:DAA的调整规则:

if (AL低4位>9 或 AF=1)then AL=AL+06H ; AF=1 ; endif

if (AL高4位>9 或 CF=1)then AL=AL+60H ; CF=1 ; endif

DAS的调整规则:

if (AL低4位>9 或 AF=1)then AL=AL-06H ; AF=1 ; endif

if (AL高4位>9 或 CF=1)then AL=AL-60H ; CF=1 ; Endif

2.17 用程序段实现对存入在BX,AX的双字进行左移5位。 解:

SHL

AX,1

8

RCL SHL RCL SHL RCL SHL RCL SHL RCL

BX,1 AX,1 BX,1 AX,1 BX,1 AX,1 BX,1 AX,1 BX,1

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

MOV SHL MOV SHL SHR OR

CL,4 DX,CL BL,AH AX,CL BL,CL DL,BL

解:把32位二进制代码(DX, AX)联合左移4位。

2.19 已知程序段如下:

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 MOV ROL DEC MOV MUL

AX,1234H CL,4 AX,CL AX CX

CX,4

;AX内容为1234H,CF、SF、ZF的值保留初值 ;AX内容为1234H,CF、SF、ZF同上 ;AX内容为2341H,CF=1、SF=0、ZF=0 ;AX内容为2340H,CF=1、SF=0、ZF=0 ;AX内容为2340H,CF=1、SF=0、ZF=0 ;AX内容为8D00H,CF=0、SF=0、ZF=0

9

2.20 程序中的“转移”是个什么概念?CPU执行转移指令是如何实现转移的? 解:程序中的“转移”是指改变程序的顺序执行过程,某条指令执行完后,不是紧接着执行该指令后面的指令,而是执行其它的指令。CPU是通过改变CS和IP指令指针的值来实现转移的。

2.21 设(DS)=2000H,(BX)=0030H,(SI)=0202H,(20232H)=00H,(200233H)

=06H,分别执行下述两条指令后,实际转移的目标地址物理地址多少? (1)JMP (2)JMP

BX

Word PTR[BX+SI]

解:(1)目的地址为0030H

(2)转移的目标地址为:由[BX+SI]寻址得存储单元的地址为20232H,目的地址为0600H。

2.22 编写指令序列,实现下述要求

(1) 使AX寄存器的低 4 位清零,其余位不变。 (2) 使BX寄存器的低4 位置1,其余位不变。

(3) 测试 BX中的位0 和位4,当这两位同时为零时,将AL置1,否则AL置0。 解:(1)AND AX, 0FFF0H

(2)OR

JZ

AX, 000FH NEXT

;ZF=1,表明这两位同时为0,转走将AL置1 ;ZF=0,表明这两位不同时为0,将AL清0

(3)TEST AX, 0011H

MOV AL,0 JMP EXIT

NEXT: MOV AL,1 EXIT:

2.23 下面程序段在什么情况下执行结果是(AH)=0?

BEGIN: IN AL, 60H

TEST AL, 80H JZ BRCH1 XOR AX, AX JMP STOP

BRCH1: MOV AH, 0FFH

10

STOP: ??

解:从60H端口读到是数据最高位为1时,使(AH)为0;数据最高位为0时,使(AH)为0FFH。

2.24 “CALL”指令与“JMP”指令相同之处是什么?不同之处是什么?

解:相同之处:“CALL”指令和“JMP”指令都能实现程序的控制转移,改变程序顺序指令的过程。

不同之处:“CALL”指令执行时,使程序转移到子程序中执行,执行完子程序后,还是会回到调用程序,继续执行紧跟在“CALL”指令之后的那条指令。但“JMP”指令执行完后一般不会去执行紧跟在“JMP”指令之后的那条指令。

2.25 叙述8086/8088CPU执行指令“CALL DWORD PTR[100H]”的步骤。

2.26 设下列程序执行前,栈顶指针SS:SP为1000H:0220H,试求:

POP CX POP BX POP AX RET 4

(1) 画出该程序执行后的堆栈存储情况示意图。 解:使堆栈指针加10,上面的5个字的内容出栈,图略。 (2) 给出当前栈顶SS和SP的值。

(SS)=1000H, (SP)=022AH

2.27 一双字长的带符号数放在X和X+2中(X为变量),试编写一程序对这个数求其绝

对值。 解:

TEST [X+2], 8000H ;测试最高位,判断正负,负数好取绝对值 JZ MOV MOV NOT NOT ADD ADC

DONE AX, X DX, [X+2] AX DX AX, 1 DX, 0

11

MOV MOV

[X], AX [X+2], DX

DONE:

2.28 试编写一个汇编语言程序,要求将键盘输入的小写字母用大写字母显示出来。 解:CODE SEGMENT

2.29 试编写程序实现错误!未找到引用源。的功能,但是不要使用字符串操作指令。 解:

LEA LEA INC INC MOV CMP

SI, STRING1-1

DI, STRING2-1 SI DI AL, [SI] AL, ES:[DI]

ASSUME

MOV INT CMP JZ OR INT JMP INT END

CS: CODE AH, 01H 21H

AL, 0DH ;输入回车推出程序 EXIT AL, 20H 21H START 21H START

START:

MOV AH, 02H

EXIT: MOV AX, 4C00H

CODE ENDS

MOV CX, 20

AGA:

LOOPZ AGA

2.30 试编写程序实现错误!未找到引用源。的功能,但是不要使用字符串操作指令。 解: LEA DI, STRING2

MOV AL, ‘A’ MOV CMP

CX, 20 AL, ES:[DI]

12

AGA:

JZ INC LOOP

EXIT DI AGA

EXIT:

2.31 在使用“REPNZ CMPSB”指令时,应事先做好哪些工作?

解:将源串的偏移地址送入SI,目的串的偏移地址送入DI,方向标志DF清0,比较的字节数送入CX。

2.32 已知在以ARRAY为首地址的内存区域存放了100个字节数,试编写相关的程序段

用以完成将该数据传送到BUFF为首地址的存储区域中。分别用以下不同方法实现。 (1)用一般数据传送指令“MOV”实现。 (2)用字符传送指令“MOVSB”实现。

(3)用重复操作前缀传送指令“REP MOVSB”实现。 (4)用LODSB/STOSB实现。 解:(1)

LEA LEA MOV MOV INC INC LOOP LEA

(3)

LEA

LEA

SI, ARRAY

DI, BUFF

13

LEA MOV

SI, ARRAY DI, BUFF AL, [SI] [DI], AL SI DI AGA SI, ARRAY DI, BUFF AX, DS

MOV CX, 100

AGA:

(2)

MOV ES, AX MOV CX, 100 CLD

MOVSB

LOOP AGA

AGA:

MOV AX, DS

MOV ES, AX MOV CX, 100 CLD REP LEA

MOVSB SI, ARRAY DI, BUFF AX, DS

(4)

2.33 判断STRING1和STRING2为首地址的内存区域存放了二个长度为20的字符串是

否相等。若相等将SIGN单元置1,反之,将SIGN单元置0。分别用以下不同方法实现。

(1)用比较条件转移指令实现。 (2)用重复操作前缀搜索指令实现。 解:(1)

LEA

LEA INC INC MOV CMP JZ MOV JMP

14

SI, STRING1-1 DI, STRING2-1 SI DI AL, [SI] AL [DI] EQ

SIGN, 0 EXIT

LEA MOV

MOV ES, AX MOV CX, 100 CLD LODSB STOSB LOOP

AGA

AGA:

MOV CX, 20

AGA:

LOOPZ AGA

EQ: EXIT:

MOV SIGN, 1

(2)

LEA

SI, STRING1 LEA DI, STRING2 MOV

AX, DS

MOV ES, AX MOV CX, 20 CLD REPE CMPSB JZ EQ MOV SIGN, 0

JMP EXIT

EQ: MOV SIGN, 1

EXIT:

2.34 试用其他指令序列来代替完成以下指令的功能:(1)LOOP NEXT (2)LDS BX,[100H] (3)XLAT (4)LOOPZ NEXT (5)LAHF

(6)XCHG AX,[BX]

(7)NEG Word PTR[1000H] (8)ADC AL,[SI+BX] (9)TEST AL,00001111B (10)MOVSW(DF=0) (11)REPZ CMPSB(DF=0)

解:(1)DEC CX

JNZ

NEXT

(2)MOV BX, [100H]

MOV DS, [102H] (3) MOV

AH,0 ADD

BX, AX MOV

AL, [BX]

(4) JNZ EIXT

15

LOOP NEXT EXIT:

(5) 题目好像不对 (6) MOV

CX, [BX] MOV

[BX], AX MOV

AX, CX (7) MOV

AX, 0

SUB

AX, [1000H] MOV

[1000H], AX

(8)

JNC NEXT

ADD AL, [SI+BX] INC AL JMP

DONE

NEXT: ADD AL,[SI+BX] DONE:

(9) MOV

BL,AL

AND BL, 00001111B (10) MOV

AX,[SI] MOV

ES:[DI],AX INC SI INC SI INC DI INC

DI

(11) NEXT:MOV AL,[SI]

CMP AL,ES:[DI]

JNE EXIT INC SI INC DI

LOOP

NEXT

EXIT:

16