内核bug.h以及GCC内联汇编的学习

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45096245 所有的学习的内容都在注释当中,我的学习过程是,看到这个代码段之后,将其中需要的只是去大体的学习一遍。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45096245

所有的学习的内容都在注释当中,我的学习过程是,看到这个代码段之后,将其中需要的只是去大体的学习一遍。争取能够做到理解整体的部分。
下面展示出我的学习的代码:

#ifndef _I386_BUG_H
#define _I386_BUG_H


/*
 * Tell the user there is some problem.
 * 告诉用户出现了一些问题
 * The offending file and line are encoded after the "officially 
 * undefined" opcode for parsing in the trap handler.
 *
 * 有问题的文件和行被编码在“官方未定义”操作码之后,为了能够在陷阱
 * 处理程序中被解析。
 */

/**
 * 1:__asm__:gcc内联汇编的方式
 *    gcc内联汇编的通用方式是:
 *   内嵌汇编语法: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)
 *   共四个部分所组成:汇编语句模板,输出部分,输入部分,破坏描述部分,
 *   各部分使用“:”格开,汇编语句模板必不可少, 其他三部分可选,
 *   如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空   
 * 
 * 2:ud2指令是一种让CPU产生invalid opcode exception的软件指令,
 *    内核发现CPU出现这个异常,会立即停止运行
 * 3:__volatile__告诉编译器,现在所写的没一条指令都是不可变的,包括顺序,
 *    如果不带__volatile__的话,如果在使用gcc编译的过程中,使用了优化选型-O,
 *    则编译器就会根据自己的优化规则对代码进行优化
 * 4:下面带上内联之后可能看的不太清楚,这样,光看汇编指令:
 * ud2 ;
 * .word %c0 ;
 * .long %c1 ;
 * : : "i" (__LINE__),"i" (__FILE__) ;
 *
 * 从上面的代码上可以看出:
 * ud2;指令,使CPU停止运行
 * .word %c0;指定占位符%c0位置是一个字
 * .long %c1;指定占位符%c1位置是一个long整数
 * : : ;省略中间的输出部分
 * "i" (__LINE__),"i" (__FILE__)分别用(__LINE__)和(__FILE__)
 * 去替换占位符%c0,%c1,其中"i"指明使用一个整数类型的立即数
 *
 * 5:下面是一些寄存器约束的缩写
 * r:I/O,表示使用一个通用寄存器,由GCC在%eax/%ax/%al%ebx/%bx/%bl%ecx/%cx/%cl%edx/%dx/%dl中选取一个GCC认为是合适的;
 * q:I/O,表示使用一个通用寄存器,与r的意义相同;
 * g:I/O,表示使用寄存器或内存地址;
 * m:I/O,表示使用内存地址;
 * a:I/O,表示使用%eax/%ax/%al;
 * b:I/O,表示使用%ebx/%bx/%bl;
 * c:I/O,表示使用%ecx/%cx/%cl;
 * d:I/O,表示使用%edx/%dx/%dl;
 * D:I/O,表示使用%edi/%di;
 * S:I/O,表示使用%esi/%si;
 * f:I/O,表示使用浮点寄存器;
 * t:I/O,表示使用第一个浮点寄存器;
 * u:I/O,表示使用第二个浮点寄存器;
 * A:I/O,表示把%eax%edx组合成一个64位的整数值;
 * o:I/O,表示使用一个内存位置的偏移量;
 * V:I/O,表示仅仅使用一个直接内存位置;
 * i:I/O,表示使用一个整数类型的立即数;
 * n:I/O,表示使用一个带有已知整数值的立即数;
 * F:I/O,表示使用一个浮点类型的立即数;
 *
 *
 *
 */
#ifdef CONFIG_BUG
#define HAVE_ARCH_BUG
#ifdef CONFIG_DEBUG_BUGVERBOSE
#define BUG()               \
 __asm__ __volatile__(  "ud2\n"     \
            "\t.word %c0\n" \
            "\t.long %c1\n" \
             : : "i" (__LINE__), "i" (__FILE__))
#else
#define BUG() __asm__ __volatile__("ud2\n")   //直接使CPU停止运行
#endif
#endif

#include <asm-generic/bug.h>
#endif

在GCC内联汇编的过程中,看到GCC只支持AT&T汇编语言,其中了解到一些有关于AT&T汇编语言的特性。由于之前学习过X86汇编,发现有很多的不同。通过看一篇文章,对其进行了一个大体的总结,还是比较有价值的。
AT&T与intel汇编的比较

目录
相关文章
|
6月前
|
编译器 Linux 开发工具
|
3月前
|
存储 算法 NoSQL
天呐!汇编语言竟如此神奇,从零到精通的学习指南带你开启计算机世界神秘大门!
【8月更文挑战第31天】汇编语言是一种底层编程语言,直接与硬件交互,对于理解计算机体系结构和底层原理至关重要。尽管现代软件开发中较少使用,但学习汇编语言有助于深入了解计算机如何执行指令、管理内存和处理数据,从而优化程序性能,进行底层系统开发和调试。不同处理器有不同指令集,如 x86 和 ARM,掌握这些指令集及寄存器、内存地址等基本概念是学习汇编语言的基础。通过简单示例开始,逐步掌握复杂指令和调试工具,可以大大提高编程技能和解决问题的能力。
68 1
|
3月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
1月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
63 11
|
1月前
|
存储 Go
汇编语言的学习
本文详细介绍了在DOSBox中学习汇编语言的基础知识,包括寄存器的使用、数据和指令的选取、栈的操作、段地址的计算以及如何编写和执行简单的汇编程序。
19 0
汇编语言的学习
|
3月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
36 4
|
3月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
91 0
|
5月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
|
5月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
162 0
|
5月前
|
程序员 索引
逆向学习汇编篇:内存管理与寻址方式
逆向学习汇编篇:内存管理与寻址方式
52 0