部分彙編總結

2021-09-24 02:17:45 字數 2091 閱讀 8042

源程式編譯成程式

彙編源程式:分為偽指令(編譯器處理)和彙編指令(編譯為機器碼)

程式:源程式中最終由計算機執行、處理的指令或資料

程式最先以組合語言的形式存在於源程式中,經編譯、連線後轉變為機器碼,儲存可執行檔案中

資料格式

大多數gcc生成的彙編**指令都有乙個字元的字尾,表明運算元的大小。

資料傳送指令有四個變種:

movb:傳送位元組

movw:傳送字

movl:傳送雙字

movq:傳送四字

運算元指示符:

基本語法

記憶體定址在指令中可以表示成如下的通用格式:

address_or_offset(%base_or_offset,%index,multiplier)

它所表示的位址可以這樣計算出來:

目標位址 = address_or_offset + base_or_offset + multiplier * index

其中address_or_offset和multiplier必須是常數,base_or_offset和index必須是暫存器。在有些定址方式中會省略這4項中的某些項,相當於這些項是0。

1.直接定址

根據以上公式,只使用address_or_offset定址,例如movl address,

%eax把address位址處的32位數傳送到eax暫存器。

2.變址定址

movl data_items(,%edi,4), %eax就屬於這種方式,用於訪問陣列很方便。

3.間接定址

只使用base_or_offset定址,例如movl (%eax),

%ebx,把eax暫存器的值看作位址,把這個位址處的32位數傳送到ebx暫存器。

4.基址定址

只使用address_or_offset和base_or_offset定址,例如movl 4(%eax),

%ebx,用於訪問結構體成員比較方便,例如乙個結構體的基位址儲存在eax暫存器中,其中乙個成員在結構體內偏移量是4位元組,要把這個成員讀上來就可以用這條指令。

5.立即數定址

就是指令中有乙個運算元是立即數,例:movl $3, %eax。

6.暫存器定址

就是指令中有乙個運算元是暫存器。在匯程式設計序中暫存器用助記符來表示,在機器指令中則要用幾個bit表示暫存器的編號,這幾個bit與可以看做暫存器的位址,但是和記憶體位址不在乙個位址空間。

壓棧和出棧:

壓棧:subq $8,%rsp

movq %rbp,(%rsp)

出棧:movq (%rsp),%rax

addq $8,%rsp

算術和邏輯操作:

彙編部分部分指令

cbw 位元組轉換為字指令執行的操作 al的內容擴充套件到ah,形成ax中的字。int xxh int 21h 呼叫 int 21h 中斷,百返回值放在 al暫存器中從鍵盤輸入,並以16進製制儲存通過給ah暫存器賦值,然後呼叫int 21h指令,計算機就會根據ah暫存器度中的版值執行相應的操作,權其...

彙編指令總結

連續第1天總結 筆記 於 組合語言 王爽著,主要對平常用到的彙編中暫存器和指令進行總結 暫存器進行資訊儲存 通俗的理解為 變數 cpu中的 8086cpu有14個暫存器 ax bx cx dx si di ip sp bp cs ds ss es psw 通用暫存器 ax,bx,cx,dx 這4個暫...

彙編定址總結

segment offset 段基位址 segment 16 或segment 4 段基位址 offset 實體地址 segment此時為選擇子,在gdt或ldt裡選擇一項,此項稱為段描述符,裡面記錄著段基位址 段基位址 offset 線性位址 實體地址 意義 1 增大位址訪問的界限 2 保護作用 ...