微机原理第3章

第3章8086CPU指令系统=

1.写出完成下列要求的变量定义语句:

(3)在缓冲区buf1中留出100个字节的存储空间;

(4)在缓冲区buf2中,保存5个字节的55H,再保存10个字节的240,并将这一过程重复7次;

(5)在变量var3中保存缓冲区buf1的长度;

(6)在变量pointer中保存变量var1和缓冲区buf1的偏移地址。

解:

buf1 DB 100 DUP(?)

buf2 DB 7 DUP(5 DUP(55H),10 DUP(240))

var3 DB LENGTH buf1

pointer DW var1,buf1 (或者pointer D W OFFSET var1,OFFSET buf1)2.设变量var1的逻辑地址为0100:0000,画出下列语句定义的变量的存储分配图:

var1 DB 12,-12,20/6,4 DUP(0,55H)

var2 DB ‘Assemble’

var3 DW ‘AB’, ‘cd’, ‘E’

var4 DW var2

var5 DD var2

解:

微机原理第3章

3.指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因(设

VAR1, VAR2为字变量, L1为标号):

(1)MOV SI,100 (2)MOV BX,VAR1[SI]

(3)MOV AX, [BX] (4)MOV AL, [DX]

(5)MOV BP, AL (6)MOV VAR1, VAR2

(7)MOV CS, AX (8)MOV DS, 0100H

(9)MOV [BX][SI], 1 (10)MOV AX, VAR1+VAR2

(11)ADD AX, LENGTH VAR1 (12)OR BL, TYPE VAR2

(13)SUB [DI], 78H (14)MOVS VAR1, VAR2

(15)PUSH 100H (16)POP CS

(17)XCHG AX, ES (18)MOV DS, CS

(19)JMP L1+5 (20)DIV AX, 10

(21)SHL BL, 2 (22)MOV AL, 15+23

(23)MUL CX (24)XCHG CL, [SI]

(25)ADC CS:[0100], AH (26)SBB VAR1-5,154

解:(1)MOV SI,100 正确。源:立即数寻址,目的:寄存器寻址(2)MOV BX,V AR1[SI] 正确。源:寄存器相对寻址,目的:寄存器寻址

(3)MOV AX,[BX] 正确。源:寄存器间接寻址,目的:寄存器寻址

(4)MOV AL,[DX] 错误。寄存器间接寻址时,DX, AX, CX不能作地址寄存器(5)MOV BP,AL 错误。操作数类型不一致

(6)MOV V AR1,V AR2 错误。两存储单元之间不能用MOV指令传送数据

(7)MOV CS,AX 错误。CS不能为目的操作数

(8)MOV DS,0100H 错误。目的操作数为段寄存器时,源操作数不能为立即数(9)MOV [BX][SI],1 错误。指令类型不定。

(10)MOV AX,V AR1+V AR2 错误。MOV指令中不能完成加法运算

(11)ADD AX,LENGTH V AR1 正确。源:立即数寻址。目的:寄存器寻址

(12)OR BL,TYPE V AR2 正确。源:立即数寻址。目的:寄存器寻址

(13)SUB [DI],78H 错误。指令类型不定

(14)MOVS V AR1,V AR2 正确。目的、源均为隐含寻址。操作数仅指出操作数类型(15)PUSH 100H 错误。将常数压入堆栈,要通过寄存器来实现

(16)POP CS 错误。目的操作数不能为CS

(17)XCHG AX,ES 错误。XCHG指令的操作数不能是段寄存器

(18)MOV DS,CS 错误。MOV指令不能从段寄存器到段寄存器

(19)JMP L1+5 正确。段内直接转移

(20)DIV AX,10 错误。指令格式错误。

(21)SHL BL,2 错误。移位指令的移位数为1或者CL

(22)MOV AL,15+23 正确。源:立即数寻址,目的:寄存器。编译时就处理为38 (23)MUL CX 正确。源:寄存器寻址,目的:寄存器寻址

(24)XCHG CL,[SI] 正确。源:寄存器间接寻址,目的:寄存器寻址

(25)ADC CS:[0100],AH 正确。源:寄存器寻址,目的: 直接寻址(数据在代码段中)(26)SBB V AR1-5,154 正确。源:立即数寻址,目的:直接寻址。

4.说明下列指令对的区别:

(1)MOV AX,VAR1 与 MOV AX,OFFSET VAR1

(2)MOV AX,VAR2 与 LEA AX,VAR2

(3)MOV AL,LENGTH VAR1 与 MOV AL,SIZE VAR1

(4)MOV AL,ES: [DI] CMP AL, [SI] 与 CMPSB

(5)SHR AL,1 与 SAR AL,1

(6)SHR AL,1 与 ROR AL,1

(7)ROL BX,1 与 RCL BX,1

解:(1)MOV AX,V AR1 把变量V AR1对应地址单元中的一个字送入AX MOV AX,OFFSET V AR1 把V AR1的有效地址的偏移地址送入AX (2)MOV AX,V AR2 把变量V AR2对应地址单元中的一个字送入AX LEA AX,V AR2 把V AR2的有效地址的偏移地址送入AX

(3)MOV AL,LENGTH V AR1 把变量V AR1的长度送入AL

MOV AL,SIZE V AR1 把变量V AR1的大小送入AL

(4)MOV AL,ES:[DI]

CMP AL,[SI] 把以ES为段地址,DI为偏移地址的一个字节送入AL,

并与以SI内容为偏移地址的一个字节作比较,改变标志寄

存器内容。(相当于作ES:(DI)与(DS: (SI)内容比较)CMPSB 对字符串中的一字节比较。寻址方式隐含。源串的地址由

DS:SI指定,目的串的地址由ES:DI指定。(相当于作

DS: (SI)与ES:(DI)内容比较)

(5)SHR AL,1 AL逻辑右移1位,最高位移入0, 最低位移入CF。

SAR AL,1 AL算术右移1位,以最高位内容移入,最低位移入CF, 其余各位

右移一位。

(6)SHR AL,1 AL逻辑右移1位,最高位移入0, 最低位移入CF。

ROR AL,1 AL的各位构成环形移位,右移一位,最低位内容同时移入到CF和

最高位。

(7)ROL BX,1 BX各位构成环形移位,左移一位,最高位内容同时移入到CF和

最低位。

RCL BX,1 BX和CF构成环形移位,左移一位,CF内容移入到最低位,最

高位移入CF。

5.写出下列转移指令的寻址方式(设L1为标号,VAR1为字型变量,DVAR1为双字型变量):

(1)JMP L1 (2)JMP NEAR L1

(3)JNZ L1 (4)JMP BX

(5)JG L1 (6)JMP VAR1[SI]

(7)JMP FAR PTR L1 (8)JMP DVAR1

解:(1)JMP L1 段内直接寻址(2)JMP NEAR PTR L1 段内直接寻址(3)JNZ L1 段内直接寻址(4)JMP BX 段内间接寻址

(5)JG L1 段内直接寻址(6)JMP V AR1[SI] 段内间接寻址

(7)JMP FAR PTR L1 段间直接寻址(8)JMP DV AR1 段间间接寻址

6.设(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=3412H,(20102)=7856H,

(21200)=4C2AH,(21202)=65B7H,求下列指令执行后AX寄存器的内容:

(1)MOV AX,1200H;(2)MOV AX,BX;(3)MOV AX, [1200H];

(4)MOV AX, [BX]; (5)MOV AX,1100[BX];(6)MOV AX, [BX][SI];

(7)MOV AX,1100[BX][SI]

解:(1)1200H (2)0100H (3)4C2AH (4)3412H (5)4C2AH (6)7856H (7)65B7H

7.执行下列指令后,DX寄存器中的内容是多少?

TABLE DW 25,36,-1,-16,10000,13

PYL DW 7

……

MOV BX,OFFSET TABLE

ADD BX,PYL

MOV DX,[BX]

解:DX = 10FFH 由-16(FFF0H)的高8位和10000(2710H)的低8位构成

8.如果堆栈的起始地址为2200:0000,栈底为0100H,(SP)=00A8H,求

(1)栈顶地址;

(2)SS的内容;

(3)再存入数据5678H,3AF2H后,SP的内容。

解:栈顶地址00A8H,SS = 2200H,再存入2个字后,SP = 00A4H

9.设已用伪指令EQU定义了4个标识符:

N1 EQU 2100

N2 EQU 10

N3 EQU 20000

N4 EQU 25000

下列指令是否正确?并说明原因。

(1)ADD AL,N1-N2;(2)MOV AX,N3+N4;

(3)SUB BX,N4-N3;(4)SUB AH,N4-N3-N1;

(5)ADD AL,N2;(6)MOV AH,N2*N2

解:(1)错误。N1-N2=2090>255 (2)正确(3)正确(4)错误。N4-N3-N1=2900>255 (5)正确(6)正确

10.按下列要求写出指令:

(1)将AX寄存器的低4位清零,其余位不变;

(2)将BX寄存器的低4位置1,其余位不变;

(3)将AL寄存器的低4位保持不变,高4位取反;

(4)测试BX中的位1和位2,当这两位同时为0时将AL置0FFH,否则AL清零;

(5)测试BX中的位1和位2,当这两位有一位为0时将AL置0FFH,否则AL清零;

(6)将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码;

(7)将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码;

(8)将AX中的各位取反;

(9)将DX中的低7位取反,高9位不变;

(10)将CX中的低8位与高8位互换。

解:(1)AND AX,0FFF0H

(2)OR BX,000FH

(3)XOR AL,0F0H

(4)TEST BX,06H (5)MOV AX,BX JZ ZERO AND AX,06H

MOV AL,00H XOR AX,06H

JMP OVER JZ OVER ZERO:MOV AL,0FFH MOV AL,0FFH OVER:OVER:

(6)AND AL,5FH

或者:

CMP AL,61H

JL OVER (无需变换或不是字母)

CMP AL,7AH

JG OVER (不是字母)

AND AL,5FH 或SUB AL,20H

OVER:

(7)OR AL,20H

或者:

CMP AL,41H

JL OVER (不是字母)

CMP AL,5AH

JG OVER (无需变换或不是字母)

OR AL,20H 或ADD AL,20H

OVER:

(8)XOR AX,0FFFFH 或者NOT AX

(9)XOR DX,007FH

(10)XCHG CH,CL

11.写出完成下述功能的程序段:

(1)传送40H到AL寄存器;

(2)将AL的内容乘以2;

(3)传送16H到AH寄存器;

(4)AL的内容加上AH的内容。

计算最后结果(AL)=?

解:(1)MOV AL,40H

(2)SHL AL,1

(3)MOV AH,16H

(4)ADD AL,AH

AL=96H

12.写出完成下述功能的程序段:

(1)从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器;

(2)将AX寄存器的内容右移2位;

(3)将AX内容与BUF的0006偏移地址处的一个字相乘;

(4)相乘结果存入BUF的0020H偏移地址处(低位在前)。

解:(1)LEA SI, BUF

MOV AX, [SI+4]

(2) SHR AX,1

SHR AX,1

(3) MUL WORD PTR 6[SI]

(4) MOV 20H[SI],AX

MOV 22H[SI],DX

13.设(BX)=11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX的内

容:

(1)XOR BX,VAR;(2)AND BX,VAR;

(3)OR BX,VAR;(4)XOR BX,11110000B;

(5)AND BX,00001111B;(6)TEST BX,1

解:(1)00F9H

(2)0002H

(3)00FBH

(4)003BH

(5)000BH

(6)00CBH

14.设(DX)=10111011B,(CL)=3,(CF)=1,求下列指令单独执行后DX的内容:

(1)SHR DX,1;(2)SAR DX,CL;(3)SHL DX,CL;

(4)SHL DX,1;(5)ROR DX,CL;(6)ROL DL,CL;

(7)SAL DH,1;(8)RCL DX,CL;(9)RCR DL,1

解:DX= 0000 0000 1011 1011B CF=1 CL=3

(1)SHR DX,1 DX逻辑右移1 0000 0000 0101 1101B = 005DH (2)SAR D X,CL DX算术右移3 0000 0000 0001 0111B = 0017H

(3)SHL DX,CL DX逻辑左移3 0000 0101 1101 1000B = 05D8H

(4)SHL DX,1 DX逻辑左移1 0000 0001 0111 0110B = 0176H

(5)ROR DX,CL DX循环右移3 0110 0000 0001 0111B = 6017H

(6)ROL DL,CL DL循环左移3 0000 0000 1101 1101B = 00DDH (7)SAL DH,1 DH算术左移1 0000 0000 1011 1011B = 00BBH

(8)RCL D X,CL DX带进位循环左移3 0000 0101 1101 1100B = 05DCH (9)RCR DL,1 DL带进位循环右移1 0000 0000 1101 1101B = 00DDH 15.选择题(各小题只有一个正确答案)

(1)执行下列三条指令后:

MOV SP,1000H

PUSH AX

CALL BX

a. (SP)=1000H;

b. (SP)=0FFEH;

c. (SP)=1004H;

d. (SP)=0FFCH;

(2)要检查寄存器AL中的内容是否与AH相同,应使用的指令为:

a. AND AL, AH

b. OR AL, AH

c. XOR AL, AH

d. SBB AL, AH

(3)指令JMP NEAR PTR L1与CALL L1(L1为标号)的区别在于:

a. 寻址方式不同;

b. 是否保存IP的内容;

c. 目的地址不同;

d. 对标志位的影响不同。

解:(1)D PUSHU AX则AX入栈,SP=0FFEH;CALL BX则IP入栈,SP=0FFCH (2)C 异或,若相同,则AL=0,ZF=1。

(3)B

16.寄存器DX:AX组成32位数,DX为高位,编写程序段实现:

(1)DX:AX右移3位,并将移出的低3位保存在CL中;

(2)DX:AX左移3位,并将移出的高3位保存在CL中;

解:(1)移出的3位应该按时序移入CL中。

XOR CL,CL

MOV BL,3

L1: SHR DX,1

RCR AX,1

RCL CL,1

DEC BL

JNZ L1

(2)移出的3位应该按时序移入CL中。

XOR CL,CL

MOV BL,3

L1: SHL AX,1

RCR DX,1

RCR CL,1

DEC BL

JNZ L1

17.编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL

=01011101B时,则得到的(DX)=0F0FH,(AX)=0FF0FH。

解:算术右移时,移入的值就是最高位本身,这样可以使位内容重复,利用这一点可以实现

题目的要求。

XOR DX,DX XOR AX,AX

MOV

CX,4

L1: SHR BL,1 RCR AX,1 SAR AX,1 SAR AX,1 SAR AX,1 LOOP L1

MOV

CX,4

L2: SHR BL,1

RCR DX,1 SAR DX,1 SAR DX,1 SAR DX,1

LOOP

L2

18. 字变量VAR1中保存有小于38250的16位无符号数,编写程序段实现V AR1÷150,并

进行四舍五入操作,将商保存在字节变量VAR2中。

解:根据题意,38250÷150=255,因此商不会超过255,可以用一个字节表示。

a ÷

b 的四舍五入操作可以通过判断除后余数实现:余数大于等于除数的一半,则商加1;否则不用加1。但这种方法用汇编语言编程实现时比较复杂,这里介绍另外一种方法:设a ÷b 的四舍五入后的结果为

c ,用『』表示取整数操作,则

20.5b a a c b b ?

?+????

=+=

????

????

这种方法是在除法操作之前,在被除数上加上除数的一半,这样除法操作后得到的值就是考虑了四舍五入的商。 V AR1

DW 12345

V AR2

DB ?

DATAA

DB 150

MOV AX,V AR1 XOR BX,BX MOV BL,DATAA SHR BX,1 ADD AX,BX DIV DATAA

MOV V AR2,AL

19. 有一组无符号的16位数据保存在BUFFER 中,前两个字节存放数据的个数,编程实现

按下式进行滤波处理:

()1

()()(1)(2)23()()2

y k x k x k x k k y k x k k =

+-+-≥=<

解:滤波结果保存在FILT 中。

BUFFER DW 0CH

DW 33H, 18H, 1BH, 06H, 33H, 08H DW 3H, 6H, 0FH, 51H, 05H, 0CH

FILT DW 100H DUP (?)

LEA SI,BUFFER LEA DI,FILT MOV CX,[SI] MOV [DI],CX ADD SI,2 ADD DI,2 XOR DX,DX MOV AX,[SI] MOV [DI],AX MOV BX,2[SI] MOV 2[DI],BX

ADD SI,4

ADD DI,4

DEC CX

DEC CX

ADD AX,BX

ADC DX,0

MOV BX,3

L1:

ADD AX,[SI]

ADC DX,0

PUSH DX

PUSH AX

DIV BX

MOV [DI],AX

POP AX

POP DX

SUB AX, [SI-4]

SUBB DX,0

ADD DI,2

ADD SI,2

LOOP L1

20.在由字符串构成的缓冲区BUFFER中,前2个字节存放字符个数,后续每个字节存放

一个字符的ASCII码。编写程序实现将字符串‘2004’替换成‘2006’。

解:在数据段中定义:

BUFFER DW 74

DB ‘This year is 2004. In 2004, we have a plan for reducing annual expensive 10%’DEST DB ‘2004’

在代码段中编写程序段:

CLD

LEA SI, BUFFER

MOV CX,[SI]

ADD SI,2

LEA DI,DEST

L1: PUSH SI

PUSH DI

PUSH CX

MOV CX,4

REPZ SCASB

JNZ L2

MOV BYTE PTR [SI-1],’6’

L2: POP CX

POP DI

POP SI

INC SI

INC DI

LOOP L1

21.定义有下列宏指令:

WAGS MACRO S1,S2,S3

SUB AX,AX

MOV DX,AX

ADD AX,S1

ADD AX,S2

ADC DX,0

ADD AX,S3

ADC DX,0

ENDM

当采用宏调用指令“WAGS 60000,25000,3000”时,执行后DX=AX=。解:宏指令W AGS完成的功能为S1+S2+S3,结果放在DX:AX中。所以,调用“W AGS

60000,25000,3000”时,其结果为DX=0001H ,AX=57C0H

22.对上题定义的宏指令,如果采用宏调用指令“W AGS BX,CX,SI”时,写出宏展开形式。解:调用“WAGS BX,CX,SI”时,宏展开形式:

SUB AX,AX

MOV DX,AX

ADD AX,BX

ADD AX,CX

ADC DX,0

ADD AX,SI

ADC DX,0

23.写出宏指令SUMMING,实现将字节缓冲区array中的内容求校验和(保留低8位),

并保存在V ALUE中。

解:设array前两个字节保存缓冲区字节数,在宏指令SUMMING,将array和V ALUE作为形式参数。

SUMMING MACRO array,V ALUE

LEA SI,array

MOV CX,[SI]

ADD SI,2

XOR AL,AL

L1: ADD AL,[SI]

INC SI

LOOP L1

MOV V ALUE,AL

ENDM

相关推荐
相关主题
热门推荐