文档章节

汇编实现power函数

guonaihong
 guonaihong
发布于 2015/07/19 18:21
字数 491
阅读 255
收藏 6

这个函数改的深入理解程序设计 使用linux汇编语言里的例子。

相比书中的例子,主要改变为:

  1. 对底数为1。指数为1都进行特殊处理。

  2. 可以在64为平台编译通过,原书pushl %ebp 在64位平台编译不过,改为push %rbp。

  3. 原书使用exit系统调用查看结果,改为printf查看结果。

.section .data
.section .text

fmt: 
    .ascii "%ld\n\0"

.global _start
_start:
    push $24              #压入第2个参数
    push $2              #压入第1个参数
    call power           #调用函数
    add  $16, %rsp       #复位栈寄存器

    movslq %eax, %rsi    #把power函数的返回值保存到rsi寄存器中
    mov $fmt, %rdi       #把fmt 保存到rdi寄存器中
                         #printf(%rdi, %rsi);
    xor %rax, %rax
    call printf
    add $16, %rsp

    mov $0, %rdi         #exit(%rdi)
    call exit

.type power, @function
power:
    push %rbp            #保存基址寄存器
    mov %rsp, %rbp       #把栈指针寄存器的值保存到基址寄存器中

    movl 24(%rbp), %ecx  #取出函数第2个参数
    sub  $8, %rsp        #存放符号,第1个参数小于0 临时变量存放-1 否则存发1
    movq  $1, -8(%rbp)   #存发符号为的临时变量 先设置为1
    cmp  $0, 16(%rbp)    #和0比较
    jge first_args_lg0
    negl 16(%rbp)        #发现第一个参数小于0 取负 x = -x 此时的x >= 0
    movq  $-1, -8(%rbp)  #符号位设置为-1

first_args_lg0:
    
    mov 16(%rbp), %ebx   #取出函数第1个参数

    cmp $0, %ecx         #如果指数等于0 返回1. 任何数的0次方等于1
    je power_1          
    cmp $1, %ebx         #如果底数等于1 返回1. 任意多的1相乘还是1
    je power_1

    mov %ebx, %eax       #存放最后的结果值
    
power_loop_start:
    cmp $1, %ecx         #如果计算器等于1时,函数退出
    jle power_end
    imul %ebx, %eax
    dec %ecx             #对%eax里的值减1
    jmp power_loop_start

power_1:
    mov $1, %eax
power_end:
    imul -8(%rbp), %eax  #最终结果和符号位相乘
    mov %rbp, %rsp
    pop %rbp
    ret


编译:

gcc -c power.s -g && ld ./power.o -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 && ./a.out


© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
强制内联和强制不内联

1.强制不内联 一个函数,如果代码量比较少的话,用 -O3优化开关的话,gcc有可能将这个函数强制内联(inline)即使,你在函数前没有写inline助记符。 如果是一个手写汇编的函数,那样的话很有可...

长平狐
2012/09/03
255
0
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
2018/07/17
50
0
C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二) Lambda表达式中较复杂的形式如下: [ capture ] ( params ) -> ret { ...

Micooz
2014/06/10
6.4K
15
GNU ARM汇编快速入门

前言: 以前用ARM的 IDE工具,使用的是ARM标准的汇编语言。现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者...

小桥河西
2008/07/07
0
0
.c文件和.h文件的关系

举个简单的例子!你会容易理解的。 你写一个stack.h的头文件,里面声明几个函数原形: stack.h #ifndef STACKH #define STACKH extern void push(char); extern char pop(void); extern int ...

园客
2018/01/23
69
0

没有更多内容

加载失败,请刷新页面

加载更多

Elasticsearch系列---索引管理

概要 Elasticsearch让索引创建变得非常简单,只要索引一条新的数据,索引会自动创建出来,但随着数据量的增加,我们开始有了索引优化和搜索优化的需求之后,就会发现自动创建的索引在某些方面...

清茶豆奶
26分钟前
4
0
MAMP Pro for Mac(PHP/MySQL开发环境)

[名称]:MAMP Pro for Mac [大小]: 11.14 MB [语言]:英文 [测试环境]: Mac OS 10.15.x [下载链接]:https://www.macdown.com/mac/1676.html 简介 一款包含Macintosh、Apache、MySQL和PHP...

麦克虾仔
30分钟前
1
0
Numpy处理图片方法

在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matp...

北方的郎
今天
18
0
AMD集中擢升高管:从Intel挖了个高手

  1 月 17 日,AMD 官方宣布多项人事升迁、新人任命,擢升了四位高级副总裁:   AMD 同时还宣布, 聘请行业资深人士 Daniel McNamara 出任高级副总裁兼服务器业务部总经理,负责在第二代...

水果黄瓜
今天
10
0
什么是泛型?

一、泛型的概念 泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 二、泛型的意义 一般的...

hncboy
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部