📄 课堂测试参考答案——请不要删,并请相互转告!2.txt
字号:
课堂测试题一答案
;不要背,要点在自己做——切记!!!
一、指出下列指令的寻址方式:
1. LODSB 寄存器寻址
2. PUSHF 寄存器寻址
3. MOV AX,ES:[DI+2] 源 寄存器相对寻址
4. LDS BX,X1 源 直接寻址
二、判断下列指令的对错:
1. MOV DS,2000h 错,立即数不能送寄存器
2. PUSH DS:[BX+SI+2] 对,因为PUSH的操作数为寄存器和内存
3. JMP WORD PTR [DX] 错,本意是段内间接转移,用内存操作
数为间接寻址,但内存间接寻址时不能使用DX
4. MOV DS:[1000h],100 错,因为不能确定是字节还是字
三、简答题:
1. DATA SEGMENT PARA
X1 DB 2 DUP ('AB',0),'ab'
X2 EQU $-X1
DATA ENDS
MOV AX,WORD PTR X1+3 AX=?
MOV BX,X2 BX=?
应该先画出内存图,段内从0000h开始,
依次是:41H,42H,00H,41H,42H,00H,61H,62H
于是,X2=8; 即BX=8
X1+3处的两个字节依次是41h,42h,所以AX=4241h
(内存中的字,低在前,高在后)
2. 用移位实现X*10, X为双字。
先画好图,然后计算;注意移位、加法的进位CF处理.
X*10=X*2+X*8=(X2*2;X1*2)+(X2*8+X1*8)
MOV AX,WORD PTR X ;X1-L
MOV DX,WORD PTR X+2 ;X2-H
;先求X*2:
SHL AX,1
RCL DX,1 ;DX:AX=X*2
PUSH AX
PUSH DX
;再求X*8:
SHL AX,1
RCL DX,1 ;DX:AX=X*2
SHL AX,1
RCL DX,1 ;DX:AX=X*4
SHL AX,1
RCL DX,1 ;DX:AX=X*8
POP DI ;DI=X2*2
POP SI ;SI=X1*2
ADD AX,SI
ADC DX,DI
MOV WORD PTR X,AX
MOV WORD PTR X+2,DX
3. 从键盘输入s1,s2,按照升序放入内存中.
要点:(1) 三段式设计.
(2) 将问题分解为Getstr(带参数),字符串比较,字符串复制三个块(或子程序).
STACK SEGMENT STACK
DW 100 DUP(?)
STACK ENDS
DATA SEGMENT PARA
S1 DB 128 DUP(?)
S2 DB 128 DUP(?)
S1_S2 DB 300 DUP(?)
LEN1 DW ?
LEN2 DW ?
DATA ENDS
;设计好数据是关键,一定要先设计好。
CODE SEGMENT PARA
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV ES,AX ;对串处理,最好先在主程序中设置好ES
LEA DI,S1
CALL Getstr ;字符串首地址在ES:DI中,以00h结尾。CX=长度
MOV LEN1,CX
LEA DI,S2
CALL Getstr ;字符串首地址在ES:DI中,以00h结尾。CX=长度
MOV LEN2,CX
LEA SI,S1
LEA DI,S2
CALL Strcmp ;比较s1--ds:si,s2--es:di
;返回:AX=0,相等;AX=ffffh(-1),s1<s2;AX=1,s1>s2
CLD
LEA DI,S1_S2 ;初始条件
CMP AX,1
JBE L1 ;s1<=s2
;ELSE l2: s1>s2
L2: LEA SI,S2
MOV CX,LEN2
REP MOVSB
LEA SI,S1
MOV CX,LEN1
REP MOVSB
JMP SHORT L3
L1: LEA SI,S1
MOV CX,LEN1
REP MOVSB
LEA SI,S2
MOV CX,LEN2
REP MOVSB
L3: MOV AX,4200H
INT 21H
MAIN ENDP
Getstr PROC NEAR
;标准的自程序
;IN:ES:DI=addr
;RETURN CX=LEN ASCIIZ STRING;ESC EXIT
CLD
XOR CX,CX
LP1: INC CX
MOV AX,0
INT 16H
STOSB
CMP AL,1BH ;ESC
JNZ LP1
MOV BYTE PTR ES:[DI],00H
RET
;也可以用AH=1/INT 21h来输入,可以自己设置结束条件(如0Dh)
Getstr ENDP
Strcmp PROC NEAR
;标准的子程序
;IN:DS:SI=s1;ES:DI=s2,
;RETURN AX=-1,0,1: s1<,=,>s2
PUSH SI
PUSH DI
CLD
;熊老师书P142,有两种方法
LP2: LODSB
CMP AL,ES:[DI]
JA PL1
JB PL2
CMP AL,0
JZ PL3
INC DI
JMP SHORT LP2
PL1: MOV AX,0FFFFH ;S1<S2
JMP SHORT PL4
PL2: MOV AX,1 ;s2>S2
JMP SHORT PL4
PL1: MOV AX,0 ;S1=S2
JMP SHORT PL4
PL4: POP DI
POP SI
RET
Strcmp ENDP
CODE ENDS
END MAIN ;关键是条理要清晰
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -