汇编易错知识点

寄存器

  • BP寄存器间接寻址时默认使用SS段

操作指令

  • SAR算术右移
每次移动一位,相当于/2是对于补码而言的!!!!!!!!!!!!!!

大题

  • 第一道大题

这题写的时候输入错了,or指令用错了,还是不够熟练

;1.已知变量X的值为2767,请编程序统计变量X中的二进制值中有多少个1,并记入ONE变量中。
S1	SEGMENT STACK
	DW	40	DUP(0)
TOP 	LABEL	WORD
S1	ENDS

DATA	SEGMENT 
X	DW	2767
ONE	DW	?
CRLF	DB	0DH,0AH,24H
DATA	ENDS

CODE	SEGMENT 
	ASSUME CS:CODE, SS:S1, DS:DATA
MAIN	PROC	FAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,DATA
	MOV	DS,AX
	
	XOR	DX,DX;ONE
	MOV	BX,X
	MOV	CX,16
FOR1:	MOV	AX,1
	AND	AX,BX
	JZ	NXT
	INC	DX
NXT:	SAR	BX,1
	LOOP	FOR1
	
	
	MOV	ONE,DX
	
	MOV	BX,ONE
	CALL	PRINT
	
	LEA	DX,CRLF
	MOV	AX,0900H
	INT	21H
	
	MOV	AH,4CH
	INT	21H
MAIN endp
PRINT	PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	BP
	
	XOR	BP,BP
	XOR	DX,DX
	MOV	CX,10
DIVV:	MOV	AX,BX
	DIV	CX
	ADD	DX,30H
	PUSH	DX
	XOR	DX,DX
	MOV	BX,AX
	INC	BP
	OR	AX,AX
	JNZ	DIVV
	
	MOV	CX,BP
OU:	POP	DX
	MOV	AX,0200H;
	INT	21H
	
	POP	BP
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	
	ret

PRINT endp
CODE	ENDS
	END 	MAIN
  • 第二道大题

逻辑判断,很容易出错。。。。

;2.从键盘上输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。
S1	SEGMENT	STACK
DW	40	DUP(0)
TOP	LABEL	WORD
S1	ENDS

DATA	SEGMENT
ANS	DW	?
CRLF	DB	0DH,0AH,24H
DATA	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE, DS:DATA, SS:S1
MAIN	PROC	FAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,DATA
	MOV	DS,AX
	
	XOR	BP,BP
L1:	MOV	AH,1
	INT	21H
	CMP	AL,24H
	JE	EXIT
	CMP	AL,30H
	JB	NXT1
	CMP	AL,39H
	JA	NXT1
	JMP	NXT2
NXT1:	INC	BP
NXT2:	JMP	L1
	
EXIT:	MOV	BX,BP
	MOV	ANS,BX
	LEA	DX,CRLF
	MOV	AX,0900H
	INT	21H
	CALL 	PRINT
	
	MOV	AH,4CH
	INT	21H
MAIN endp

PRINT	PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	BP
	
	XOR	BP,BP
	XOR	DX,DX
	MOV	CX,10
DIVV:	MOV	AX,BX
	DIV	CX
	ADD	DX,30H
	PUSH	DX
	XOR	DX,DX
	INC	BP
	MOV	BX,AX
	OR	AX,AX
	JNZ	DIVV
	
	MOV	CX,BP
OU:	POP	DX
	MOV	AX,0200H
	INT	21H
	
	POP	BP
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	ret

PRINT endp

CODE	ENDS
	END	MAIN

  • 第三道大题

编写时要使用ES

串指令切记:要加位数!!!!!!!!!

还要记得开es

;试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不相同则显示"NO MATCH"。
S1	SEGMENT	STACK
DW	40	DUP(0)
TOP	LABEL	WORD
S1	ENDS

DATA	SEGMENT
STRING1 DB	3,'ABC'
STRING2 DB	3,'ADC'
MA	DB	'MATCH ',0DH,0AH,24H
NOMA	DB	'NO MATCH', 0DH,0AH,24H
DATA	ENDS

CODE	SEGMENT	
	ASSUME CS:CODE, DS:DATA, SS:S1, ES:DATA
MAIN	PROC	FAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,DATA
	MOV	DS,AX
	MOV	ES,AX
	
	LEA	SI,STRING1
	MOV	AL,[SI]
	INC	SI
	LEA	DI,STRING2
	MOV	DL,[DI]
	INC	DI
	CMP	AL,DL
	JNE	NO

	CLD
	XOR	CX,CX
	MOV	CL,AL
	REPE	CMPSB
	OR	CX,CX
	JNZ	NO
YES:	LEA	DX,MA
	MOV	AX,0900H
	INT 	21H
	JMP	EXIT
NO:	LEA	DX,NOMA
	MOV	AX,0900H
	INT	21H
EXIT:	MOV	AH,4CH
	INT	21H
MAIN endp	
CODE	ENDS
	END	MAIN
  • 第四道大题
;4.编写一子程序SKIPLINES,完成输出空行的功能。空行的行数在参数AX寄存器中。
S1	SEGMENT	STACK
DW	40	DUP(0)
TOP	LABEL	WORD
S1	ENDS

DATA	SEGMENT
CRLF	DB	0DH,0AH,24H
DATA	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE, DS:DATA, SS:S1
MAIN	PROC	NEAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,DATA
	MOV	DS,AX
	
	MOV	AX,10
	CALL	PRINT
	;MOV	AX,0900H
	;LEA	DX,CRLF
	;INT	21H
	
	MOV	AH,2
	MOV	DL,'A'
	INT	21H
	
	MOV	AH,4CH
	INT	21H
MAIN endp
PRINT	PROC	NEAR
	PUSH	CX
	PUSH	DX
	
	MOV	CX,AX
OU:	MOV	AX,0200H
	MOV	DL,' '
	INT 	21H
	LOOP	OU
	
	POP	DX
	POP	CX
	RET
PRINT endp
CODE	ENDS
	END	MAIN
  • 第五道大题

    还是注意逻辑关系,

    AL寄存器是8位,00H

    AX寄存器是16位,0000H

;5. Link指向一个字线性表,其中的首单元保存线性表的长度,编一个程序,将该线性表中内容为0FFFFH的项删除。
S1	SEGMENT	STACK
DW	40	DUP(0)
TOP	LABEL	WORD
S1	ENDS

DATA	SEGMENT
LINK	DW	4,0FFFFH,2,3,1
DATA	ENDS

CODE	SEGMENT	
	ASSUME	DS:DATA,ES:DATA,SS:S1,CS:CODE
MAIN	PROC	NEAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,DATA
	MOV	DS,AX
	MOV	ES,AX
	
	CALL	DEL
	MOV	AH,4CH
	INT	21H
MAIN endp

DEL	PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	
	MOV	BX,0FFFFH
	LEA	SI,LINK
	MOV	CX,[LINK]
	ADD	SI,2
	MOV	DI,SI
	XOR	DX,DX
LOP1:	CMP	[SI],BX
	JE	NXT
	MOV	AX,[SI]
	MOV	[DI],AX
	ADD	DI,2
	INC	DX
NXT:	ADD	SI,2
	LOOP	LOP1
	
	MOV	CX,[LINK]
	SUB	CX,DX
	MOV	[LINK],DX
LOP2:	MOV	WORD PTR[DI],0
	ADD	DI,2
	LOOP	LOP2
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
DEL endp
CODE	ENDS
	END	MAIN
  • TEST2-4

这道题写的时候还是细节不到位。

;4.编写一段子程序BINIHEX,完成十六进制数输出的功能。要输出的数在AX寄存器中。
S1	SEGMENT	STACK
DW	40	DUP(0)
TOP	LABEL	WORD
S1	ENDS

CODE	SEGMENT
	ASSUME	CS:CODE, SS:S1
MAIN	PROC	FAR
	MOV	AX,S1
	MOV	SS,AX
	LEA	SP,TOP
	MOV	AX,76
	CALL	PRINT
	
	MOV	AH,4CH
	INT	21H
MAIN endp
PRINT	PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	BP
	
	MOV	CX,16
	XOR	BP,BP
	XOR	DX,DX
DIVV:	DIV	CX
	CMP	DX,10
	JB	NXT1
	ADD	DX,7
NXT1:	ADD	DX,30H	
	PUSH	DX
	INC	BP
	XOR	DX,DX
	OR	AX,AX
	JNZ	DIVV
	
	MOV	CX,BP
OU:	POP	DX
	MOV	AX,0200H
	INT	21H
	LOOP	OU
	POP	BP
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
PRINT	ENDP
CODE	ENDS
	END	MAIN
  • 财爷试卷的大题2(大题1类似,所以就不再赘述)
;财爷试卷的大题2(大题1类似,所以就不再赘述)
;在首地址位DATA的数据中存放了10个无符号数,编程实现将数组中最大的偶数存入字变量中
STK	SEGMENT STACK
DW	40	DUP(0)
TOP	LABEL	WORD
STK	ENDS

S2	SEGMENT
MAX	DB	?
DATA	DB	2,3,4,5,6,10,9,20,3,3
S2	ENDS

CODE	SEGMENT	
	ASSUME	CS:CODE, DS:S2,SS:STK
MAIN	PROC	FAR
	MOV	AX,STK
	MOV	SS,AX
	MOV	AX,S2
	MOV	DS,AX
	
	CALL	CAL
	
	MOV	AH,4CH
	INT	21H
MAIN endp
CAL	PROC	NEAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	SI
	
	XOR	CX,CX
	LEA	SI,DATA
	MOV	MAX,CL
	MOV	CX,10
FOR1:	MOV	AL,[SI]
	MOV	BL,01H
	AND	BL,AL
	JNZ	NXT
	CMP	AL,MAX
	JBE	NXT
	XCHG	AL,MAX
NXT:	INC	SI
	LOOP	FOR1
	POP	SI
	POP	CX
	POP	BX
	POP	AX
	ret

CAL endp
CODE	ENDS
	END 	MAIN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值