操作系统学习之GCC内联汇编
作者:网络转载 发布时间:[ 2016/2/3 10:55:09 ] 推荐标签:GCC 操作系统
GCC内联汇编(INLINE ASSEMBLY)
什么是内联汇编(Inline assembly)?
1、这是GCC对C语言的扩张,是在C代码里面去写汇编代码
2、可以直接在C的语句中插入汇编指令
有何用处?
1、C语言不足以完成所有CPU的指令, 特别是有一些特权指令,比如加载gdt表(Global Descriptor Table 全局描述符表),从而使用汇编代码来完成
2、用汇编在C语言中手动优化,特别是在操作系统当中,使用汇编对操作系统的掌控更为,更加准确。
如何工作?
1、用给定的模板和约束来生成汇编指令
2、才C函数内形成汇编代码
下面一个小例子,简单看一下汇编代码和内联汇编的不同:
GCC内联汇编-Example 1
汇编代码 Assembly(*.S):
movl $0xffff, %eax //把0xffff给eax
内联汇编 Inline assembly(*.c):
asm("movl $0xffff, %%eax
") //1、加了一个内联汇编关键字asm,把汇编代码括起来然后用引号表示一个字符串 2、寄存器前变为%%
GCC内联汇编-语法
asm("assmbler template" //assmbler template是example 1 的那个字符串的内容(汇编语句)
:output operands (optional) //可选的输出操作数(输出寄存器)
:input operands (optional) //可选的输入操作数(输入寄存器)
:clobbers (optional) //会被修改的寄存器
);
GCC内联汇编-Example2
Inline assembly(*.c)
uint32_t cr0; //一个叫cr0的变量
asm volatile("movl %%cr0, %0
" :"=r"(cr0)); //把cr0里面的内容读到%0这个寄存器当中, =r这个寄存器的内容会赋给cr0这个变量(输出操作)
cr0 |= 0x80000000; //把某一个位设成1
asm volatile("movl %0, %%cr0
" ::"r"(cr0)); //再把cr0变量里的内容写回到cr0寄存器当中。把cr0给一个寄存器,然后这个寄存器再把他里面的内容赋给cr0寄存器(输入操作)
一些关键字的含义
volatile:No reordering; No elimination. 不需要进一步的优化,不需要进一步的调整顺序
%0 :The first constraint following. 第一个用到的寄存器
r :A constraint; GCC is free to use any register. 任意一个寄存器
上面的内联汇编所对应的汇编代码如下
Generated assembly code(*.s):
movl %cr0, %ebx //cr0 --> ebx
movl %ebx, 12(%esp) //ebx赋给一个局部变量12(%esp)
orl $-2147483648, 12(%esp) //或操作
movl 12(%esp), %eax //再给eax
movl %eax, %cr0 //再把eax寄存器里面的内容赋给cr0
GCC内联汇编-Example3
Inline assembly(*.c)
long _res, arg1 = 2, arg2 = 22, arg3 = 222, arg4 = 233;
_asm_volatile("int $0x80"
:"=a"(_res)
:"0"(11), "b"(arg1), "c"(arg2), "d"(arg3), "S"(arg4)); //把arg1给ebx, arg2给ecx,arg3给edx, arg4给esi
在内联汇编当中
a = %eax, b = %ebx, c = %ecx, d = %edx, S = %esi, D = %edi, 0 = same as the first 第一个出现的寄存器
Generated assembly code(*.s):
mov $11, %eax
movl-28(%ebp), %ebx
movl-24(%ebp), %ecx
movl-20(%ebp), %edx
movl-16(%ebp), %esi
int $0x80
movl %edi, -12(%ebp)
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11