首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GCC内嵌汇编

如果你是一个嵌入式开发人员,或者是Linux内核研发人员。...有的人对这种C原因中嵌入汇编不是很熟悉,也不是很了解。今天就带大家了解了解。 为什么会出现这种写法 Linux内核绝大部分代码是用C语言写的,而只有一小部分代码是使用内嵌汇编写的。...GCC提供了内嵌汇编的功能,可以在C代码中直接内嵌汇编语言语句,大大方便了程序设计。...内嵌汇编语法 内嵌汇编语法如下: __asm__( 汇编语句模板: 输出部分: 输入部分: 破坏描述部分...其中常见的就是内存修改通知: 如果一个内联汇编语句的指令列表中的指令对内存进行了修改,或者在此内联汇编出现的地方,内存内容可能发生改变,而被改变的内存地址你没有在其Output操作表达式中使用”m”

3.1K30

gcc内嵌汇编详解

这样gcc就知道如何将这条嵌入式汇编语句转成实际的汇编指令了: fsinx:汇编指令名 %1, %0:汇编指令操作数 “=f”(result):操作数%0是一个浮点寄存器,与变量result关联(对输出操作数...gcc执行这条汇编指令前会先将变量angle的值读取到寄存器%1中) 因此这条嵌入式汇编会转换为至少三条汇编指令(非优化): 将angle变量的值加载到寄存器%1 fsinx汇编指令,源寄存器%1,目标寄存器...对于没有输出操作数的情况,在汇编指令后就没有输出规则,于是就出现两个连续冒号,后跟输入规则。 3....隐式改变寄存器 有的汇编指令会隐含修改一些不在指令操作数中的寄存器,为了让gcc知道这个情况,将隐式改变寄存器规则列在输入规则之后。...上面我们说过gcc自身是不了解汇编指令的,所以你在指令中显式指定的寄存器,对gcc来说是隐式的,因此必须包含在隐式规则之中。另外,指令中的显式寄存器前需要一个额外的%,比如%%eax。

2.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    GCC内嵌汇编语言

    GCC内嵌汇编语言 作者:肖文鹏 临江仙 整理:杨小华 绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。...但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同。...远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即: AT&T 格式...array(%ebx, %eax, 4), %cx mov cx, [ebx + 4*eax + array] movb $4, %fs:(%eax) mov fs:eax, 4 内嵌汇编格式简介...内嵌汇编语法如下: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分) 其中,asm 和 __asm__是完全一样的。

    2.6K20

    汇编指令

    汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 名称 功能 操作数 操作码 模数 寄存器...10 无 无 8086 无 无 JB 低于跳转 短 $72 无 无 无 无 10 无 无 8086 无 无 JNB 不低于跳转 短 $73 无 无 无 无 10 无 无 8086 无 无 JE 相等跳转...8086 无 无 JA 高于跳转 短 $77 无 无 无 无 10 无 无 8086 无 无 JS 负号跳转 短 $78 无 无 无 无 10 无 无 8086 无 无 JNS 非负跳转 短 $79 无...JL 小于跳转 短 $7C 无 无 无 无 10 无 无 8086 无 无 JNL 不小于跳转 短 $7D 无 无 无 无 10 无 无 8086 无 无 JNG 不大于跳转 短 $7E 无 无 无 无...不高于跳转 近 $0F86 无 无 无 无 10 无 无 386 无 $66 JA 高于跳转 近 $0F87 无 无 无 无 10 无 无 386 无 $66 JS 负号跳转 近 $0F88 无 无

    1.6K10

    Linux 必会的 ARM 汇编指令

    学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。...二.转移指令跳转指令】 B 跳转指令 BL 带返回的跳转指令 BLX 带返回和状态切换的跳转指令 BX 带状态切换的跳转指令 三.程序状态寄存器访问指令 1、【MRS指令】 MRS 通用寄存器...【AREA】 一个汇编程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段,因此在汇编程序的开头,我们一般的语句会用到AREA。...ENTRY 伪指令用于指定汇编程序的入口点。...在一个完整的汇编程序中至少要有一个 ENTRY (也可以有多个,当有多个 ENTRY 时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个 ENTRY (可以没有)。

    3.9K10

    arm汇编指令详解带实例_汇编buf指令

    ARM汇编指令指令与伪指令汇编指令指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。...两种风格 ARM官方的指令风格:指令一般用大写,一般用于Windows的开发环境(ADS,MDK等)如: LDR R0, [R1]。 GNU风格:指令一般用小写字母、linux中常用。...跳转(分支)指令 b & bl & bx b 直接跳转(就没打开算返回) bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用 bx跳转同时切换到ARM模式...,一般用于异常处理的跳转。...伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编指令。 GUN汇编中的一些符号 @ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似。

    1.4K11

    详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的。 跳转执行:当指令执行到当前位置后跳转到其他位置执行。...跳转指令5 跳转指令5 当前地址+8 0x0000000C 顺序执行 顺序执行 当前地址+4 0x00000010 顺序执行 顺序执行 当前地址+4 0x00000014 跳转指令8 跳转指令...#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit #endif   上述代码对应的反汇编代码如下: 33f000ac: eb000017 bl 33f00110...上面的反汇编出来的 ldr pc,=call_board_init_f就变成了ldr pc, [pc, #804],由于ARM使用了流水线的原因,所以在执行 ldr pc,[ pc, #4 ]的时候 pc...而相对跳转时,反汇编bl 33f00110中的33f00110是根据pc计算出来的,当pc改变时,结果也会改变。所以,称为相对跳转,与当前位置无关。 4.

    1.2K30

    详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    跳转指令5 跳转指令5 当前地址+8 0x0000000C 顺序执行 顺序执行 当前地址+4 0x00000010 顺序执行 顺序执行 当前地址+4 0x00000014 跳转指令8 跳转指令...#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit #endif   上述代码对应的反汇编代码如下: 33f000ac: eb000017 bl 33f00110...我们以下图中的第一句话作为例子分析下 ldr pc,=call_board_init_f   对应的反汇编代码如下: 33f000d0: e59ff324 ldr pc, [pc, #804] ; 33f003fc...上面的反汇编出来的 ldr pc,=call_board_init_f就变成了ldr pc, [pc, #804],由于ARM使用了流水线的原因,所以在执行 ldr pc,[ pc, #4 ]的时候 pc...而相对跳转时,反汇编bl 33f00110中的33f00110是根据pc计算出来的,当pc改变时,结果也会改变。所以,称为相对跳转,与当前位置无关。 4.

    1K30

    汇编指令大全

    80×86指令系统,指令按功能可分为以下七个部分。   (1) 数据传送指令。   (2) 算术运算指令。   (3) 逻辑运算指令。   (4) 串操作指令。   (5) 控制转移指令。   ...(6) 处理器控制指令。   (7) 保护方式指令。 3.3.1数据传送指令   数据传送指令包括:通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩展指令、扩展传送指令等。   ...一、通用数据传送指令   1传送指令   传送指令是使用最频繁的指令,格式:MOV DEST,SRC   功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。   ...移位指令分一般移位指令和循环移位指令。   1一般移位指令   (1) 算术/逻辑左移指令。   ...例 3.56      JMP NEXT          NEXT:MOV AL,BL   本例为无条件转移到本段内,标号为NEXT的地址去执行指令汇编程序可以确定目的地址与JMP指令的距离。

    1.4K10

    16位汇编指令_汇编语言指令

    汇编语言特点:与机器相关,执行效率高,调试复杂 汇编语言优缺点:汇编语言和高级语言混合编写,互补 数据表示类型:二进制B,八进制Q,十进制D,十六进制H BCD编码:用二进制来表示十进制数 CPU...(处理器每执行一条指令便产生一个内部中断,可以对程序进行单步调试) 16位汇编物理地址与逻辑地址转换:逻辑地址<< 4位 + 偏移 = 物理地址(可以有多个逻辑地址) CS(代码段),表示代码段的起始地址...,[BX(BP)+SI] 相对基址变址寻址,mov AX,[BX+SI+05] 段内转移也称近转移(near ptr) 段内转移也称短转移(short) 段间转移也称远转移(far ptr) 8086汇编指令...[ASM]8088汇编指令 一、数据传输指令 ───────────────────────────────────────   它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1....输入输出端口传送指令.

    99830

    X86汇编语言的分支和控制跳转指令

    汇编语言下呈现。...在控制跳转指令中,最常用的就是jmp指令,它让控制流直接跳转到具体设定的位置去执行那里的代码。这种跳转由于无需判断先决条件,因此也叫无条件跳转。...问题在于程序在逻辑设计上通常需要满足固定条件的跳转,例如提到的if..else就属于这种类型。在汇编语言层面就需要使用标志位来进行跳转前的条件判断。在汇编语言层面可以实现多达三十多种的条件跳转方式。...等循环语句,这些循环功能其实就是使用了上面描述的跳转指令来实现,只要判断某个条件是否成立,如果成立则通过jmp跳转回原来指令的起始位置就能实现对同一部分指令进行多次运行的效果。...在X86汇编语言中,还有一系列指令专门负责对数据进行批量操作。

    1.8K20

    AT&T汇编语言与GCC内嵌汇编简介

    远程跳转指令和子过程调用指令的操作码使用前缀“l“,分别为ljmp,lcall, 与之相应的返回指令伪lret。...下面是一些允许的操作数扩展后缀: l bl: ,字节>->长字 l bw: ,字节>->字 l wl: ,字->长字 跳转指令标号后的后缀表示跳转方向,“f”表示向前(forward), “b,...2.2 内嵌汇编举例在内嵌汇编中,可以将C 语言表达式指定为汇编指令的操作数,而且不用去管如何将C 语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可...使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉 GCC对这些操作有哪些限制条件。...和“%1”代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相对应。

    2.1K10

    【Android 逆向】x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )

    文章目录 一、call 子函数调用指令 二、jmp 跳转指令 三、lea 加载指令 四、mov 数据传送指令 总结 一、call 子函数调用指令 ---- call 指令是 子函数调用指令 , 调用的指令的下一条指令地址入栈..., 会自动跳转到 子函数 目标地址中 , 该地址可能存储在寄存器中 , 也可能是一个常量 ; 二、jmp 跳转指令 ---- jmp 跳转指令 , 默认情况下是无条件跳转 ; 如果想要附加条件跳转 ,...如达成某种条件后才能跳转 , 可以附带如下条件 ; a : above , 无符号 大于 跳转 ; b : below , 吗无符号 小于 跳转 ; g : great , 有符号 大于..., e 表示等于跳转 , ae 表示大于等于跳转 , nae 表示不大于等于跳转 即 小于跳转 ; 三、lea 加载指令 ---- lea 指令 : Load Effect Address 取地址值...jmp 跳转指令 ( 可选参数 a , b , c , g , l , o , p , s , z , e , n) lea 加载指令 , lds , les , lfs , lgs , lss

    1.5K10

    汇编指令之移位指令

    移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。 格式为:xxx oper1,CL/1 ;移位次数只能是1或者存放在CL里面。...一、算术移位指令 1、算术左移指令SAL 功能:左移一次,最低位补0,最高位送入CF标志位,如图: 意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。...2、算术右移指令SAR 功能:右移一次,最高位保持不变,最低位送入CF标志位,如图: 意义:右移n次,等于/2的n次幂。所以可用于有符号操作数做/2的n次幂运算。...二、逻辑移位指令 1、逻辑左移SHL 功能:同SAL,如图: 意义:同SAL 2.逻辑右移SHR 功能:右移一次,最高位补0.区别!最低位送入CF标志位。...三.循环移位指令 1.循环左移指令ROL 功能:左移一次,左移前的最高位送入最低位以及CF.如图: 2.循环右移指令ROR 功能:右移一次,右移前的最低位送入最高位以及CF.如图: 3、带进位的循环左移

    2.6K20

    汇编知识扫盲之常见汇编指令

    汇编知识扫盲之常见汇编指令 一、数据传输指令     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.   1. 通用数据传送指令.        ....CPU执行到这条指令的时候会待机.所以这个指令只为填充字节. 2....输入输出端口传送指令.       ...五、程序转移指令   1>无条件转移指令 (长转移)     JMP  无条件转移指令     CALL  过程调用     RET/RETF过程返回. 2>条件转移指令 (短转移,-128到+127...JECXZ     ECX为零时转移. 4>中断指令     INT  中断指令     INTO  溢出中断     IRET  中断返回 5>处理器控制指令     HLT  处理器暂停,

    1.6K20

    arm(2)| 汇编指令和伪指令

    今天我们来说一下arm的汇编指令和伪指令。 一、指令和伪指令 我们首先来了解一下什么叫做指令和伪指令指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。...arm汇编有两种风格,ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如:LDR R0, [R1]。...GNU风格的ARM汇编指令一般用小写字母、linux中常用。如:ldr r0, [r1]。 二、arm汇编特点 ARM汇编特点1:LDR/STR架构。...4、cpsr访问指令 mrs用来读cpsr或spsr,msr用来写cpsr或spsr 5、跳转指令b、bl、bx b 直接跳转(就没打开算返回)。...bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用。 bx跳转同时切换到ARM模式,一般用于异常处理的跳转

    2.6K30
    领券