mini-os-2
这是第四章的补充知识
尚未完成啊啊啊
GNU C 内嵌汇编语言
- __asm__ 关键字:用于声明这行代码是一个内嵌汇编的表达式
- __volatile__ 关键字:其作用是告诉编译器此行代码不能被编译器优化,编译时保持代码原状。否则经过编译器优化后,汇编语句很可能被修改以至于不能达到预期的效果。
内嵌汇编表达式
GNU C 语言的内嵌汇编表达式由四个部分组成,它们之间使用 “:” 号分隔,其完整的格式为:指令部分:输出部分:输入部分:损坏部分
指令部分
汇编代码本身,其书写格式与 AT&T 汇编语言程序的格式基本相同,但有些微变化:
- 当指令表达式中存在多条汇编代码的时候,可以全部书写在一对双引号中;亦可将汇编代码放在多对双引号中。如果将所有指令编写放在同一双引号中,那么相邻两条指令之间必须使用分号(;)或者换行符(\n)分隔,如果使用了换行符那么通常还会跟一个制表符(\t)。当汇编代码引用寄存器时,必须在寄存器名前再加上一个 % 符,以表示对寄存器的引用,例如代码
"movl $0x10, %%eax"
输出部分
记录指令的部分的输出信息,其格式为:“输出操作约束”(输出表达式),输出操作约束"(输出表达式), …。格式中的输出操作约束和输出表达式成对出现,每部分之间用逗号(,)分割。
- 输出表达式部分主要负责保存指令部分的执行结果,通常情况下输出表达式是一个变量。
- 双引号内的部分,被称为输出操作约束,输出约束必须用等号和加号修饰,等号表示这是一个纯粹的输出的标识,加号表示既用于输出也用于输入。不论加号还是等号,都只能用在输出部分,不能用在输入部分。
输入部分
记录指令部分的输入信息,其格式 “输出操作约束”(输出表达式),输出操作约束"(输出表达式), …。同样成对出现,但输入操作约束中不允许使用等号和加号,因此输入部分都是只读。
损坏部分
描述了在指令部分执行的过程中,将被修改的寄存器,内存空间或标志寄存器,并且这些修改部分并未在输出部分和输入部分出现过,格式为 “损坏描述”, “损坏描述”,…,如果要声明多个寄存器,则需要逗号隔开。