Linux下汇编语言------计算n的阶乘

用高级语言比方C语言写个阶乘非常easy,那如今就来熟悉下Linux使用AT&T汇编格式写一个程序来计算阶乘吧

写法一是 使用跳转指令实现。写法二是使用函数来实现

约定:本程序没有将结果打印在标准输出上。

须要使用GDB调试查看

写法一

#as filename.s -o filename.o
#ld filename.o -o filename
# gdb filename

.section .data
.section .text
.globl _start
_start:
	movl $1, %eax #result = 1
	movl $6, %ecx # n = 5
	cmpl $1, %ecx
	jle .loop_exit

.start_loop:
	imull %ecx, %eax
	subl  $1, %ecx
	cmpl $1, %ecx
	jge .start_loop
	movl %eax, %ebx
	movl $1, %eax
	int $0x80
.loop_exit:
	movl $1, %eax
	int $0x80

--------------------函数写法待更新-------------------------

写法二:函数递归

.section .data
.section .text
.globl _start
_start:
	pushl $5
	call .JC

	movl %eax, %ebx
	movl $1, %eax
	int $0x80

.JC:
	pushl %ebp
	movl %esp, %ebp
	pushl %ebx
	subl $4, %esp
	movl 8(%ebp), %ebx #get n = 5;

	movl $1, %eax      #result = 1;
	cmpl $1, %ebx
	jle .L1
	leal -1(%ebx), %eax
	movl %eax, (%esp)
	call .JC
	imull %ebx, %eax
.L1:
	addl $4, %esp
	popl %ebx
	popl %ebp
	ret

查看结果:echo $?

当然使用gdb来查看,会更明确。

使用 echo $? 来查看的话,貌似n超过6了结果就显示不对,所以还是用gdb保险

时间: 2024-08-25 12:28:56

Linux下汇编语言------计算n的阶乘的相关文章

linux下汇编语言开发总结

汇编语言是直接对应系统指令集的低级语言,在语言越来越抽象的今天,汇编语言并不像高级语言那样使用广泛,仅仅在驱动程序,嵌入式系统等对性能要求苛刻的领域才能见到它们的身影.但是这并不表示汇编语言就已经没有用武之地了,通过阅读汇编代码,有助于我们理解编译器的优化能力,并分析代码中隐含的低效率,所以能够阅读和理解汇编代码也是一项很重要的技能.因为我平时都是在linux环境下工作的,这篇文章就讲讲linux下的汇编语言. 一.汇编语法风格 汇编语言分为intel风格和AT&T风格,前者被Microsoft

Linux下的计算命令整理

在Linux系统下,经常会有一些计算需求,那么下面就简单梳理下几个常用到的计算命令 (1)bc命令bc命令是一种支持任意精度的交互执行的计算器语言.bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下常用参数选项:-i:强制进入交互式模式: -l:定义使用的标准数学库: -w:对POSIX bc的扩展给出警告信息: -q:不打印正常的GNU bc环境信息: -v:显示指令版本信息: -h:显示指令的帮助信息. 在bc工作环境下,可以

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据 某一线程Cpu使用率的计算 计算方法 实验数据 多核情况下cpu使用率的计算 实验一 描述 数据一 数据二 实验二 描述 数据一 数据二 主要问题 Java 系统

linux 下 float 和 double 精度计算差别

今天在根据需求写代码时候,偶尔发现linux 下 设置变量类型 float 和double 计算时, 得到的结果是不一样的. 要求: 设定值 = 传入值 * 10 * 122.88 /1000; case: 设定值 = 1666*10*122.88/1000 = 2047.1808 设置成 float时,代码: #include<stdio.h> #include <math.h> unsigned int fun(unsigned int sfn_threshold) { flo

Linux下的汇编语言之系统调用

汇编语言是基本的语言之一,他的明显优势是速度快,可以直接对硬件进行操作.Linux下如何使用汇编语言,语法格式有哪些?需要使用哪些开发工具?本文将会为 http://www.zhihu.com/people/tqvilrzc/askshttp://www.zhihu.com/people/tqbcsvip/askshttp://www.zhihu.com/people/efstqrxol/askshttp://www.zhihu.com/people/emnnxsel/askshttp://ww

Linux下shell编程实例

1. 判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下 read -p "input a file:" filename if [ -b $filename -o -c $filename ] then cp $filename /dev/ fi 2.编写一个脚本,进行简单的减法运算,要求提示输入变量 #!/bin/bash read -p "input a number:" num1 read -p "input another nu

LINUX下GDB反汇编和调试

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数.而Windows下却是相反. 1. 基本操作指令 简单的操作数类型说明.一般有三种. (1)马上数操作数,也就是常数值.马上数的书写方式是"$"后面跟一个整数.比方$0x1F.这个会在后面的详细分析中见到非常多. (2)寄存器操作数,它表示某个寄存器的内容.用符号Ea来表示随意寄存器a,用引用R[Ea]来表示它的值.这是将寄存器集合看成一个数组R,用寄存器表示符作为索引. (3)操作数是存储

Linux下c/c++项目代码覆盖率的产生方法

最近做了一系列的单元测试相关的工作,除了各种规范及测试框架以外,讨论比较多的就是关于代码覆盖率的产生,c/c++与其他的一些高级语言或者脚本语言相比较而言,例如 Java..Net和php/python/perl/shell等,由于没有这些高级语言和脚本语言的反射的特性,其代码覆盖率的产生过程会稍微复杂一些.发现许多同学对C++的覆盖率如何产生在都不太清楚,这里做一个简单的介绍. 一.基本使用方法 在Linux上的c/c++开发一般都使用gcc/g++作为主要的编译器,如果需要产生覆盖率数据需要

Linux下的AT&amp;amp;T语法(即GNU as 汇编语法)入门

http://blogold.chinaunix.net/u3/105209/showart_2085748.html 学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本和资料中都难以找到答案.程序员是追求完美的一个种群,其头 脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁.不久前在itput论坛上偶得<Computer Systems A Programmer's Perspective>(以下称CS.APP)这本经典好书,遂连夜拜读以求解惑.虽说书中没有能正