X86汇编应用(4)

这篇博客探讨了X86汇编的应用,包括如何实现N的阶乘计算,详细展示了N为5时的执行情况和堆栈状态。此外,还介绍了一个使用堆栈传递参数的综合程序,该程序用于进制转换和乘除法,并给出了运行结果。最后,文章涉及了汇编语言中的串操作,并展示了一部分操作结果。
摘要由CSDN通过智能技术生成

1.N!的实现

STACK	SEGMENT	PARA STACK
		STACK_AREA		DW	100H DUP(?)
		STACK_BTM		EQU	($ - STACK_AREA)
STACK	ENDS

DATA	SEGMENT	PARA
N		DW		5
DATA	ENDS

CODE	SEGMENT	PARA
		ASSUME	DS:DATA,CS:CODE,SS:STACK
MAIN	PROC	FAR
		MOV		AX,DATA
		MOV		DS,AX
		MOV		AX,STACK
		MOV		SS,AX
		MOV		AX,STACK_BTM
		MOV		SP,AX		;初始化
		
		MOV		AX,N
		PUSH	AX
		CALL	CALCULATE	;参数传递使用堆栈
		CALL	PRINT		;参数传递使用AX
  
		
		MOV		AX,4C00H
		INT		21H		
MAIN	ENDP

CALCULATE	PROC			;入口参数在堆栈中,返回值是AX里
		PUSH	BP			;利用BP寻址,先保存BP
		MOV		BP,SP
		PUSH	DX			;下文中要用到的寄存器事先保存
		PUSH	BX
		MOV		BX,[BP+4]	;取得参数N
		CMP		BX,0
		JNZ		LABEL1
		MOV		AX,1		;如果N是0那么返回1
		JMP		LABEL2
		
LABEL1:
		PUSH	BX			;保存参数N
		DEC		BX
		PUSH	BX
		CALL	CALCULATE
		POP		BX
		MUL		BX			;AX *= BX
		

LABEL2:	
		POP		BX
		POP		DX
		POP		BP
		RET		2			;递归计算完成后,入口参数也应该消除,因此SP多+2
		
CALCULATE	ENDP

PRINT	PROC
		PUSH	AX			;保存
		PUSH	BX
		PUSH	CX
		PUSH	DX
		
		MOV 	BX,10
		MOV		CX,0
		
LOOP1:
		XOR		DX,DX
		DIV		BX
		PUSH	DX
		INC		CX
		CMP		AX,0
		JZ		LOOP2
		JMP		LOOP1
		
LOOP2:
		POP		DX
		OR		DL,30H
		MOV		AH,2
		INT		21H
		LOOP 	LOOP2
		
		POP		DX
		POP		CX
		POP		BX
		POP		AX
		
		RET
PRINT	ENDP

CODE	ENDS
		END 	MAIN

N等于五的时候的输出:


在N=3时的堆栈段情况:



2.一个用于进制转换和乘除法的综合程序(用堆栈传递参数)

MY_STACK	SEGMENT PARA STACK
STACK_AREA	DW		100H DUP(?)
STACK_BTM	EQU		$ - STACK_AREA
MY_STACK	ENDS

MY_DATA		SEGMENT
A 			DW		1234H
B 			DW		0011H
MY_ENTER	DB		0DH,0AH,'$'
MY_DATA		ENDS

MY_CODE		SEGMENT
			ASSUME	CS:MY_CODE,DS:MY_DATA,SS:MY_STACK
MAIN		PROC	FAR			
			MOV		AX,MY_STACK
			MOV		SS,AX
			MOV		AX,MY_DATA
			MOV  	DS,AX
			MOV		SP,STACK_BTM
			
			MOV		AX,A
			PUSH	AX
			CALL 	TO_HEX	;测试16进制转换
			
			
			MOV		DX,'H'
			MOV		AH,02H
			INT		21H
			
			LEA		DX,MY_ENTER
			MOV		AH,09H
			INT		21H
			
			MOV		AX,B
			PUSH	AX
			CALL 	TO_DEC	;测试10进制转换
			
			LEA		DX,MY_ENTER
			MOV		AH,09H
			INT		21H
			
			MOV		AX,A
			PUSH	AX
			MOV		AX,B
			PUSH	AX
			CALL	MUL_FUNC;乘法测试
			
			
			LEA		DX,MY_ENTER
			MOV		AH,09H
			INT		21H
			
			MOV		AX,A
			PUSH	AX
			MOV		AX,B
			PUSH	AX
			CALL	DIV_FUNC;除法测试
			
			MOV		AX,4C00H
			INT		21H
			
MAIN		ENDP

TO_HEX		PROC	NEAR	;默认参数是在堆栈中,长度是一个字
			PUSH	AX		;保存要用的寄存器
			PUSH	BX
			PUSH	CX
			PUSH	DX
			PUSH    BP
			
			MOV		BP,SP
			MOV		AX,[BP+12]
			XOR		CX,CX
			MOV		BX,16
LOOP_TO_HEX:		
			MOV		DX,0
			DIV		BX
			CMP		DX,10
			JAE		BRANCH1
			OR		DL,30H
			JMP		BRANCH2

BRANCH1:	ADD		DX,57H

BRANCH2:	PUSH	DX
			INC		CX
			CMP		AX,0
			JZ		PRINT_HEX
			JMP		LOOP_TO_HEX

PRINT_HEX:
			POP		DX
			MOV		AH,02H
			INT		21H
			LOOP	PRINT_HEX
			
			POP 	BP
			POP		DX		;恢复
			POP		CX
			POP		BX
			POP		AX
			
			
			RET		2
TO_HEX		ENDP	

TO_DEC		PROC	NEAR	;默认参数是在堆栈中,长度是一个字
			PUSH	AX		;保存要用的寄存器
			PUSH	BX
			PUSH	C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值