我是靠谱客的博主 故意秀发,最近开发中收集的这篇文章主要介绍汇编实现斐波那契(使用寄存器传递参数+堆栈传递参数),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用寄存器传参

assume cs:codesg,ds:data
data segment
	fiblist dw 1,1,18 dup(?)
	n dw 20
data ends
codesg segment
start:
	# 将数据段的地址的传递给ds
	mov ax,data
	mov ds,ax

	# 将的fiblist的地址传给si,用来遍历
	lea si,fiblist
	# 根据传入的斐波那契的数来确定循环次数
	mov cx,n
	# 前两项不需要进行计算
	sub cx,2

one:	# 将后项给ax
	mov ax,[si+2]
	# 将前项给bx
	mov bx,[si]
	# 调用fib函数
	call fib
	# 将最终的结果保存在新的目标中
	mov [si+4],ax
	# 增加迭代量
	add si,2
	loop one

	mov ah,4ch
	int 21h
	
fib proc
	add ax,bx
	ret
fib endp


codesg ends
END START
不得不说,使用内存去做,还是很详细具体的

使用堆栈传参

assume cs:codesg,ds:data
data segment
	fiblist dw 1,1,18 dup(?)
	n dw 20
data ends
codesg segment
start:
	# 将数据段的地址的传递给ds
	mov ax,data
	mov ds,ax

	# 将的fiblist的地址传给si,用来遍历
	lea si,fiblist
	# 根据传入的斐波那契的数来确定循环次数
	mov cx,n
	# 前两项不需要进行计算
	sub cx,2

one:	# 此时ax为段地址,后续为
	push ax
	# 将前项加入栈中
	push word ptr [si]
	# 将后项加入栈中
	push word ptr [si+2]
	# 调用的斐波那契函数
 	call fib
	# 将的
	pop ax
	mov word ptr [si+4],ax
	# 增加迭代量
	add si,2
	loop one

	mov ah,4ch
	int 21h
	
fib proc
	# 将当前的栈顶的地址赋值给bp
	mov bp,sp
	# 将栈顶的第一个地址给ax
	mov ax,[bp+2]
	# 将最终的结果保存在x1中
	add ax,[bp+4]
	# 将最终的结果返回给的最底下的ax
	mov [bp+6],ax
	ret 4
fib endp


codesg ends
END START
注意:这里有一点问题,那就是call会自动地将地ip入栈,然后将ret再出栈,ret4 就是出栈之后,再将sp = sp - 4,总的来说就是sp = sp - 6

最后

以上就是故意秀发为你收集整理的汇编实现斐波那契(使用寄存器传递参数+堆栈传递参数)的全部内容,希望文章能够帮你解决汇编实现斐波那契(使用寄存器传递参数+堆栈传递参数)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部