汇编语言学习系列 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: .int 3
        format: .asciz "%d\n"
.section .text
.global _start
_start:
        pushl %ebp
        movl %esp, %ebp
        subl $8, %esp

        movl n, %ecx
        movl %ecx, (%esp)
        call fact_for

        pushl %eax
        pushl $format
        call printf

        movl $0, (%esp)
        call exit

fact_for:
        pushl %ebp
        movl %esp, %ebp
        pushl %ebx

        movl 8(%ebp), %edx    #get n
        movl $1, %eax        #init result
        movl $2, %ecx        #init i

        cmp %ecx, %edx
        jl .done

.loop:
        imul %ecx, %eax
        inc %ecx
        cmp %ecx, %edx
        jge .loop

.done:
        popl %ebx
        popl %ebp

        ret        
  • 编译

as for.s -o for.o

  • 链接

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

  • 执行

./for

时间: 2024-11-03 03:46:49

汇编语言学习系列 for循环实现的相关文章

[F#, Basic] 轻松学习系列 ( 20 ) ─ 循环设计 之 计数循环 (二)

Visual F# 在前一文介绍的是 for -- to -- 的语法,今天再介绍?? for -- downto -- 的语法啰! ★ 语法说明: 1: for ... downto ... 计数循环 - 语法说明 2: for = downto do 3: ? ? ★ 范例程序: 1: // Nobel Hsieh ( http://www.dotblogs.com.tw/nobel12 ) 2: open System;; 3:? 4: // for ... downto ... 计数循环

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

假如汇编语言要实现如下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; } 无论对于递归实现还是循环实现,汇编都是将转换为跳转语句实现.可以把上面的代码转换为 refa

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

假如汇编语言要实现如下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

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

假如汇编语言要实现如下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\

分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用(主从.事务与锁.持久化)> 本文我们继续学习redis的高级特性--集群.本文主要内容包括集群搭建.集群分区原理和集群操作的学习. Redis集群简介 Redis 集群是3.0之后才引入的,在3.0之前,使用哨兵(sentinel)机制(本文将不做介绍,大家可另行查阅)来监控各个节点之间的状态.Redi

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

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

pthread 学习系列 case2-- pthread_mutex_t

许多互斥对象 如果放置了过多的互斥对象,代码就没有什么并发性可言,运行起来也比单线程解决方案慢.如果放置了过少的互斥对象,代码将出现奇怪和令人尴尬的错误.幸运的是,有一个中间立场.首先,互斥对象是用于串行化存取*共享数据*.不要对非共享数据使用互斥对象,并且,如果程序逻辑确保任何时候都只有一个线程能存取特定数据结构,那么也不要使用互斥对象. 其次,如果要使用共享数据,那么在读.写共享数据时都应使用互斥对象.用 pthread_mutex_lock() 和 pthread_mutex_unlock

quick-cocos2d-x 学习系列之六 CoinFlip

quick-cocos2d-x 学习系列之六 CoinFlip 下面我们来看一个很完整的例子,CoinFlip,这个DEMO已经非常完整可以直接用来玩耍了. 代码路径:.. \quick\samples\coinflip 这个游戏还是很益智的. 1.  代码逻辑 开始部分基本和其他的都一致,从main.lua文件进入,到达MyApp.lua文件中.(MyApp继承于cc.mvc.AppBase) 主要函数是run,enterMenuScene,enterMoreGamesScene,enterC