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

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

📁 汇编语言 参考书 包含作业与答案 从入门到精通 通俗易懂
💻 TXT
字号:
课堂测试题二答案

一、简答题

1. INT 1Ch的执行过程

   (1) SP=SP-2,SS:[SP]<- PSW
   (2) SP=SP-2,SS:[SP]<- INT 1CH下一条指令的CS
   (3) SP=SP-2,SS:[SP]<- INT 1CH下一条指令的ip
   (4) tf=0,if=0
   (5) cs=0000h:[1ch*4+2],ip=0000h:[1ch*4]	;或者其他的说法
       然后转入该中断处理程序

2. h->l:  
   除法溢出〉断点中断〉INTR(可屏蔽中断)


二、编写子程序或宏,实现:
1. 在屏幕l行,m列显示属性为Attr的字符,重复三次。
DISP_CHAR	PROC	NEAR
		;IN    BL=Attr,DH=l,DL=m,AL=CHAR

		PUSH	BX
		PUSH	AX

		MOV	BH,0
		MOV	AH,2
		INT	10H		;SET CUESOR
		
		POP	AX
		POP	BX
		MOV	CX,3
		MOV	AH,9
		INT	10H
		
		RET
DISP_CHAR	ENDP

或者:
DISP_CHAR	PROC	NEAR
		;IN    BL=Attr,DH=l,DL=m,AL=CHAR

		
		PUSH	ES
		PUSH	AX
		
		MOV	AX,0B800H
		MOV	ES,AX
		
		MOV	AL,DH
		MOV	CL,80*2
		MUL	CL		;AX=160*L

		SHL	DL,1		;m*2
		XOR	DH,DH
		ADD	AX,DX		;AX=L*160+M*2
		
		MOV	DI,AX
		MOV	CX,3
		
		POP	AX
		MOV	AH,BL		;AH=Attr,AL=CHAR
		CLD
		REP	MOVSW
		
		POP	ES
		RET
DISP_CHAR	ENDP

2. Getstring()
	;参见侧试一的子程序

三、编写TSR,定时早8点响铃。

 要点:(1) TSR设计.
      (2) 将问题分解为IR(定时比较、响铃),MAIN.共三个部分

CODE	SEGMENT PARA
        ASSUME  CS:CODE,DS:CODE

INT1C_H	PROC	FAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	PUSH	BP
	PUSH	DS
	PUSH	ES
	STI
	CALL	COMPARE
	JNC	RETURN

	CALL	BEEP
		
RETURN:	CLI
	POP	ES
	POP	DS
	POP	BP
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	IRET
INT1C_H	ENDP

BEEP	PROC	NEAR
	MOV	AH,2
	MOV	DL,07H	;BELL
	INT	21H
	RET
BEEP	ENDP

COMPARE	PROC	NEAR
	;调用INT 1ah/AH=2,获得时间
	;比较hh=08,mm=00,ll=00则CF=1;
	;参见P197(熊老师书)
	
	MOV	AH,2
	INT	1AH		;CH=HH,CL=MM,DH=LL

	CMP	CH,08H
	JNZ	L1
	CMP	CL,00H
	JNZ	L1
	CMP	DH,00H
	JNZ	L1

	STC
	RET

L1:	CLC
	RET
COMPARE ENDP

H_LEN	EQU	$-0

MAIN	PROC	FAR
	MOV	AX,CODE
	MOV	DS,AX
	
	LEA	DX,INT1C_H
	MOV	AX,251CH
	INT	21H

	MOV	AX,3100H
	MOV	DX,(H_LEN+15)/16+10H
	INT	21H
MAIN	ENDP

CODE	ENDS
	END	MAIN
	


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 + -