4.1 请分别用DB 、DW 、DD 伪指令写出在DA TA 开始的连续8个单元中依次存放数据11H 、22H 、33H 、44H 、55H 、66H 、77H 、88H 的数据定义语句。 DA TA
解:DB 、DW 、DD 伪指令分别表示定义的数据为字节型、字类型及双字类型。其定义形式为:
DA TA DB 11H, 22H, 33H, 44H, 55H, 66H, 77H, 88H DA TA DW 2211H, 4433H, 6655H, 8877H
DA TA DD 44332211H, 88776655H
4.2 若程序的数据段定义如下,写出各指令语句独立执行后的结果。 DSEG SEGMENT DA TA1 DB 10H, 20H, 30H DA TA2 DW 10 DUP (?) String DB ‘123’ DSEG ENDS
(1) MOV AL, DATA1 (2) MOV BX, offset DATA2
(3) LEA SI, String
ADD DI,SI 解:先取变量String 的偏移地址送寄存器SI, 之后将SI 的内容与DI 的内容相加并将结果送DI 。指令执行后,SI=0017H, DI=DI+0017H
4.3 试编写求两个无符号数双字长数之和的程序。两数分别在MEM1和MEM2单元中,其和放在SUM 单元。
DSEG SEGMENT
MEM1 DW 1122H, 3344H MEM1 DW 5566H, 7788H SUM DW 2 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG START: MOV AX, DSEG
MOV DS,AX
LEA BX, MEM1 LEA SI, MEM2
LEA DI, SUM MOV CL,2
CLC
AGAIN: MOV AX,[BX] ADC AX, [SI] MOV [DI], AX
ADD BX, 2
ADD SI, 2 ADD DI, 2 LOOP AGAIN MOV AX, 4C00h
INT 21h
CSEG ENDS
END START
4.4 试编写程序,测试AL 寄存器的第4位(B4)是否为零? 如:TEST AL, 10H
JZ NEXT ….
NEXT :….. 或者: MOV CL,4 SHL AL, CL JNC NEXT ……
NEXT :…..
4.5 试编写程序,将BUFFER 中的一个8位二进制数转化为ASCII 码,并按位数高低顺序存放ANSWER 开始的内存单元中。 解:
DSEG SEGMENT BUFFER DB ? ANSWER DB 3 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG START: MOV AX, DSEG MOV DS, AX MOV CX, 3
LEA DL, ANSWER
XOR AX,AX MOV AL, BUFFER MOV BL,0AH
AGAIN: DIV BL
ADD AH,30H MOV [DI],AH INC DI AND AL,AL JZ STO MOV AH, 0 LOOP AGAIN STO: MOV AX, 4C00H INT 21H CSEG ENDS
END START
4.6 假设数据项定义如下:
DA TA1 DB ‘HELLO!GOOD MORNING’ DA TA2 DB 20 DUP(?)
用串操作指令编写程序段,使其分别完成一下功能。 (1) 从左到右将DA TA1中的字符串传送到DA TA2中; (2) 传送完后,比较DA TA1和DA TA2中的内容是否相同; (3) 把DA TA1中的第3个字节和第四个字节装入AX; (4) 将AX 的内容存入DA TA2+5开始的字节单元中; 解:(1)
MOV AX, SEG DATA1 MOV DS, AX
MOV AX, SEG DATA2 MOV ES, AX LEA SI, DATA1 LEA DI, DATA2 MOV CX,20 CLD
REP MOVSB (2) EA SI, DATA1 LEA DI, DATA2 MOV CX,20 CLD
REPE CMPSB
(3)LEA SI, DATA1 ADD SI,2 LODSW
(4) LEA DI, DATA2
ADD DI, 5 MOV CX, 7 CLD
REP STOSW
4.7 执行下列指令后,AX
TABLE DW 10,20,30,40,50 ENTRY DW 3
……
MOV BX, Offset TABLE ADD BX, ENTRY MOV AX,[BX] 解:AX=1E00H.
4.8 画图说明下列语句分配的存储器空间及初始化的数据值。 (1)DA TA1 DB ‘BYTE ’,12,12H,2 DUP(0,?,3) (2) DATA2 DW 4 DUP(0,1,2), ?, -5,256H DA TA1 ‘B ’
‘Y ’
‘T ’
‘E ’
高 地 址 方 向
高地址方向 DA TA2
DUP(0,1,2)
高地址方向
DUP(0,1,2)
DUP(0,1,2)
DUP(0,1,2)
4.9 图示以下数据段在存储器中的存放形式; DA TA SEGMENT DA TA1 DB 10H, 34H, 07H, 09H DA TA2 DW 2 DUP(42H) DA TA3 DB ‘HELLO! ’ DA TA4 EQU 12 DA TA5 DD ABCDH DA TA ENDS
H E L L O !
4.10 阅读下边的程序段,试说明它实现的功能是什么? DA TA SEGMENT DA TA1 DB 'ABCDEFG' DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA AAAA: MOV AX,DATA MOV DS,AX
MOV BX, OFFSET DATA1 MOV CX,7 NEXT: MOV AH,2 MOV AL, [BX] XCHG AL,DL
INC BX INT 21H LOOP NEXT
MOV AH,4CH
INT 21H CODE ENDS END AAAA
4.1 请分别用DB 、DW 、DD 伪指令写出在DA TA 开始的连续8个单元中依次存放数据11H 、22H 、33H 、44H 、55H 、66H 、77H 、88H 的数据定义语句。 DA TA
解:DB 、DW 、DD 伪指令分别表示定义的数据为字节型、字类型及双字类型。其定义形式为:
DA TA DB 11H, 22H, 33H, 44H, 55H, 66H, 77H, 88H DA TA DW 2211H, 4433H, 6655H, 8877H
DA TA DD 44332211H, 88776655H
4.2 若程序的数据段定义如下,写出各指令语句独立执行后的结果。 DSEG SEGMENT DA TA1 DB 10H, 20H, 30H DA TA2 DW 10 DUP (?) String DB ‘123’ DSEG ENDS
(1) MOV AL, DATA1 (2) MOV BX, offset DATA2
(3) LEA SI, String
ADD DI,SI 解:先取变量String 的偏移地址送寄存器SI, 之后将SI 的内容与DI 的内容相加并将结果送DI 。指令执行后,SI=0017H, DI=DI+0017H
4.3 试编写求两个无符号数双字长数之和的程序。两数分别在MEM1和MEM2单元中,其和放在SUM 单元。
DSEG SEGMENT
MEM1 DW 1122H, 3344H MEM1 DW 5566H, 7788H SUM DW 2 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG START: MOV AX, DSEG
MOV DS,AX
LEA BX, MEM1 LEA SI, MEM2
LEA DI, SUM MOV CL,2
CLC
AGAIN: MOV AX,[BX] ADC AX, [SI] MOV [DI], AX
ADD BX, 2
ADD SI, 2 ADD DI, 2 LOOP AGAIN MOV AX, 4C00h
INT 21h
CSEG ENDS
END START
4.4 试编写程序,测试AL 寄存器的第4位(B4)是否为零? 如:TEST AL, 10H
JZ NEXT ….
NEXT :….. 或者: MOV CL,4 SHL AL, CL JNC NEXT ……
NEXT :…..
4.5 试编写程序,将BUFFER 中的一个8位二进制数转化为ASCII 码,并按位数高低顺序存放ANSWER 开始的内存单元中。 解:
DSEG SEGMENT BUFFER DB ? ANSWER DB 3 DUP(?) DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG START: MOV AX, DSEG MOV DS, AX MOV CX, 3
LEA DL, ANSWER
XOR AX,AX MOV AL, BUFFER MOV BL,0AH
AGAIN: DIV BL
ADD AH,30H MOV [DI],AH INC DI AND AL,AL JZ STO MOV AH, 0 LOOP AGAIN STO: MOV AX, 4C00H INT 21H CSEG ENDS
END START
4.6 假设数据项定义如下:
DA TA1 DB ‘HELLO!GOOD MORNING’ DA TA2 DB 20 DUP(?)
用串操作指令编写程序段,使其分别完成一下功能。 (1) 从左到右将DA TA1中的字符串传送到DA TA2中; (2) 传送完后,比较DA TA1和DA TA2中的内容是否相同; (3) 把DA TA1中的第3个字节和第四个字节装入AX; (4) 将AX 的内容存入DA TA2+5开始的字节单元中; 解:(1)
MOV AX, SEG DATA1 MOV DS, AX
MOV AX, SEG DATA2 MOV ES, AX LEA SI, DATA1 LEA DI, DATA2 MOV CX,20 CLD
REP MOVSB (2) EA SI, DATA1 LEA DI, DATA2 MOV CX,20 CLD
REPE CMPSB
(3)LEA SI, DATA1 ADD SI,2 LODSW
(4) LEA DI, DATA2
ADD DI, 5 MOV CX, 7 CLD
REP STOSW
4.7 执行下列指令后,AX
TABLE DW 10,20,30,40,50 ENTRY DW 3
……
MOV BX, Offset TABLE ADD BX, ENTRY MOV AX,[BX] 解:AX=1E00H.
4.8 画图说明下列语句分配的存储器空间及初始化的数据值。 (1)DA TA1 DB ‘BYTE ’,12,12H,2 DUP(0,?,3) (2) DATA2 DW 4 DUP(0,1,2), ?, -5,256H DA TA1 ‘B ’
‘Y ’
‘T ’
‘E ’
高 地 址 方 向
高地址方向 DA TA2
DUP(0,1,2)
高地址方向
DUP(0,1,2)
DUP(0,1,2)
DUP(0,1,2)
4.9 图示以下数据段在存储器中的存放形式; DA TA SEGMENT DA TA1 DB 10H, 34H, 07H, 09H DA TA2 DW 2 DUP(42H) DA TA3 DB ‘HELLO! ’ DA TA4 EQU 12 DA TA5 DD ABCDH DA TA ENDS
H E L L O !
4.10 阅读下边的程序段,试说明它实现的功能是什么? DA TA SEGMENT DA TA1 DB 'ABCDEFG' DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA AAAA: MOV AX,DATA MOV DS,AX
MOV BX, OFFSET DATA1 MOV CX,7 NEXT: MOV AH,2 MOV AL, [BX] XCHG AL,DL
INC BX INT 21H LOOP NEXT
MOV AH,4CH
INT 21H CODE ENDS END AAAA