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
版权归原作者 咩咩大主教 所有, 如有侵权,请联系我们删除。