linux内核源码虽然是用C写的,不过其中有很多用嵌入式汇编直接操作底层硬件的“宏函数”,要想顺利的理解内核理论和具体实现逻辑,学会看嵌入式汇编是必修课,下面内容是学习过程中的笔记;当做回顾时的参考。

一、嵌入式汇编语法:

  1、格式

1        asm("汇编语句"    //"("之前用asm 或 __asm__   意为"()"的内容是汇编语句
2             :输出寄存器   
3             :输入寄存器
4             :会被修改的寄存器);

  除第一行以外,后面带冒号的行若不使用就都可一省略。

  输出寄存器:表示当这段嵌入汇编执行完之后,那些寄存器用于存放输出数据。这些寄存器会分别对应一C语言表达式值或一个内存地址;

  输入寄存器:表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一C变量或常数值;

  会被修改的寄存器:表示你已对其中列出的寄存器中的值进行了改动,gcc编译器不能再依赖于它原来对这些寄存器加载的值,如果必要的话,gcc需要重新加载这些寄存器。因此我们需要把那些没有在输出/输入寄存器中的部分列出,但是在汇编语句中明确使用到或隐含使用到的寄存器名列在这个部分。

  2、实例

 1 #define   get_seg_byte(seg,addr)  \
 2        ( {   \
 3          register  char  _res ;   \  //定义了一个寄存器变量——res
 4          _asm_("push     %%fs ;  \  //保存fs寄存器原值
 5                  mov       %%ax,%%fs ;    \    //用seg设置fs
 6                  movb     %%fs:%2,%%al ;     \  //取seg:addr处1字节内容到al寄存器
 7                  pop        %%fs "           \   //恢复fs寄存器原内容
 8                  : "=a"  (_res)          \
 9                  : "0"   (seg),   "m"  ( * (addr) ) ) ; \
10        _res ;  } )

  这段代码定义了一个嵌入式汇编语言函数。通常使用汇编语言最方便的方法是把他们放在一个宏内。用圆括号括住的组合语句(花括号中的语句)“({})”可以作为表达式使用,其中最后一行的变量_res是该表达式的输出值。因为宏语句需要定义在一行上,因此这里使用反斜杠“\”将这些语句连成一行。这条红第一将被替换到程序中引用改宏名称的地方。第一行定义了宏的名称,即宏函数名称get_seg_byte(seg,addr)。第三行定义了一个寄存器变量_res。该变量将被保存在一个寄存器中,以便快速访问和操作。如果想指定寄存器(如eax),那么我们可以把改句写成"register char _res asm("ax");",其中asm也可以写成_asm_。第四行上的_asm_表示嵌入式汇编语句的开始。第4-7行的4条语句是AT&T格式的汇编语句。另外,为了让gcc编译产生的汇编语言程序中寄存器名称前有一个百分号“%”,在嵌入汇编语句寄存器名称前就必须写上两个百分号“%%”。

  第8行即输出寄存器,该语句的含义是在这段代码运行结束后将eax所代表的的寄存器的值放入_res变量中,作为本函数的输出值,“=a”中的“a”称为加载代码,“=”表示这是输出寄存器,并且其中的值将被输出值替代。加载代码是CPU寄存器,内存地址以及一些数值的简写字母代号。第9行表示在这段代码开始运行时将seg放到eax寄存器中,“0”表示使用与上面相同位置上的输出寄存器。而((*addr))表示一个内存偏移地址值。为了在上面汇编语句中使用该地址值,嵌入式汇编程序规定把输出和输入寄存器按统一顺序编号,顺序是从输出寄存器序列从左到右从上到下以“%0”开始,分别记为%0、%1···%9.因此,输出寄存器的编号是%0(这里只有一个输出寄存器),输入寄存器前一部分(“0”(seg))的编号是%1,而后部分的编号是%2。上面第6行上的%2即代表(*(addr))这个内存偏移量。

  3、输入输出寄存器格式说明

  “0”表示使用与上面相同位置上的输出寄存器

  

  

  4、特别说明

  使用Intel CPU时, 当需要进行函数调用时,有以下原则:一、eax 、edx、ecx的内容必须由调用者自行保存;二、ebx、esi、edi得内容必须由被调函数保护,当被调这要使用这些寄存器中的任何一个时,要实现在自己的栈中保存其内容,因为调用者不负责管理;函数操作结束后再还原回去;另外ebp、esp的使用也要遵循第二原则。

转载于:https://www.cnblogs.com/zhangyi-studio/p/8025711.html

linux-0.11 内核源码学习笔记一(嵌入式汇编语法及使用)相关推荐

  1. LINUX 0.11内核完全剖析学习笔记-第三章内核编程语言和环境

    一.编译器 linux 0.11 集成了两种汇编器.一种是能产生16位代码的as86汇编器,使用配套的ld86链接器:另一种是GUN汇编器gas,使用GNU ld链接器俩链接产生的目标文件. 1.1 ...

  2. Linux 0.11内核分析02:系统启动

    目录 1. 内核镜像的构建 1.1 内核源码结构 1.1.1 boot 1.1.2 fs 1.1.3 include 1.1.4 init 1.1.5 kernel 1.1.6 lib 1.1.7 m ...

  3. 小米9开源linux内核,发布即开源:小米开源新机Mi 11内核源码

    小米已开源最近发布的新机小米 11 的源码,小米 11 系统内核基于 Android R,源码已更新至小米手机内核的 GitHub 仓库,代号为 venus-r-oss. 由于 Android 系统是 ...

  4. Linux 0.11内核分析01:概述

    目录 1. 什么是操作系统 1.1 计算机硬件组成 1.2 操作系统基本结构 2. 操作系统核心视图 2.1 多进程视图 2.1.1 操作系统的相关演变 2.1.2 核心思想 2.2 文件视图 2.2 ...

  5. Linux0.11内核源码解析-setup.s

    学习资料: Linux内核完全注释 操作系统真像还原 极客时间-Linux内核源码趣读 Linux0.11内核源码 ->setup程序将system模块从0x10000~0x8ffff整块向下移 ...

  6. Linux0.11内核源码解析-bootsect.s

    学习资料: Linux内核完全注释 操作系统真像还原 极客时间-Linux内核源码趣读 Linux0.11内核源码 ->上电 ->80x86架构CPU会自动进入实模式 ->从地址0x ...

  7. 雷神FFMpeg源码学习笔记

    雷神FFMpeg源码学习笔记 文章目录 雷神FFMpeg源码学习笔记 读取编码并依据编码初始化内容结构 每一帧的视频解码处理 读取编码并依据编码初始化内容结构 在开始编解码视频的时候首先第一步需要注册 ...

  8. Apache log4j-1.2.17源码学习笔记

    (1)Apache log4j-1.2.17源码学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78715500 (2)Apache l ...

  9. Java多线程之JUC包:Semaphore源码学习笔记

    若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...

最新文章

  1. 专访英特尔AIPG全球研究负责人Casimir Wierzynski:物理学、隐私和大脑将根本性塑造AI
  2. GNU C之__attribute__
  3. 一个原来知道却懵懂好久的道理2017-12-08
  4. 运行java是提示 选择未包含 main 类型 如何解决_RuoYi 若依 代码生成器使用教程...
  5. Sublime Text3 多行合并为一行
  6. matplotlib绘图_手把手教你使用Matplotlib绘图实战
  7. python装饰器性能_python装饰器的特性原理详解
  8. CSS3/ 弹性布局flex
  9. 为什么单击用户账户没有反应_win10用户获取最高权限的方法
  10. lambda python aws_AWS Lambda Layer For Python Pakage
  11. 将 datetimepicker 嵌入 bindingNavigator
  12. Android报错:The processing instruction target matching [xX][mM][lL] is not allowed.
  13. ai面试的优缺点_面试看脸?颜值低会不会被AI刷掉......
  14. 官方正式(简/繁/英/日/韩文) Windows XP sp3 下载
  15. java BBS论坛
  16. Win10找不到gpedit.msc|找不到本地组策略编辑器的解决方法
  17. 线扫描枪条码测试机程序,完整倍福PLC程序完整beckhoff倍福PLC ST 语言
  18. kol营销推广 | 达人营销,如何精准且快速找达人?
  19. 小技巧(1)「MacBook➕iPad」
  20. 达人评测 i5 12500h和锐龙r5 5600h选哪个好

热门文章

  1. Latex 中cite的使用
  2. poj2240 最短路判环
  3. strcpy函数的C/C++实现
  4. 持续集成商 Travis CI 爆严重漏洞,数千开源项目机密或被盗
  5. 对 *.google.com/* 产品进行大规模的 CSRFing 研究,意外获得3万美元奖金
  6. 五眼网络安全机构联合发布事件响应指南
  7. 美封锁对华半导体出口:14nm制造可以 X86设计不行
  8. struts2中的session使用
  9. [20151126]IMPDP TRANSFORM参数.TXT
  10. 排序算法系列之归并排序