15.若(AL)=85H,(BL)=11H,在分别执行指令MUL和IMUL后,其结果是多少?
第4章 汇编语言程序设计
1. 请分别用DB、DW、DD伪指令写出在DATA开始的连续8个单元中依次存放数据11H、
22H、33H、44H、55H、66H、77H、88H的数据定义语句。 解:定义如下:
DATA DB 11H,22H,33H,44H,55H,66H,77H,88H DW 2211H,4433H,6655H,8877H DD 44332211H,88776655H
2. 若程序的数据段定义如下,写出各指令语句独立执行后的结果:
DSEG SEGMENT
DATA1 DB 10H,20H,30H DATA2 DW 10 DUP(?) STRING DB ‘123’ DSEG ENDS
(1) MOV AL,DATA1
(2) MOV BX,OFFSET DATA2 (3) LEA SI,STRING ADDBX,SI 解:(1)取变量DATA1的值. 指令执行后,(AL)=10H. (2)取变量DATA2的偏移地址. 指令执行后,(BX)=0002H.
(3)先取变量STRING的偏移地址送寄存器SI,之后送SI的内容与DI的内容相加并将结果送DI.指令执行后,(SI)=0016H;(DI)=(DI)+0018H
3. 试编写求两个无符号双字长数之和的程序。两数分别在MEM1和MEM2单元中,和放
在SUM单元。 解:程序编写如下: DATA SEGMENT
MEM1 DW 6655H,8877H MEM2 DW 8877H,6655H
SUM DW 2 DUP(?) ;55667788H+77885566H=0CCEECCEEH DATA ENDS CODE SEGMENT
第 11 页 共 27 页
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,MEM1+2 ADD AX,MEM2+2 MOV SUM+2,AX MOV AX,MEM1 ADC AX,MEM2 MOV SUM,AX MOV AH,4CH INT 21H CODE ENDS
END START
4. 试编写程序,测试AL寄存器的第4位是否为0?
解:程序编写如下: CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: TEST AL,08H JZ L1
┇
L1:
┇
MOV AH,4CH
INT 21H CODE ENDS
END START
5. 编写程序,将BUFFER中的一个8位二进制数转换为ASCII码,并按位数高低顺序存
放在ANSWER开始的内存单元中。
解:程序编写如下: DATA SEGMENT
BUFFER DB 4AH
ANSWER DB 2 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
第 12 页 共 27 页
MOV AL,BUFFER MOV CL,4 SHR AL,CL CMP AL,10 JC L1 ADD AL,7 L1: ADD AL,30H MOV ANSWER,AL
MOV AL,BUFFER
AND AL,0FH CMP AL,10 JC L2 ADD AL,7 L2: ADD AL,30H
MOV ANSWER+1,AL
MOV AH,4CH
INT 21H CODE ENDS
END START
6. 假设数据项定义如下:
DATA1 DB ‘HELLO! GOOD MORNING!’ DATA2 DB 20 DUP(?)
用串操作指令编写程序段,使其分别完成以下功能: i. 从左到右将DATA1中的字符串传送到DATA2中;
ii. 传送完后,比较DATA1和DATA2中的内容是否相同; iii. 把DATA1中的第3和第4个字节装入AX; iv. 将AX的内容存入DATA2+5开始的字节单元中。 解:编写程序段如下: (1) LEA SI,DATA1 LEA DI,DATA2 MOV CX,20
CLD
REP MOVSB (2) LEA SI,DATA1 LEA DI,DATA2 MOV CX,20
CLD
第 13 页 共 27 页
REPE CMPSB
JNZ NO ;不同转移到NO ;否则二字符串相同
NO:
(3) LEA SI,DATA1+2 LODSB MOV AH,AL LODSB
(4) LEA DI,DATA2+5 XCHG AH,AL STOSB MOV AL,AH STOSB
7. 执行下列指令后,AX寄存器中的内容是多少?
TABLE DW 10,20,30,40,50 ENTRY DW 3 ?
MOV BX,OFFSET TABLE ADD BX,ENTRY MOV AX,[BX] 解:分析:
MOV BX,OFFSET TABLE ;BX=0000H ADD BX,ENTRY ;BX=0003H MOV AX,[BX] ;AX=1E00H
由以上分析可知,执行指令后,AX=1E00H。
8. 编写程序段,将STRING1中的最后20个字符移到STRING2中(顺序不变)。
解:程序编写如下: LEA SI,STRING1 LEA DI,STRING2 MOV CX,60 CLD LOAD:LODSB DEC CX CMP CX,20 JNZ LOAD REP MOVSB
9. 假设一个48位数存放在DX:AX:BX中,试编写程序段,将该48位数乘2。
解:编写程序段如下:
第 14 页 共 27 页
CLC
SHL BX,1 SHL AX,1 SHL DX,1
10.试编写程序,比较AX,BX,CX中带符号数的大小,并将最大的数放在AX中。
解:编写程序如下:
CMP AX,BX
JG LL1 XCHG AX,BX
LL1: CMP AX,CX JG LL2 XCHG AX,CX LL2:
11.若接口03F8H的第1位(b1)和(b3)同时为1,表示接口03F8H有准备好的8位数
据,当CPU将数据取走后,b1和b3就不再同时为1了。仅当又有数据准备好时才再同时为1。
试编写程序,从上述接口读入200B的数据,并顺序放在DATA开始的地址中。 解:编写程序如下:
LEA BX,DATA MOV CX,200
LP0: MOV DX,03F8H ;状态端口地址
LP1: IN AL,DX AND AL,0AH CMP AL,0AH JNZ LP1
MOV DX,03F9H ;数据端口地址 IN AL,DX MOV [BX],AL INC BX
LOOP LP0
12.画图说明下列语句分配的存储空间及初始化的数据值。 (1)DATA1 DB ‘BYTE’,12,12H,2 DUP(0,?,3) (2)DATA2 DW 4 DUP(0,1,2),?,-5,256H
解:(1)存储空间分配情况如图(a)所示; (2) 存储空间分配情况如图(b)所示。
第 15 页 共 27 页