linux平台学x86汇编(十八):内联汇编

【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】
        使用汇编语言笔编程最常见的方式是在高级语言(C和C++)程序内编写汇编函数,这种吧汇编语言直接写到C和C++语言程序内的技术称为内联汇编。
        GNU的C编译器使用asm关键字指出使用汇编语言编写的源代码段落。asm段的基本格式如下:
        asm("as code");
        括号中的汇编指令必须在括号,指令超过一条的话必须使用新的行分隔汇编语言代码每一行,因为编译器逐字地取得asm段中汇编代码,并且把它们放在为程序生成的汇编代码中,有时可以使用制表符字符缩进指令以便它们和标签区别开。下面是一个简单的内联汇编的示例:
        asm("movl $1, %eax\n\t movl $0,%ebx\n\tint $0x80");
        该示例包括3条指令,在使用很多汇编指令时会显得有些混乱,所以一般把指令放在单独的行中。
        asm("movl $1, %eax\n\t"
                "movl $0,%ebx\n\t"
                "int $0x80");
        利用C全局变量可以把数据传递进和传递出内联汇编语言,注意不能使用局部变量。
#include <stdio.h>
int     result = 10;
int main(int argc, const char *argv[])
{
    asm("addl $1, result\n\t"
        "subl $2, result\n\t");
    printf("the result is  %d\n", result);
    return 0;
}
使用gcc生成汇编代码如下:
 .file "inline-as.c"
.globl result
.data
.align 4
.type result, @object
.size result, 4
result:
.long 10
.section .rodata
.LC0:
.string "the result is  %d\n"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
#APP
# 7 "inline-as.c" 1
addl $1, result
subl $2, result

# 0 "" 2
#NO_APP
movl result, %edx
movl $.LC0, %eax
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
.section .note.GNU-stack,"",@progbits
c文件编译执行结果为:
$ ./inline-as
the result is  9
$
反编译的汇编代码中#APP和#NOAPP之间的代码为asm段指定的内联汇编代码。
ANSI C规范在使用内联汇编语句时使用关键字__asm__替换关键字asm,因为ANSI C 关键字asm用于其他用途。如下:
    __asm__("addl $1, result\n\t"
        "subl $2, result\n\t");
基本的asm格式提供创建汇编代码的简单样式,但是有一些局限性。首先,所有输入值和输出值都必须使用C程序的全局变量,如上示例所见。其次,在内联汇编代码中不去改变任何寄存器的值。GNU编译器提供asm段的扩展格式来帮助解决这些问题。扩展格式采用新的格式,如下:
<span style="font-family:Microsoft YaHei;">asm ("as code": output location : input operands : changed registers);</span>
该格式由4个部分构成,使用冒号分隔:汇编代码、输出位置、输入操作数、改动的寄存器。在扩展asm格式中,不是所有部分必须出现。

大多数程序员把内联汇编代码定义为宏函数,定义方式和C语言类似。定义内联汇编宏函数如下:
    #define CAL ({
            asm("addl $1, result\n\t"
            "subl $2, result\n\t");
            })
这里asm语句必须要在一对花括号中,以便指出语句的开头和结尾,否则编译器会生成错误信息。
如下为使用宏的一个简单示例:
#include <stdio.h>
#define CAL ({ \
    asm("addl $1, result\n\t"\
        "subl $2, result\n\t");\
        })
int     result = 10;
int main(int argc, const char *argv[])
{
    CAL;
    printf("the result is  %d\n", result);
    return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第Ο章 写在前面...................................................................................................................2 第一章汇编语言简介.............................................................................................................3 第二章认识处理器.................................................................................................................4 2.1 寄存器........................................................................................................................4 2.2 使用寄存器................................................................................................................6 第三章操作内存...................................................................................................................12 3.1 实模式......................................................................................................................12 3.2 保护模式..................................................................................................................16 3.3 操作内存..................................................................................................................19 3.4 串操作......................................................................................................................21 3.5 关于保护模式中内存操作的一点说明.................................................................22 3.6 堆栈.........................................................................................................................23 本章小结.........................................................................................................................25 第四章利用子程序与中断...................................................................................................25 4.1 子程序......................................................................................................................25 4.2 中断..........................................................................................................................31 第五章编译优化概述...........................................................................................................34 5.1 循环优化:强度削减和代码外提.........................................................................36 5.2 局部优化:表达式预计算和子表达式提取.........................................................37 5.3 全局寄存器优化.....................................................................................................38 5.4 x86体系结构上的并行最大化和指令封包..........................................................40 5.5 存储优化..................................................................................................................42 第六章 Linux X86汇编程序设计........................................................................................46 6.1编译和链接...............................................................................................................46 6.2基本示例...................................................................................................................46 第七章 X86汇编指令集汇总...............................................................................................47 一.数据传输指令............................................................................................................47 二、算术运算指令.........................................................................................................49 三、逻辑运算指令.........................................................................................................49 四、串指令.....................................................................................................................50 五、程序转移指令.........................................................................................................50 六、伪指令.....................................................................................................................52 七、寄存器.....................................................................................................................52 八、位操作指令,处理器控制指令.............................................................................52 九、FPU instructions......................................................................................................54 第八章 GCC内联汇编基础..................................................................................................54 1. GCC汇编格式...........................................................................................................55 2.内联汇编基本形式......................................................................................................56 3. 扩展形式内联汇编....................................................................................................56 4. 深入constra................................................................................................................59 5.结束语..........................................................................................................................63

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值