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

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

相关推荐

  1. 汇编语言实验子程序

    2024-06-19 05:24:05       34 阅读
  2. 汇编语言定义指令--.macro

    2024-06-19 05:24:05       30 阅读
  3. Perl 语言开发(八):子程序模块

    2024-06-19 05:24:05       29 阅读
  4. 汇编语言-[bx]loop指令

    2024-06-19 05:24:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-19 05:24:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-19 05:24:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-19 05:24:05       82 阅读
  4. Python语言-面向对象

    2024-06-19 05:24:05       91 阅读

热门阅读

  1. 【做一道算一道】零钱兑换

    2024-06-19 05:24:05       59 阅读
  2. 音频流采样器类的实现【6】

    2024-06-19 05:24:05       35 阅读
  3. Shellcode详解

    2024-06-19 05:24:05       56 阅读
  4. 在JPA项目启动时新增MySQL字段

    2024-06-19 05:24:05       30 阅读
  5. 访问者模式

    2024-06-19 05:24:05       36 阅读
  6. 使用ReentrantLock和ThreadPoolExecutor模拟抢课

    2024-06-19 05:24:05       53 阅读
  7. 最大子段和问题

    2024-06-19 05:24:05       27 阅读
  8. 探索VtKLoader源码中THREE.BufferGeometry的奥秘

    2024-06-19 05:24:05       22 阅读