北航x86汇编程序设计_作业三

1. 编写综合程序,构成子程序表,实现10->16,16->10,2->10进制转换以及乘除法运算。

代码如下:

STACK 		SEGMENT PARA STACK
			DW 100H DUP(?)
STACK		ENDS

DATA		SEGMENT PARA
STR1		DB 'Please input a decimal number(10->16):',0ah,0dh,'$'
STR2		DB 'Please input a binary number(2->10):',0ah,0dh,'$'
STR3		DB 'Please input a hexadecimal number(16->10):',0ah,0dh,'$'
STR4		DB 'Quotient:','$'
STR5		DB 'Remainder:','$'
VALUE		DB 128 DUP(?)
NEW_LINE	DB 0DH,0AH,'$'
DATA		ENDS

CODE 		SEGMENT
			ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN		PROC FAR
			MOV AX,DATA
			MOV DS,AX
			MOV AX,STACK
			MOV SS,AX
			
			MOV DX,OFFSET STR1 ;输入一个十进制数
			MOV AH,9
			INT 21H
			MOV CX,5			
			CALL INPUT_10
			
			MOV  BX, 16        ;16进制,要除16
			MOV  CX, 4         ;求4位16进制数.
			CALL CV10_16
			
			PUSH AX
			
			CALL ENTER_1
			
			MOV DX,OFFSET STR2 ;输入一个二进制数
			MOV AH,9
			INT 21H
			MOV CX,16		
			CALL INPUT_2
			
			CALL ENTER_1
			
			MOV  BX, 10        ;10进制,要除10
			MOV  CX, 5         ;求5位10进制数.
			CALL CV2_10
			
			PUSH AX
			
			CALL ENTER_1
			
			MOV DX,OFFSET STR3 ;输入一个十六进制数
			MOV AH,9
			INT 21H
			MOV CX,4		
			CALL INPUT_16
			
			CALL ENTER_1
			
			MOV  BX, 10        ;10进制,要除10
			MOV  CX, 5         ;求5位10进制数.
			CALL CV2_10
			
			CALL ENTER_1
			
			POP BX
			POP AX
			CALL DIV1_2
			
			CALL ENTER_1
			
			CALL MULT
			
			MOV AH,4CH
			INT 21H
			
MAIN		ENDP

;输出回车
ENTER_1		PROC
			PUSH AX
			PUSH DX
			
			MOV DX,OFFSET NEW_LINE ;显示回车
			MOV AH,9
			INT 21H
			
			POP DX
			POP AX
			RET
ENTER_1		ENDP


INPUT_10	PROC
			PUSH SI
			PUSH DX
			PUSH BX
			
			MOV SI,0
			MOV BX,10
			
LP1:		MOV AH,1
			INT 21H
			CMP AL,0DH
			JE RETURN
			CMP AL,30H
			JB LP1
			CMP AL,39H
			JA LP1
			SUB AL,30H
			XOR AH,AH
			PUSH AX
			MOV AX,SI
			MUL BX
			MOV SI,AX
			POP AX
			ADD SI,AX
			LOOP LP1
			
RETURN:		MOV AX,SI
			POP BX
			POP DX
			POP SI
			RET
INPUT_10	ENDP

CV10_16		PROC
			PUSH AX
			PUSH BX
			PUSH DX		
			
LP1_1:		CWD
			DIV  BX
			PUSH DX            ;保存余数到堆栈.
			LOOP LP1_1
			MOV BX,0
			MOV  CX, 4         ;显示4位.
			
LP1_2:		POP  DX
			CMP DL,0
			JNZ	DISP
			CMP BX,0
			JZ DISP1
					
DISP:		MOV BX,1
			CMP  DL, 10
			JB   LP1_3
			ADD  DL, 7
			
LP1_3:		ADD  DL, 48
			MOV  AH, 2
			INT  21H           ;输出.
DISP1:		LOOP LP1_2
			
			MOV  DL, 'H'	   ;输出h
			MOV  AH, 2
			INT  21H
					
			POP DX
			POP BX
			POP AX
			RET		
CV10_16		ENDP

INPUT_2		PROC
			PUSH SI
			PUSH DX
			PUSH BX
			
			MOV SI,0
			MOV BX,2
			
LP2:		MOV AH,1
			INT 21H
			CMP AL,'b'
			JE RETURN1
			CMP AL,'B'
			JE RETURN1
			CMP AL,30H
			JB LP2
			CMP AL,31H
			JA LP2
			SUB AL,30H
			XOR AH,AH
			PUSH AX
			MOV AX,SI
			MUL BX
			MOV SI,AX
			POP AX
			ADD SI,AX
			LOOP LP2
			
RETURN1:	MOV AX,SI
			POP BX
			POP DX
			POP SI
			RET
INPUT_2		ENDP

CV2_10		PROC
			PUSH AX
			PUSH BX
			PUSH DX		
			
LP2_1:		CWD
			DIV  BX
			PUSH DX            ;保存余数到堆栈.
			LOOP LP2_1
			MOV  CX,5         ;显5位.
			MOV BX,0
			
LP2_2:		POP  DX
			CMP DL,0
			JNZ DLP2_1
			CMP BX,0
			JZ DLP2_2
			
DLP2_1:		MOV BX,1
			ADD  DL,30H
			MOV  AH,2
			INT  21H           ;输出.
			
DLP2_2:		LOOP LP2_2
					
			POP DX
			POP BX
			POP AX
			RET		
CV2_10		ENDP

INPUT_16	PROC
			PUSH SI
			PUSH DX
			PUSH BX
			
			MOV SI,0
			MOV BX,16
			
LP3:		MOV AH,1
			INT 21H
			CMP AL,'h'
			JE RETURN2
			CMP AL,'H'
			JE RETURN2
			CMP AL,30H
			JB LP3
			CMP AL,39H
			JBE LP31
			
			CMP AL,'A'
			JB LP3
			CMP AL,'F'
			JBE LP32
			
			CMP AL,'a'
			JB LP3
			CMP AL,'f'
			JA LP3
			SUB AL,32
			
LP32:		SUB AL,7
			
LP31:		SUB AL,30H
			XOR AH,AH
			PUSH AX
			MOV AX,SI
			MUL BX
			MOV SI,AX
			POP AX
			ADD SI,AX
			LOOP LP3
			
RETURN2:	MOV AX,SI
			POP BX
			POP DX
			POP SI
			RET
INPUT_16	ENDP

DIV1_2		PROC
			PUSH AX
			PUSH BX
			CWD
			DIV BX
			
			PUSH AX
			
			PUSH DX
			LEA DX,STR5
			MOV AH,9
			INT 21H
			POP DX
			
			MOV AX,DX
			MOV BX, 10        ;10进制,要除10
			MOV CX, 5         ;求5位10进制数.
			CALL CV2_10
			
			CALL ENTER_1
			
			LEA DX,STR4
			MOV AH,9
			INT 21H
			
			POP AX
			MOV BX, 10        ;10进制,要除10
			MOV CX, 5         ;求5位10进制数.
			CALL CV2_10	
			
			POP BX
			POP AX
			RET			
DIV1_2		ENDP

MULT		PROC
			PUSH AX
			PUSH BX
			MUL BX
			
			PUSH AX
			
			MOV AX,DX
			MOV BX, 10        ;10进制,要除10
			MOV CX, 5         ;求5位10进制数.
			CALL CV2_10
			
			POP AX
			MOV BX, 10        ;10进制,要除10
			MOV CX, 5         ;求5位10进制数.
			CALL CV2_10	
			
			POP BX
			POP AX
			RET	
MULT		ENDP

CODE		ENDS
			END MAIN
			

程序运行结果如下图:


1. 编写综合程序,构成子程序表,实现字符串的大小写转换、增、删、查、替换、复制、比较以及输入与输出。

代码如下:

STACK 		SEGMENT PARA STACK
			DW 100 DUP(?)
STACK		ENDS

DATA 		SEGMENT PARA
LEN        EQU 121
SEN1 		DB LEN-1
			DB ?
			DB LEN DUP(?)
SEN2 		DB LEN-1
			DB ?
			DB LEN DUP(?)
SEN3 		DB LEN-1
			DB ?
			DB LEN DUP(?)
SEN4 		DB LEN-1
			DB ?
			DB LEN DUP(?)
STR1 		DB 'Please input string one:',0aH,0dh,'$'
STR2 		DB 'Please input string two:',0aH,0dh,'$'
BIG        	DB 'STR1>STR2',0aH,0dh,'$'
SMA			DB 'STR1<STR2',0aH,0dh,'$'
EQUE		DB 'STR1=STR2',0aH,0dh,'$'
lab1 		DB 'Enter a keyword:',0aH,0dh,'$'
REPL		DB 'Enter a replacement word:',0aH,0dh,'$'
FOUND		DB 'Found!',0aH,0dh,'$'
NFOUND		DB 'No found!',0aH,0dh,'$'
STR3        DB 128 DUP(?)
NEW_LINE	DB 0DH,0AH,'$'
DATA 		ENDS

CODE		SEGMENT
			ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA
MAIN		PROC FAR
			MOV AX,DATA
			MOV DS,AX
			MOV ES,AX
			MOV AX,STACK
			MOV SS,AX
			
			LEA DX,STR1 
			MOV AH,09H 
			INT 21H
			
			LEA DX,SEN1 
			MOV AH,0AH 
			INT 21H
			
			CALL ENTER_1
			
			MOV CL,SEN1+1
			XOR CH,CH
			MOV SI,OFFSET SEN1+2
			PUSH CX
			PUSH SI
			ADD SI,CX
			MOV BYTE PTR[SI],'$'
			
			POP SI
			POP CX
			MOV DI,OFFSET STR3
			CALL STRCPY
			
INDEX:		LEA DX,lab1 
			MOV AH,09H 
			INT 21H
			
			LEA DX,SEN3
			MOV AH,0AH 
			INT 21H
			
			CALL ENTER_1
			
			MOV DI,OFFSET SEN1+2
			CALL STRIND
			
			CMP AX,1
			JZ  DELETE
			JNZ INDEX
			
DELETE:		CALL STRDEL ;调用字符串插入和删除即可实现字符串替换

			LEA DX,REPL
			MOV AH,09H 
			INT 21H
			
			LEA DX,SEN4 
			MOV AH,0AH 
			INT 21H
			
			CALL ENTER_1
			
			CALL STR_INSERT
			
			LEA DX,STR2 
			MOV AH,09H 
			INT 21H
			
			LEA DX,SEN2
			MOV AH,0AH 
			INT 21H
			
			CALL ENTER_1
			
			MOV CL,SEN2+1
			XOR CH,CH
			MOV SI,OFFSET SEN2+2 
			CALL STRCV
			
			MOV SI,OFFSET SEN1+2
			MOV DI,OFFSET SEN2+2
				
			CALL STRCMP
			
			MOV AH,4CH
			INT 21H
			
MAIN		ENDP

;输出回车
ENTER_1		PROC
			PUSH AX
			PUSH DX
			
			MOV DX,OFFSET NEW_LINE ;显示回车
			MOV AH,9
			INT 21H
			
			POP DX
			POP AX
			RET
ENTER_1		ENDP

;字符串查找
STRIND		PROC		;入口参数DI
			PUSH SI

LP3:		MOV CL,SEN1+1
			XOR CH,CH
			MOV SI,OFFSET SEN3+2
			MOV AX,[SI]
			CLD
			REPNZ SCASB
			JNZ LAB2	
			
			LEA DX,FOUND
			MOV AH,9
			INT 21H
			MOV AX,1
			JMP EXIT
			
LAB2:		LEA DX,NFOUND
			MOV AH,9
			INT 21H
			MOV AX,0

EXIT:		POP SI
			RET

STRIND		ENDP

;字符串删除
STRDEL		PROC		;入口参数DI
			PUSH AX
			PUSH CX
			PUSH SI
			PUSH DI
			
			DEC DI
			MOV CL,SEN3+1
			XOR CH,CH
			PUSH CX
			ADD CX,DI
			MOV SI,CX
			POP CX
			CLD
			REP MOVSB
			
			MOV DX,OFFSET SEN1+2
			MOV AH,9
			INT 21H
			
			CALL ENTER_1
					
			POP DI
			POP SI
			POP CX
			POP AX
			RET
STRDEL		ENDP

;字符串插入
STR_INSERT	PROC		;入口参数DI
			PUSH AX
			PUSH CX
			PUSH SI
			PUSH DI
			
			DEC DI
			PUSH DI
			MOV SI,DI
			MOV CL,SEN4+1
			XOR CH,CH
			PUSH CX
			ADD CX,DI
			MOV DI,CX
			POP CX
			CLD
			REP MOVSB
			POP DI
			MOV SI,OFFSET SEN4+2
			MOV CL,SEN4+1
			XOR CH,CH
			CLD
			REP MOVSB
			
			MOV DX,OFFSET SEN1+2
			MOV AH,9
			INT 21H
			
			CALL ENTER_1
			
			POP DI
			POP SI
			POP CX
			POP AX
			RET
STR_INSERT	ENDP

;字符串比较			
STRCMP		PROC			;入口参数SI(串1),DI(串2)
			PUSH CX
			CLD
			PUSH SI
			MOV CX,1

LP1:		LODSB
			CMP AL,'$'
			JE LP1_1
			INC CX
			JMP SHORT LP1
			
LP1_1:		POP SI
			REPE CMPSB
			JA L1
			JB L2
			
			LEA DX,EQUE
			MOV AH,9
			INT 21H
			
			JMP SHORT RETURN
			
L1:			LEA DX,BIG
			MOV AH,9
			INT 21H
			
			JMP SHORT RETURN
			
L2:			LEA DX,SMA
			MOV AH,9
			INT 21H

RETURN:		POP CX
			RET
STRCMP		ENDP

;字符串复制
STRCPY  	PROC			;入口参数SI(源),DI(目的),cx
			CLD
			REP MOVSB
			
			MOV BYTE PTR[DI],'$' 
			
			MOV DX,OFFSET STR3
			MOV AH,9
			INT 21H
			
			CALL ENTER_1
			RET
STRCPY		ENDP

;大小写转换
STRCV		PROC			;入口参数SI,cx
			PUSH AX	
			
LP2:		MOV AL,[SI]
			CMP AL,'a'
			JB LP2_1
			CMP AL,'z'
			JA LP2_1
			SUB AL,20H
			MOV [SI],AL
			JMP LP2_2
			
LP2_1:		CMP AL,'A'
			JB LP2_2
			CMP AL,'Z'
			JA LP2_2
			ADD AL,20H
			MOV [SI],AL
			
LP2_2:		INC SI
			LOOP LP2
			MOV BYTE PTR[SI],'$'
			
			MOV DX,OFFSET SEN2+2
			MOV AH,9
			INT 21H
			
			CALL ENTER_1
			
			POP AX
			RET
STRCV       ENDP

CODE		ENDS
			END MAIN

程序运行结果截图如下:

猜你喜欢

转载自blog.csdn.net/qq_36867683/article/details/80424672