汇编语言学习系列 递归实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位)。

#include<stdio.h>
int refact(int n){
    if(n == 1)
        return 1;
    else
        return n * refact(n - 1);
}

int main(){
    int a = 4;
    printf("%d\n", refact(a));
    return 0;
}


无论对于递归实现还是循环实现,汇编都是将转换为跳转语句实现。可以把上面的代码转换为

refact:
    if((n-1) <= 0)
    goto done;

    body-statement

done:
  • 汇编代码refact.s
.section .data
        a: .int 4
        format: .asciz "%d\n"
.section .text
.global _start
_start:
        pushl %ebp
        movl %esp, %ebp
        subl $8, %esp #allocate storage space

        movl a, %edx    #get a
        movl %edx, (%esp)    #save value of a on stack

        call refact

        pushl %eax
        pushl $format
        call printf
        movl $0, (%esp)
        call exit                    

refact:
        pushl %ebp
        movl %esp, %ebp
        pushl %ebx
        subl $4, %esp    #allocate storage space

        movl 8(%ebp), %ebx    #get n
        cmpl $1, %ebx
        jle done    #test (n-1) >= 0

        leal -1(%ebx), %eax    #(n-1)
        movl %eax, (%esp)  #save (n-1) on the stack
        call refact
        imul %ebx, %eax  #use %eax to save result 

done:
        addl $4, %esp    #release space
        popl %ebx
        popl %ebp
        ret
        
  • 编译

as refact.s -o refact.o

  • 链接

ld -lc -I /lib/ld-linux.so.2 refact.o -o refact

  • 执行

./refact

时间: 2024-10-13 00:48:02

汇编语言学习系列 递归实现的相关文章

汇编语言学习系列 冒泡排序实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp; } int main() { int a[] = {3, 0, 5, 1, 4, 6, 2, 9, 8, 7}; int i ,j; for(i = 0; i < 10; i++) { for(j = i + 1; j < 10;j++) { if

汇编语言学习系列 for循环实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int fact_for(int n) { int i; int result = 1; for(i = 2; i <= n; i++) result *= i; return result; } int main(){ printf("%d\n", fact_for(3)); return 0; } 代码for.s .section .data n:

汇编语言学习系列 打印数组实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int main(){ int a[] = {3, 0, 5, 1, 4, 6, 2, 9, 8, 7}; int i; for(i = 0; i< 10; i++) printf("%d\n", a[i]); return 0; } 代码 .section .data array: .int 3, 0, 5, 1, 4, 6, 2, 9, 8, 7 l

汇编语言学习系列 函数实现

以下代码示范交换a和b两个整数的函数,编译环境Ubuntu14.04(32位) 假如要实现以下C代码 #include <stdio.h> void swap(int *xp, int *yp) { int x = *xp; int y = *yp; *xp = y; *yp = x; } int main() { int a = 534, b = 1057; swap(&a, &b); printf("%d\n", a); printf("%d\

quick-cocos2d-x 学习系列之十六 塔防完结

quick-cocos2d-x 学习系列之十六 塔防完结 1.  math2d.lua文件 该文件实现了常用的数学函数. Dist函数实现两点的距离. radians4point求两点的夹角(弧度) pointAtCircle求圆上一个点的位置 pointAtLineToPoint求线段上与指定点距离最近的点 degrees2radians角度转换为弧度 radians2degrees弧度转换为角度 2.  utils.lua文件 2.1         drawCircle 返回newCirc

《PHP扩展学习系列》系列技术文章整理收藏

<PHP扩展学习系列>系列技术文章整理收藏 1PHP扩展之文本处理(二)--PCRE正则表达式语法10--后向引用http://www.lai18.com/content/321526.html 2PHP扩展之文本处理(二)--PCRE正则表达式语法9--重复/量词http://www.lai18.com/content/321525.html 3PHP扩展之文本处理(二)--PCRE正则表达式语法11--断言http://www.lai18.com/content/321527.html 4

Deep Learning(深度学习)学习系列之(二)

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

[转帖]Zookeeper学习系列【一】 教会你Zookeeper的一些基础概念

Zookeeper学习系列[一] 教会你Zookeeper的一些基础概念 https://segmentfault.com/a/1190000018927058 前言 最近加入了部门的技术兴趣小组,被分配了Zookeeper的研究任务.在研究过程当中,发现Zookeeper由于其开源的特性和其卓越的性能特点,在业界使用广泛,有很多的应用场景,而这些不同的应用场景实际上底层的原理都是差不多的,只要你真正理解了Zookeeper的一些基础概念和机制,就能够触类旁通. 于是乎,在第一次和项目小组内成员

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快