第52部分- Linux x86 64位汇编基本内嵌汇编

用汇编语言去实现函数有如下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并不知道已经将寄存器内容修改了。尤其是在编译器对代码进行了一些优化的情况下而导致问题。编译器注意不到寄存器内容已经被改掉,程序将当作它没有被修改过而继续执行。所以尽量不要使用这些会产生附加影响的操作,或者当退出的时候还原这些操作。否则很可能会造成程序崩溃。