1. 程式人生 > >AT&T ASM 學習3

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位)