《微机原理与接口技术》(第二版)龚尚福-习题解析和实验指导 下载本文

【解】:XLAT指令是将AL的内容替换成存储单元中的一个数,往往用于代码转换。使用此指令前,先在数据段建立一个表格,表格首地址存入BX寄存器,欲取代码的表内位移量存入AL寄存器中。XLAT指令将(AL)值扩展成16位,与(BX)相加形成一个段偏移地址,段地址取(DS),据此读出代码送入AL寄存器。 程序如下:TABLE DB 30H, 31H, ┅, 39H ARRAY DB 1O DUP(?) MOV CL, 10 MOV SI, 0

MOV BX, OFFSET TABLE MOV AL, AL AGAIN: XLAT

MOV [SI], AL INC SI INC AL

LOOP AGAIN

3.17 若(AX)=0001H,(BX)=0FFFFH,执行ADD AX,BX之后,标志位ZF、SF、CF和OF各是什么? 【解】: (AX)= 0001H = 0000 0000 0000 0001 B + (BX)=0FFFFH = 1111 1111 1111 1111 B

(AX)= 0001H = 1 0000 0000 0000 0000 B 则:ZF=1、SF=0、CF=1、OF=0 3.18 写一指令序列完成将AX寄存器的最低4位置1,最高3位清0,第7、8、9位取反,其余位不变。 【解】: OR AX, 000FH (OR AX, 0000 0000 0000 1111 B) AND AX, 1FFFH (AND AX, 0001 1111 1111 1111 B) XOR AX, 01C0H (XOR AX, 0000 0001 1100 0000 B)

3.19 试写出执行下列指令序列后AX寄存器的内容。执行 前(AX)=1234H。 MOV CL,7 SHL BX,CL 【解】:(AX) = 1234H = 0001 0010 0011 0100 B

执行后:(AX) = 0 0011 0100 0000 000 B = 0001 1010 0000 0000 B = 1A00H

4.1 假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么? ⑴ MOV BP,AL ⑵ MOV WORD_OP[BX+4*3][DI],SP ⑶ MOV WORD_OP1,WORD_OP2 ⑷ MOV AX,WORD_OP1[DX] ⑸ MOV SAVE WORD,DS ⑹ MOV SP,SS:DATA_WORD[BX][SI] ⑺ MOV [BX][SI],2 ⑻ MOV AX,WORD_OP1+WORD_OP2 ⑼ MOV AX,WORD_OP1-WORD_OP2+100 ⑽ MOV WORD_OP1,WORD_OP1-WORD_OP2 【解】:⑴ MOV BP,AL 两个操作数不匹配

⑵ MOV WORD_OP[BX+4*3][DI],SP ⑶ MOV WORD_OP1,WORD_OP2 两个内存单元之间不能直接传送数据 ⑷ MOV AX,WORD_OP1[DX] ⑸ MOV SAVE WORD,DS

⑹ MOV SP,SS:DATA_WORD[BX][SI] 当基址为BX时,选取DS寄存器 ⑺ MOV [BX][SI],2 ⑻ MOV AX,WORD_OP1+WORD_OP2

⑼ MOV AX,WORD_OP1-WORD_OP2+100 ⑽ MOV WORD_OP1,WORD_OP1-WORD_OP2

4.2 假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处: ⑴ ADD VAR1,VAR2 ⑵ SUB AL,VAR1 ⑶ JMP LAB[SI] ⑷ JNZ VAR1 ⑸ JMP NEAR LAB 【解】:⑴ ADD VAR1,VAR2 ADD两个操作数不能同时为存储单元, MOV AX, VAR1 ADD AX, VAR2 ⑵ SUB AL,VAR1 两个操作数不匹配 SUB AX, VAR1 ⑶ JMP LAB[SI] LAB与[SI]不能相加

JMP WORD PTR [SI] ⑷ JNZ VAR1

JNZ后面应是标号,不应是变量 JNZ LAB

⑸ JMP NEAR LAB 缺少PTR运算符

JMP NEAR PTR LAB

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

⑴ BYTE_VAR DB ’BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?) ⑵ WORD_VAR DW 5 DUP(0,1,2),?,-5,,'BY','TE',256H 【解】:(1) (2)

WORD_VAR BYTE_VAR 41H 00H B 0

59H 00H Y T 54H 01H 1 E 45H 00H

0CH 12 02H 2

F4H -12H 00H 00H 0 30个字节 … - 00H 0 01H 1 00H

02H 2 01H 1 01H 1 00H 02H 2 02H 2 00H 0 00H

- - 2 01H 1 - FBH 02H 2 -5 FFH 01H 1

41H 02H 2 B 00H 00H 0 59H - Y

01H 02H 01H 02H 1 2 1 2 00H 54H 00H 45H 00H 56H T E

256H 02H

4.4 假设程序中的数据定义如下: PARTNO DW ?

PNAME DB 16 DUP(?) COUNT DD ?

PLENTH EQU $-PARTNO

问PLENTH的值为多少?它表示什么意义? 【解】:PLENTH的值为22,它表示数据的个数。 4.5 有符号定义语句如下:

BUFF DB 1,2,3,’123’ EBUFF DB 0

L EQU EBUFF-BUFF 问L的值是多少? 【解】:PLENTH的值为6。

4.6 假设程序中的数据定义如下: LNAME DB 30 DUP(?) ADDRESS DB 30 DUP(?) CITY DB 15 DUP(?) CODE-LIST DB 1,7,8,3,2

⑴ 用一条MOV指令将LNAME的偏移地址放入AX。

⑵ 用一条指令将CODE_LIST的头两个字节的内容放入SI。

⑶ 写一条伪操作使CODE_LENGHT的值等于CODE_LIST域的实际长度。 【解】: ⑴ 用一条MOV指令将LNAME的偏移地址放入AX。 MOV AX, OFFSET LANME

⑵ 用一条指令将CODE_LIST的头两个字节的内容放入SI。 MOV SI, WORD PTR CODE_LSIT

⑶ 写一条伪操作使CODE_LENGHT的值等于CODE_LIST域的实际长度。 CODE_LENGHT EQU CITY-CODE_LIST

4.7 试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中。然后,写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。 【解】:参考程序如下:

DATA_SEG SEGMENT DB1 DB 5

DATA_LIST DB -1, 0, 2, 5, 4, 5 DUP(?) COUNT DB 5 MAX DB ? MIN DB ? DATA_SEG ENDS

CODE_SEG SEGMENT

ASSUME CS:CODE_SEG, DS:DATA_SEG START PROC FAR PUSH DS MOV AX, 0 PUSH AX

MOV AX, DATA_SEG MOV DS, AX

LEA BX, DATA_LIST MOV CX, COUNT-1 MOV AL, [BX] MOV AH, [BX+1] LOOP1: INC BX CMP AH, AL JAE LOOP1 XCHG AH, AL LOOP2 INC BX

CMP AH, [BX] JAE LIS

XCHG AH, [BX] JMP LOP2 LIS: CMP AL , [BX] JBE LOP2

XCHG AL, [BX] LOOP2

MOV MAX, AH MOV MIN, AL RET START ENDP CODE_SEG ENDS END START 4.10 给出等值语句如下: ALPHA EQU 100 BETA EQU 25 GAMMA EQU 2 下列表达式的值是多少? ⑴ ALPHA*100+BETA ⑶ (ALPHA+2)*BETA-2 ⑸ (ALPHA+3)*(BETA MOD GAMMA) ⑺ BETA AND 7 【解】: ⑴ ALPHA*100+BETA 100×10025=10025 ⑵ ALPHA MOD GAMMA+BETA 100/(25+2)=19

⑵ ALPHA MOD GAMMA+BETA ⑷ (BETA/3) MOD 5

⑹ ALPHA GE GAMMA ⑻ GAMMA OR 3