NJU OS Note
一直以来被忽略的本科教学
ld
, GNU Linkergcc
支持对汇编代码的预编译(还会定义__ASSEMBLER__宏)。wget url
下载URL的文件内容。gcc -E foo.c
在预处理阶段后停止。volatile
声明的变量不能优化。asm
是GNU
的拓展。可以从汇编程序中读取和写入C变量。Extended asm
:1
2
3asm asm-qualifiers ( AssemblerTemplate
:OutputOperands
[:InputOperands[: Clobbers]])- Qualifier: volatile, inline, goto。
- AssemblerTemplate: 包含汇编程序指令的文字字符串。
- OutputOperands(允许使用空列表):
[[asmSymbolicName]] constraint(c_variablename)
,输出约束必须以=
作为开头, 常见的约束r
for register,m
for memory。约束后还需要有个C的变量名,括号是语法的必须部分。 - InputOperands(允许使用空列表)。
- eample
1
2
3
4
5
6
7int src = 1;
int dst;
asm ("mov %1, %0\n\t"
"add $1, %0"
: "=r" (dst)
: "r" (src)); - Clobbers:
memory
( Further, the compiler does not assume that any values read from memory before an asm remain unchanged after that asm;),Compiler barrier
.
strace
追踪当前程序或者进程执行过的系统调用。