0


汇编语言实验五、子程序和宏

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
标签: 开发语言 汇编

本文转载自: https://blog.csdn.net/weixin_74027669/article/details/139785241
版权归原作者 咩咩大主教 所有, 如有侵权,请联系我们删除。

“汇编语言实验五、子程序和宏”的评论:

还没有评论