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

使用寄存器传参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
不得不说,使用内存去做,还是很详细具体的

使用堆栈传参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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

最后

以上就是故意秀发最近收集整理的关于汇编实现斐波那契(使用寄存器传递参数+堆栈传递参数)的全部内容,更多相关汇编实现斐波那契(使用寄存器传递参数+堆栈传递参数)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部