2022年嵌入式汇编 .pdf
《2022年嵌入式汇编 .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式汇编 .pdf(3页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本节是第一次在内核源程序中接触到C 语言中的嵌入式汇编代码。由于我们在通常的C 语言程序的编制过程中一般是不会使用嵌入式汇编程序的,因此这里有必要对其基本格式进行简单的描述, 详细的说明可参见GNU gcc手册中 5 第 4 章的内容 (Extensions to the C Language Family) ,或见参考文献20 (Using Inline Assembly with gcc) 。具有输入和输出参数的嵌入汇编的基本格式为:asm( “ 汇编语句 ” : 输出寄存器 : 输入寄存器 : 会被修改的寄存器); 其中, “ 汇编语句 ” 是你写汇编指令的地方;“ 输出寄存器 ” 表示
2、当这段嵌入汇编执行完之后,哪些寄存器用于存放输出数据。此地,这些寄存器会分别对应一C 语言表达式或一个内存地址; “ 输入寄存器 ” 表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一C 变量或常数值。下面我们用例子来说明嵌入汇编语句的使用方法。我们在下面列出了前面代码中第22 行开始的一段代码作为例子来详细解说,为了能看清楚我们将这段代码进行了重新编排和编号。01 #define get_seg_byte(seg,addr) 02 ( 03 register char _res; 04 _asm_(push %fs; 05 mov %ax,%fs; 06 mo
3、vb %fs:%2,%al; 07 pop %fs 08 :=a (_res) 09 : (seg),m (*(addr); 10 _res;) 这段 10 行代码定义了一个嵌入汇编语言宏函数。因为是宏语句,需要在一行上定义,因此这里使用反斜杠 将这些语句连成一行。这条宏定义将被替换到宏名称在程序中被引用的地方。第1 行定义了宏的名称,也即是宏函数名称get_seg_byte(seg,addr)。第 3 行定义了一个寄存器变量_res 。第 4 行上的 _asm_表示嵌入汇编语句的开始。从第4行到第 7 行的 4 条 AT&T 格式的汇编语句。第 8 行即是输出寄存器,这句的含义是在这段代码运
4、行结束后将eax 所代表的寄存器的值放入 _res变量中,作为本函数的输出值,=a中的 a 称为加载代码,= 表示这是输出寄存器。第9 行表示在这段代码开始运行时将seg 放到 eax 寄存器中, 表示使用与上面同个位置的输出相同的寄存器。而(* (addr)表示一个内存偏移地址值。为了在上面汇编语句中使用该地址值,嵌入汇编程序规定把输出和输入寄存器统一按顺序编号,顺序是从输出寄存器序列从左到右从上到下以%0开始,分别记为%0 、%1 、%9 。因此,输出寄存器的编号是%0 (这里只有一个输出寄存器),输入寄存器前一部分( (seg)的编号是 %1 ,而后部分的编号是%2 。上面第 6 行上的
5、 %2 即代表 (*(addr)这个内存偏移量。现在我们来研究4 7 行上的代码的作用。第一句将fs 段寄存器的内容入栈;第二句将 eax 中的段值赋给fs 段寄存器;第三句是把fs:(*(addr)所指定的字节放入al 寄存器中。当执行完汇编语句后,输出寄存器eax 的值将被放入 _res ,作为该宏函数的返回值。很简单,不是吗?通过上面分析, 我们知道, 宏名称中的seg 代表一指定的内存段值,而 addr表示一内名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年嵌入式汇编 2022 嵌入式 汇编
限制150内