3.16 解释XLAT指令是怎样转换AL寄存器中的容的。并编写一段程序用XLAT指令将BCD码0~9转换成对应的ASCII码,并将ASCII码存入数据ARRAY中。 【解】: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 … - 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 - 01H 02H 01H 02H 1 2 1 2 59H 00H 54H 00H 45H 00H 56H Y T E 30个字节
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 MOD GAMMA+BETA ⑶ (ALPHA+2)*BETA-2 ⑷ (BETA/3) MOD 5 ⑸ (ALPHA+3)*(BETA MOD GAMMA) ⑹ ALPHA GE GAMMA ⑺ BETA AND 7 ⑻ GAMMA OR 3 【解】: ⑴ ALPHA*100+BETA
100×10025=10025 ⑵ ALPHA MOD GAMMA+BETA