movx source, destination
source 和 destination 的值可以是内存地址,存储在内存中的数据值,指令语句中定义的数据值,或者是寄存器。
GNU汇编器为mov指令添加了一个维度,在其中必须声明要传送的数据元素的长度。通过把一个附加字符添加到mov助记符来声明这个长度。因此指令就变成了如下:
movx
其中 x 可以是下面的字符:l 用于32位的长字值,w用于16位的字值,b用于8位的字节值
movl %eax, %ebx #把32位的EAX寄存器传送給32位的EBX寄存器值
movw %ax, %bx
movb %al, %lx
neg 求补指令,把他之后的操作数求补(先求反再加1)
GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编。这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写C/C++代码中使用汇编编写简洁高效的代码。
基本内联汇编
GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子:
__asm__("movl %esp, %eas");
1 __asm__
__asm__是GCC关键字asm的宏定义:
#define __asm__ asm
__asm__或 asm用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开关的,是必不可少的。
2 instruction list
instruction list 是汇编指令序列。它可以是空的,比如: __asm__ __violate__(""); 或 __asm__(""); 都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有Instruction list 为空的内联汇编表达式都是没有意义的,比如:__asm__("":::"memory");就非常有意义,它向GCC表明:"我对内存作了改动",GCC在编译的时候,会将此因素考虑进去。