⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 课堂测试参考答案——请不要删,并请相互转告!2.txt

📁 汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂
💻 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 + -