AT&T ASM 學習3
.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位)