我是靠谱客的博主 敏感皮皮虾,最近开发中收集的这篇文章主要介绍linux 内核 汇编,linux内核中的内嵌汇编代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

>>使用汇编代码的几点原因:

1)直接和硬件打交道,需要用到的指令,C语言没有对应的语句.例如386系列中的inb和outb.对寄存器的操作也只能用汇编.----C中有inb和outb

2)CPU中一些特殊指令也没有对应的C语句,如关中断开中断等.新的CPU可能增加新的指令,对这些指令的使用也只能用汇编.

3)例如系统调用的进入/退出(INT 0X80)这种被使用频繁的语句,用汇编写.同时这个也没有对应的C语句.

>>嵌入C代码中的386汇编

1)一般格式: 指令部:输出部:输入部:损坏部

2)汇编操作数如何与C变量结合:??

|

|--->程序员提供具体指令,对寄存器的使用只提供“样板”和约束条件,如何与变量结合留 给gcc和gas处理:

|

|-->在指令部中,用%0、%1等表示要使用寄存器的样板操作数。

--->gcc和gas在编译和汇编时根据后面的约束条件自己变通处理。

3)输出部:规定输出变量,即目标操作数怎样结合。

4)输入部:

5)损坏部:有些操作中,寄存器原有内容损坏了,要对操作的副作用加以说明。

>>例子

static inline void* __memcpy(void* to, const void* from, size_t n) {

int d0, d1, d2;

__asm__ __volatile__(

"rep; movslnt"

//rep 表示下一条指令movsl要重复执行,直到ecx寄存器的内容到0----rep和ecx寄存器关联????? //movsl表示从esi所指地方复制长字到edi所指地方,并使esi和edi分别加4。 ----这一行执行完毕,所有长字以复制好,最多只剩下3个字节了。

//这一行,实际使用ecx、esi和edi寄存器,即%0(也是%3)、%2(也是%6)、%1(%5)三个操作数,这些隐藏在指令中。

-------------------以下的是处理剩下的三个字节--------------

"testb $2, %b4nt"

"je 1fnt"

"movswn"

"l:ttestb $1, %b4nt"

"je 2fnt"

"movsbn"

"2:"

: "=&c" (d0), "=&D" (d1), "=&S" (d2)

:"0" (n/4), "q"(n), "1"((long)to), "2" ((long)from)

:"memory");

return (to);

}

最后

以上就是敏感皮皮虾为你收集整理的linux 内核 汇编,linux内核中的内嵌汇编代码的全部内容,希望文章能够帮你解决linux 内核 汇编,linux内核中的内嵌汇编代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部