用汇编语言去实现函数有如下3种选择。
- 从头开始编写汇编语言代码来实现函数,然后C程序来调用
- 使用-S创建C代码的汇编版本,然后修改汇编语言代码,然后连接汇编语言代码生成可执行文件
- 在原始的C代码内创建函数的湖边语言代码,然后使用标准C编译器编译
第二种是优化使用。
第三种就是内联汇编。
仅仅实现汇编语言代码不能说并不能完成很多任务,需要把数据进行传递进出。
基本的内联汇编代码可以利用应用程序中定义的全局变量。这里是管局的变量。
基本内联汇编
基本内联汇编格式比较直观,可以直接这样写:
asm("assembly code");
例如:
asm("movl %rcx, %rax"); /* 把 rcx 内容移动到 rax */
__asm__("movb %bh , (%eax)"); /* 把bh中一个字节的内容移动到eax指向的内存 */
两个不同的关键字 asm 和__asm__。这两个关键字都可以使用。不过当遇到asm关键字与程序其他变量有冲突的时候就必须用__asm__了
内联汇编有多条指令,则每行要加上双引号,并且该行要以\n\t结尾。因为GCC会将每行指令作为一个字符串传给as(GAS),使用换行和TAB可以将正确且格式良好的代码行传递给汇编器。
如果在内联代码中操作了一些寄存器,比如修改了寄存器内容(而之后也没有进行还原操作),程序很可能会产生一些难以预料的情况。因为GCC并不知道已经将寄存器内容修改了。尤其是在编译器对代码进行了一些优化的情况下而导致问题。编译器注意不到寄存器内容已经被改掉,程序将当作它没有被修改过而继续执行。所以尽量不要使用这些会产生附加影响的操作,或者当退出的时候还原这些操作。否则很可能会造成程序崩溃。