学习总结,linux 内联汇编

来源:互联网 发布:网络信息安全书籍推荐 编辑:程序博客网 时间:2024/05/16 03:51

上学的时候,还喜欢偶尔用汇编写,到后来就越来越混乱,再到后来就感觉限制越来越多。一段时间都开始犹豫它能不能在应用程序中使用,听起来似乎很好笑,但就是那样,如果欠缺总结,当学得越多,反而越来越混乱。有时候都会将端口访问、汇编语言使用及操作系统运行级别搞得一团糟。而且感觉惰性越来越厉害。今天首先对以前混乱的认识进行下自我总结:

系统运行级别:重点在保护内核程序及对“外部设备”的使用权限问题;

汇编语言中涉及的资源:除了很少的CPU寄存器,大部分都不受特权级别的限制(否则,应用程序就没有意义了);

即在特权级别“3”中,不能访问任何设备及建立文件,这些设计外设和系统资源的操作必须通过系统调用来完成。


言归正传,今天因为一些原因,需要将DOS下的一段汇编程序导为linux的内联汇编,虽然代码不多,单确实费了好长时间,首先代码类似如下:


int main(void)

{

int val0 = 0,val1 = 0;

asm("movl %0,%%esi;\

  movl %1,%%ecx;"

::"m"(val0),"m"(val1) //输入变量,注意在低版本的GCC中,如果不是“m",而是“r",会出现编译不过的情况,高版本没有问题。

:"%esi","%ecx"      //涉及的寄存器

);

return 0;

}


注意:

asm(代码:输入变量(“=m”):输出变量(eg:"m"):涉及的寄存器),由“:”分开的几段都要有,如果没有变量就空着,如asm("代码:::)。


什么是学会呢?看再多书,等着手写的时候,还是感觉理解得不够,小小总结一下,越来越感觉自己需要学的还有很多、很多,加油吧,查漏补缺。


原创粉丝点击