dsi*_*cha 6 c assembly conventions inline-assembly low-level
将内联汇编程序插入到类似C语言的函数中时,关于允许哪些寄存器用于临时的约定是什么?编译器是否有责任在进入asm块之前保存需要保存的所有寄存器的值?程序员是否有责任将值存储在这些寄存器中并在退出asm块之前恢复它们?是否有典型的约定,或者这是特定于实现的?
这是特定于编译器的.但是,对于一个现实的例子,让我们在x86上使用gcc.格式为:
asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers (optional)
);
Run Code Online (Sandbox Code Playgroud)
在"命令寄存器列表"中,您告诉编译器您的代码正在使用哪些寄存器.
这是一个简单的内存复制代码:
asm ("movl $count, %%ecx;
up: lodsl;
stosl;
loop up;"
: /* no output */
:"S"(src), "D"(dst) /* input */
:"%ecx", "%eax" ); /* clobbered list */
Run Code Online (Sandbox Code Playgroud)
鉴于这些方向,gcc将不会将eax和ecx用于块中的其他内容.
更多信息在这里.