操作系统学习

Posted 牛刀杀鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统学习相关的知识,希望对你有一定的参考价值。

一.先行课程

1.C/C++语言

1-1.static 静态变量、函数:http://c.biancheng.net/view/3...

1-2.inline 内联函数 http://c.biancheng.net/view/1...

2.gcc编译内联汇编

2-1.内嵌汇编语法如下:

__asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)

“asm”表示后面的代码为汇编代码,__asm__ 是 asm的别名。
“volatile”告诉gcc编译器不要进行代码优化,后面的代码保持原样。

2-2.汇编语言模板:

模板语句由汇编语言序列组成,汇编语句间使用";"、"\\n"、"\\n\\t"进行分隔。
指令中的操作数可以使用占位符引用C语言变量,占位符最多有10个,名称是0%、...9%。
指令中占位符表示操作数,总是被当做long类型(4字节);但也可以显示的控制其,"b"表示低字节,如%b1,"h"表示高字节,如%h1.

2-3.输出部分:

输出部分描述输出操作数,不同的操作数之间用 "," 隔开,每个操作数描述符由限定字符串和C语言变量组成。
每个输出操作数的限定字符串必须包含"="表示他是一个输出操作数。
描述符字符串表示对该操作数的限制,这样gcc编译器可以根据限制决定如何分配寄存器,如何产生必要的代码将占位符与C语言或C语言变量联系起来。

2-4.输入部分:

输入部分描述输入操作数,不同的操作数描述符之间使用逗号格开,每个操作数描述符由限定字符串和C语言表达式或者C语言变量组成。

2-5.破坏描述符:

破坏描述符用于通知编译器我们使用了哪些寄存器或内存,由逗号格开的字符串组成,每个字符串描述一种情况,一般是寄存器名;除寄存器外还有"memory"。
例如:"%eax","%ebx","memory"等。

2-6.限定符表:

分类限定符描述
通用寄存器“a”将输入变量放入eax
“b”将输入变量放入ebx
“c”将输入变量放入ecx
“d”将输入变量放入edx
“s”将输入变量放入esi
“d”将输入变量放入edi
“q”将输入变量放入eax,ebx,ecx,edx中的一个
“r”将输入变量放入通用寄存器,也就是eax,ebx,ecx,edx,esi,edi中的一个
"A"把eax和edx合成一个64 位的寄存器(use long longs)
内存“m”内存变量
“o”操作数为内存变量,但是其寻址方式是偏移量类型, 也即是基址寻址,或者是基址加变址寻址
“V”操作数为内存变量,但寻址方式不是偏移量类型
" "操作数为内存变量,但寻址方式为自动增量
“p”操作数是一个合法的内存地址(指针)
寄存器或内存“g”将输入变量放入eax,ebx,ecx,edx中的一个 或者作为内存变量
“X”操作数可以是任何类型
立即数“I”0-31之间的立即数(用于32位移位指令)
“J”0-63之间的立即数(用于64位移位指令)
“N”0-255之间的立即数(用于out指令)
“i”立即数
“n”立即数,有些系统不支持除字以外的立即数, 这些系统应该使用"n"而不是"i"
匹配" 0 "表示用它限制的操作数与某个指定的操作数匹配
“1”也即该操作数就是指定的那个操作数,例如"0"
“9”去描述"%1"操作数,那么"%1"引用的其实就是"%0"操作数,注意作为限定符字母的0-9 与 指令中的"%0"-"%9"的区别,前者描述操作数,后者代表操作数。
&;该输出操作数不能使用过和输入操作数相同的寄存器
操作数类型“=”操作数在指令中是只写的(输出操作数)
“+”操作数在指令中是读写类型的(输入输出操作数)
浮点数“f”浮点寄存器
“t”第一个浮点寄存器
“u”第二个浮点寄存器
“G”标准的80387浮点常数
%该操作数可以和下一个操作数交换位置,例如addl的两个操作数可以交换顺序 (当然两个操作数都不能是立即数)
#部分注释,从该字符到其后的逗号之间所有字母被忽略
*表示如果选用寄存器,则其后的字母被忽略

3.x86汇编语言

3-1.汇编语言表

https://www.cnblogs.com/lsgxe...

以上是关于操作系统学习的主要内容,如果未能解决你的问题,请参考以下文章

java SpringRetry学习的代码片段

python 机器学习有用的代码片段

线程学习知识点总结

学习 PyQt5。在我的代码片段中找不到错误 [关闭]

PHP必用代码片段

VSCode自定义代码片段——git命令操作一个完整流程