嵌入式汇编简述
具有输入和输出参数的嵌入汇编的基本格式为:
asm(“汇编语句”
: 输出寄存器
: 输入寄存器
: 会被修改的寄存器 );
在执行代码时,如果不希望汇编语句被gcc 优化而挪动地方,就需要在asm 符号后面添加volatile 关键词: asm volatile (……);
或者更详细的说明为: __asm__ __volatile__ (……);
如:
01 asm("cld\n\t"
02 "rep\n\t"
03 "stol"
04 : /* 没有输出寄存器 */
05 : "c"(count-1), "a"(fill_value), "D"(dest)
06 : "%ecx", "%edi");
1-3 行这三句是通常的汇编语句,用以清方向位,重复保存值。第4 行说明这段嵌入汇编程序没有用到输出寄存器。第5 行的含义是:将count-1 的值加载到ecx 寄存器中(加载代码是"c"),fill_value加载到eax 中,dest 放到edi 中。为什么要让gcc 编译程序去做这样的寄存器值的加载,而不让我们自己做呢?因为gcc 在它进行寄存器分配时可以进行某些优化工作。例如fill_value 值可能已经在eax中。如果是在一个循环语句中的话,gcc 就可能在整个循环操作中保留eax,这样就可以在每次循环中少用一个movl 语句。最后一行的作用是告诉gcc 这些寄存器中的值已经改变了。