8086处理器下的16位汇编语言子程序和宏

1、编写子程序,传递一个字节无符号数组,返回最大值。要求用堆栈传递入口参数,返回值在al。

.MODEL SMALL,C
.STACK 100H
.DATA
buf	db 11h,33h,88h,55h,66h,44h,99h,22h,77h,01h
buf_l equ lengthof buf
buf_t equ type buf
m	db ?
.CODE
main proc 
.STARTUP
	mov bx,offset buf
	push bx
	mov bx,buf_l
	push bx
	call max
	mov m,al
	PUTHEX m
.EXIT
main endp

max proc near
P1 EQU WORD PTR [BP+6]
P2 EQU WORD PTR [BP+4];从4开始,是因为系统在使用call指令的时候会直接将返回点的地址压入参数之上的栈位,栈高度越高,位越低,所以是+2
	push bp
	mov bp,sp
	push bx
;上面三行代码是固定的模板
	push si 
;将我们需要用到的寄存器压入栈中,起到保护的作用
	
	mov si,p1
	mov bx,0
	mov al,[bx][si]
	inc bx
	.while bx<P2
		.if al<[bx][si]
			mov al,[bx][si]
		.endif
		inc bx
	.endw
	
	pop bx
	pop bp
	pop si
	ret 4;这里是4,是因为主程序压入了两个参数进来(两次bx),总共4字节,所以要返回4字节
max endp
END

2、已定义两个字符串s1、s2(以‘$’为结束符),编写一个字符串比较的子程序, s1>s2返回01h,s1=s2返回00h,s1<s2返回0ffh。将返回值存入s3。

.model small,c
.stack 100h
.data
s1 db 'jifeso$'
s2 db 'fije$'
s3 db ?
.code
main proc
.startup
mov ax,offset s1
push ax
mov ax,offset s2
push ax
call strcmp
;需要明确一点,字符串比较函数的原理,从第一个字符开始,逐个比较两个字符串中对应位置的字符
;如果两个字符相等,则继续比较下一个字符;
;如果不相等,则返回不相等的结果
mov s3,al
.exit
main endp
strcmp proc
p1 equ word ptr[bp+6];s1的起始地址
p2 equ word ptr[bp+4];s2的起始地址
push bp
mov bp,sp
push bx
push si
push di

mov bx,0
mov si,p1
mov di,p2
mov al,0
.while([bx][si]!='$')&&([bx][di]!='$')
mov ah,[bx][si]
.if ah>[bx][di]||([bx][di]!='S')
mov al,1
.break
.endif

.if ah<[bx][di]||ah=='$'
mov al,0ffh
.break
.endif
inc bx
.endw
pop di
pop si
pop bx
pop bp
ret 4
strcmp endp
end

3、编程一个求sum=1+2+…+n的子程序,入口参数为字节数n,出口为字节数sum(不考虑和溢出),要求用递归实现。

.model small
.stack 200h
.data
num	word 5
sum	word 0
.code
main proc
.startup

push num
call SumN
mov sum,ax
	
.exit
main endp

SumN proc near
P1 EQU word ptr [bp+4]
	push bp
	mov bp,sp

	.if P1 > 1
		dec P1
		push P1
		call SumN
		add ax,P1
		inc ax
	.else
		mov ax,1
	.endif

	pop bp
	ret 2
SumN endp

End

4、编写宏,将源地址开始的n个字节复制到目的地址,三个参数为源地址,目的地址和字节数。

strCopy macro s1,s2,len
local l1
	push ax
	push cx
	mov si,s1
	mov di,s2
	mov cx,len
l1:
	mov al,[si]
	mov [di],al
	inc si
	inc di
	loop l1
	pop cx
	pop ax
endm

.MODEL SMALL,C
.STACK 100
.DATA
s1 db 'abcdefghijklmn'
s2 db 10h dup(0)
len equ 6

.CODE
.STARTUP
strCopy offset s1,offset s2,len
.EXIT
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LorraineWen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值