习 题 4 部分答案
4.1 分别指出下列指令中源操作数和目的操作数的寻址方式
(1) MOV EAX,12345678H
(2) MOV [ESI],AX
(3) MOV 2[EDI],BX
(4) MOV 2[BX+SI],DX
(5) MOV AX,[10]
(6) MOV EAX,2[ESI*4]
(7) MOV EAX,2[EBX*8][EDI]
(8) MOV EAX,[ESI][EBP+0FFFF0H]
(9) MOV EAX,2[EDI*8][EBP+80]
解:
指令
目的操作数的寻址方式
源操作数的寻址方式
(1) MOV EAX,12345678H
寄存器寻址
立即寻址
(2) MOV [ESI],AX
寄存器间接寻址
寄存器寻址
(3) MOV 2[EDI],BX
变址寻址
寄存器寻址
(4) MOV 2[BX+SI],DX
基址变址寻址
寄存器寻址
(5) MOV AX,[10]
寄存器寻址
直接寻址
(6) MOV EAX,2[ESI*4]
寄存器寻址
带有比例因子的变址寻址
(7) MOV EAX,2[EBX*8][EDI]
寄存器寻址
带有比例因子的基址变址寻址
(8) MOV EAX,[ESI][EBP+0FFFF0H]
寄存器寻址
带有位移量的基址变址寻址
(9) MOV EAX,2[EDI*8][EBP+80]
寄存器寻址
带有位移量和比例因子的基址变址寻址
4.2 指出下列指令的错误原因
(1) INC [ESI]
(2) MOV AX,BL
(3) MOV 2,EAX
(4) MOV AX,[DX]
(5) MOV AX,[BX+BP]
(6) MOV AX,[SI+DI]
(7) MOV AH,300
(8) MOV [ESI],[EDI]
(9) PUSH AL
(10) POP DH
(11) MOV CS,AX
(12) MOV SS,AX
(13) SHL AX,3
解:
指令
错误原因
(1) INC [ESI]
目的操作数[ESI]类型不明确
(2) MOV AX,BL
源操作数和目的操作数类型不一致
(3) MOV 2,EAX
常数不能作目的操作数
(4) MOV AX,[DX]
DX不能作地址寄存器
(5) MOV AX,[BX+BP]
源操作数寻址方式错,两个寄存器都是基址寄存器
(6) MOV AX,[SI+DI]
源操作数寻址方式错,两个寄存器都是变址寄存器
(7) MOV AH,300
300超出AH允许范围
(8) MOV [ESI],[EDI]
源操作数和目的操作数不能同时为内存单元地址
(9) PUSH AL
入栈的数据必须是一个16或32位数据
(10) POP DH
出栈的数据是一个16或32位数据,DH是8位寄存器
(11) MOV CS,AX
CS值不能由程序员编程该变
(12) MOV SS,AX
SS值不能由程序员编程该变
(13) SHL AX,3
移位次数大于1,应先将移位次数送CL
4.3 比较下列两条指令,指出它们的区别
MOV EAX,[ESI]
MOV [ESI],EAX
解:这两条指令的区别是,指令“MOV EAX,[ESI]”是将内存单元DS:[ESI]中的内容读到CPU中的寄存器EAX;而指令“MOV [ESI],EAX”是将CPU中寄存器EAX中的内容写入内存单元DS:[ESI]。
4.4 比较下列两条指令,指出它们的区别
MOV AX,[SI]
LEA AX,[SI]
解:这两条指令的区别是,指令“MOV AX,[SI]” 是将内存单元DS:[SI]中的内容读到CPU中的寄存器AX;而指令“LEA AX,[SI]”是将内存单元DS:[SI]的偏移地址送到AX。
4.5 假定(EAX)=12345678H,不用计算,写出下面每条指令执行后(EAX)=?
① TEST EAX,1
② XOR EAX,EAX
③ SUB EAX,EAX
④ CMP EAX,87654321H
解,①(EAX)=12345678H ② 0 ③ 0 ④(AX)=12345678H
4.6 假定(AX)=1234H,(BX)=5678H指出下列指令中
① 哪些指令执行后,源操作数和目的操作数都不发生变化?
② 哪些指令执行后,源操作数和目的操作数都发生变化?
③ 哪些指令执行后,源操作数不发生变化而目的操作数发生变化?
指令:
① TEST AX,1234
② AND AX,BX
③ SUB AX,1234H
④ CMP AX,1234H
⑤ XCHG AX,BX
解:
① 指令“TEST AX,1234”和指令“CMP AX,1234H”执行后,源操作数和目的操作数都不发生变化。
变量
值
EA
BUF→
31H
0
32H
1
33H
2
34H
3
BCD→
4
5
6
7
② 指令“XCHG AX,BX”执行后,源操作数和目的操作数都发生变化。
③ 指令“AND AX,BX”和“SUB AX,1234H”执行后,源操作数不发生变化而目的操作数发生变化。
4.74.7 阅读下面的程序,回答问题
1.【程序一】
DATA SEGMENT
BUF DB '1234'
N=$-BUF
BCD DB N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF
MOV CX,N
LEA DI,BCD+N-1
LOOP1:MOV AL,[SI]
SUB AL,30H
MOV [DI],AL
INC SI
DEC DI
DEC CX
JNE LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
【问题一】画出内存分配图。
【问题二】说明程序功能,程序执行后,从BCD开始的N个字节单元中的内容是什么?
【问题三】找出一条指令代替指令“SUB AL,30H”,使程序功能不变。
【问题四】如果将代码段中的指令LEA DI,BCD+N-1改成LEA DI,BCD;DEC DI改成INC DI,其它指令不变,程序执行后,从BCD开始的N个字节单元中的内容是什么?
【问题五】取消数据段的BCD存储区,将处理后的数据放回原处,应如何修改程序?
2.【程序二】
.MODEL SMALL
.386
.STACK
.DATA
STRING DB 'Assemble Language is powerful'
N=$-STRING
NEWSTR DB N DUP(0)
.CODE
,STARTUP
MOV CX,N
LEA SI,STRING
LEA DI,NEWSTR
.REPEAT
MOV AL,[SI]
.IF (AL >= 'a') && (AL <= 'z')
SUB AL,32
.ENDIF
MOV [DI],AL
INC SI
INC DI
,UNTILCXZ
,EXIT
END
【问题】写出程序功能,程序执行后,从NEWSTR开始的N个字节中的内容是什么?
解:
1.【程序一】
【问题一】内存分配图变量
值
EA
BUF→
31H
0
32H
1
33H
2
34H
3
BCD→
4
4
3
5
2
6
1
7
【问题二】
程序功能是将从BUF开始的连续4个字符'1234'转变为4个对应的数值,按逆序存放到以变量BCD为首地址的存储单元中。程序执行后,从BCD开始的N个字节单元中的内容是4 3 2 1。
【问题三】
用指令“AND AL,0FH”代替指令“SUB AL,30H”,程序功能不变。
【问题四】如果将代码段中的指令LEA DI,BCD+N-1改成LEA DI,BCD;DEC DI改成INC DI,其它指令不变,程序执行后,从BCD开始的N个字节单元中的内容是1 2 3 4。
变量
值
EA
BUF→
31H
0
32H
1
33H
2
34H
3
BCD→
1
4
2
5
3
6
4
7
【问题五】取消数据段的BCD存储区,将经处理后的数据放回原处,修改程序如下
DATA SEGMENT
BUF DB '1234'
N=$-BUF
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF
MOV CX,N
LOOP1:MOV AL,[SI]
SUB AL,30H
MOV [SI],AL
INC SI
DEC CX
JNE LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.【程序二】
程序功能是将从STRING开始的N个字节中的字符串变成大写存放到从NEWSTR开始的N个字节中。程序执行后,从NEWSTR开始的N个字节中的内容是"ASSEMBLE LANGUAGE IS POWERFUL"。
4.8 阅读下面的程序,填空。
1.【程序一说明】用减法实现除法。X是被除数,Y是除数,处理结束后商存放在RESULT,余数存放在XYMOD。
【程序一】
被除数
除数
商
7
2
0
5
2
1
3
2
2
余数→
1
2
3
←商
图4-15 用减法实现除法示意图
.MODEL SMALL
.386
.STACK
.DATA
X DW 7
Y DW 2
.DATA?
RESULT DW?
XYMOD DW?
.CODE
,STARTUP
MOV AX,X
MOV BX,Y
MOV CX,0
,WHILE _____①____
SUB AX,BX
_____②_____
,ENDW
MOV RESULT,CX
MOV XYMOD,AX
,EXIT
END
2.【程序二说明】从BUF开始的11个单元中存放着11个整数,找出这11个数中正数并且是偶数的个数存入R中。
【程序二】
DATA SEGMENT
BUF DB –2,5,-3,6,100,0,-20,-9,8,-110,21
N= ①
R DW?
DATA ENDS
CODE SEGMENT

BEGIN:MOV AX,DATA

LEA BX,BUF
MOV CX,N

LOPA: CMP [BX],BYTE PTR 0

TEST [BX],BYTE PTR 1

INC AX
NEXT : INC BX
DEC CX

MOV R,AX
MOV AH,4CH
INT 21H
CODE ENDS
END ⑧
解:
1.【程序一】① AX>=BX ② INC CX
2.【程序二】
① $-BUF
② ASSUME CS:CODE,DS:DATA
③ MOV DS,AX
④ MOV AX,0
⑤ JLE NEXT
⑥ JNZ NEXT
⑦ JNZ LOPA
⑧ BEGIN
3.【程序三】① DX ② SAR CL,1
4.9 编程题(用完整段模式和简化段模式分别实现)
1.【程序说明】
编写一个在某项比赛中计算每一位选手最终得分的程序。计分方法如下:
① 10名评委,在0~10的整数范围内给选手打分。
② 10个得分中,除去一个最高分(如有同样两个以上最高分也只除一个),除去一个最低分(如有同样两个以上最低分也只除一个),剩下的8个得分取平均值为该选手的最终得分。
2.【程序说明】设有一个数组存放学生的成绩(0~100),编程统计0~59、60~69、70~79、80~89、90~100分的人数,并分别存放到SCOREE、SCORED、SCOREC、SCOREB、SCOREA单元中。
解:
1.【程序】(完整段模式)
DATA SEGMENT
SCORE DB 7,8,9,8,10,10,9,8,7,10
N=$-SCORE
AVERAGE DB?
MAX DB?
MIN DB?
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DL,SCORE
MOV MAX,DL
MOV MIN,DL
MOV CX,N-1
MOV BX,1
CYCLE: MOV AL,SCORE[BX]
ADD DL,AL
CMP AL,MAX
JLE CMPMIN
MOV MAX,AL
CMPMIN,CMP AL,MIN
JGE NEXT
MOV MIN,AL
NEXT: INC BX
LOOP CYCLE
SUB DL,MAX
SUB DL,MIN
MOV CL,3
SAR DL,CL
MOV AVERAGE,DL
MOV AH,4CH
INT 21H
CODE ENDS
END START
1.【程序】(简化段模式)
.MODEL SMALL
.386
.STACK
.DATA
SCORE DB 7,8,9,8,10,10,9,8,7,10
N=$-SCORE
.DATA?
AVERAGE DB?
MAX DB?
MIN DB?
.CODE
,STARTUP
MOV DL,SCORE
MOV MAX,DL
MOV MIN,DL
MOV CX,N-1
MOV BX,1
,WHILE CX
MOV AL,SCORE[BX]
ADD DL,AL
.IF AL > MAX
MOV MAX,AL
.ENDIF
.IF AL < MIN
MOV MIN,AL
.ENDIF
INC BX
DEC CX
,ENDW
SUB DL,MAX
SUB DL,MIN
SAR DL,3
MOV AVERAGE,DL
,EXIT
END
2.【程序】(完整段模式)
DATA SEGMENT
SCORE DB 90,23,56,67,98,78,10,45,87,100
N=$-SCORE
SCOREF DB 0
SCOREE DB 0
SCORED DB 0
SCOREC DB 0
SCOREB DB 0
SCOREA DB 0
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,SCORE
MOV CX,N
MOV DL,10
CLASS: MOV AH,0
MOV AL,[SI]
DIV DL
SUB AL,5
JG GREAT
INC BYTE PTR SCOREF
JMP NEXT
GREAT: MOV AH,0
MOV BX,AX
INC BYTE PTR SCOREF[BX]
NEXT: INC SI
LOOP CLASS
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.【程序】(简化段模式)
.MODEL SMALL
.386
.STACK
.DATA
SCORE DB 90,23,56,67,98,78,10,45,87,100
N=$-SCORE
.DATA?
SCOREF DB 0
SCOREE DB 0
SCORED DB 0
SCOREC DB 0
SCOREB DB 0
SCOREA DB 0
.CODE
,STARTUP
LEA SI,SCORE
MOV CX,N
MOV DL,10
.REPEAT
MOV AH,0
MOV AL,[SI]
DIV DL
SUB AL,5
,IF(AL<=0)
INC BYTE PTR SCOREF
,ELSE
MOV AH,0
MOV BX,AX
INC BYTE PTR SCOREF[BX]
,ENDIF
INC SI
.UNTILCXZ
.EXIT
END
END