.section -->
.data
.rodata(只读)
----------------------------------------
.ascii
.asciz
.byte 8位
.short 16位
.int 32位
.long 32位
.quad 8字节
.octa 16字节
.single 32位
.float 32位
.double 64位
----------------------------------------
output:
.asciz "The processor Vendor ID is '%s'/n"
sizes:
.long 100,150,200,250,300 #数组
----------------------------------------
.equ factor,3 #预定义,等价于#define factor 3
.equ LINUX_SYS_CALL,0x80
----------------------------------------
.section .bss
.comm buffer,10 #10字节
.lcomm #local
----------------------------------------
.section .data
buffer1:
.fill 10000 #10000个字节,用0填充 #这10000个字节会使可执行文件增大至少10000个字节
.section .bss
.lcomm buffer2,10000 #这10000个字节会使可执行文件增大很少的字节(大概23个字节), 程序加载后再申请10000字节空间
.section .text
.globl _start
_start:
movl $1,%eax
movl $0,%ebx
int $0x80
----------------------------------------
mov 与intel汇编格式相反
movb 8
movw 16
movl 32
movq 64
movsx
----------------------------------------
X86指令不允许同时直接操作两个内存中的数。
----------------------------------------
.section .data
value:
.int 1
.section .text
.globl _start
_start:
movl value,%ecx 编译后 --> movl 0xXXXXXXXX,%ecx #把存储的值给了ecx
movl %ecx,value 编译后 --> movl %ecx,0xXXXXXXXX #把ecx的值存储在了value所在的位置
movl $1,%eax
movl $0,%ebx
int $0x80
----------------------------------------
base_address(offset_address,index,size) #如果其中的任何值为0,可不写;
==base_address+offset_address+index*size #offset_address和index的值必须是寄存器;
movl $2, %edi
movl values(,%edi,4),%eax #把values+8开始的数据放到 eax
----------------------------------------
movl $values,%edi --> movl $0xXXXXXXXX,%edi
movl %ebx,(%edi) #(%edi)取edi中的值,此时等价于一个地址
----------------------------------------
echo $? #查看上一个程序执行后的返回码(ebx中的值)
----------------------------------------
变量的标签只是一个地址,编译时会用这个地址替换掉代码中标签出现的地方
----------------------------------------
条件传送指令可以避免处理器执行JMP指令,这有助于处理器的预取缓存状态,通常能提高应用程序的速度。
cmov
无符号条件传送指令依靠CF(进位标志)ZF(零标志)PF(奇偶标志)来判断
有符号条件传送指令依靠SF(符号标志)ZF(零标志)OF(溢出标志)来判断
----------------------------------------
cmp a,b # b-a ; a和b可以是寄存器或存储器地址,但不能同时为存储器地址,a还可以为立即数,但b不能为立即数。
----------------------------------------
数据交换指令
XCHG 交换值。操作数是内存时,处理器的LOCK信号被自动标明,LOCK操作很耗费时间
BSWAP 反转字节顺序
XADD 交换并相加
CMPXCHG 比较和交换
CMPXCHG8B 比较和交换(64位)