mov ax,bx
將bx暫存器中的資料複製移動到ax中
add ax,bx
執行ax+bx運算,將運算結果賦值給ax,即ax =ax+bx;
sub ax,bx
執行ax-bx運算,將運算結果賦值給ax,即ax = ax-bx;
inc ax
執行 ax+1 運算,將運算結果賦值給ax,即ax =ax+1 ;
jmp
1000:0或 jmp
1000
第一種方式:設定cs(指令存放段位址)為1000,設定ip(指令存放位址偏移量)為0.
第二種方式:設定ip(指令存放位址偏移量)為1000.
push指令執行步驟:
sp = sp-2
向ss:sp指向的字單元中送入資料
pop指令執行步驟:
從ss:sp指向的字單元中讀取資料
sp = sp+2
舉例說明
//下面描述了向乙個10000h~1000fh這段空間當作棧,進行了入棧出棧操作。
//初始化棧的段位址和位址偏移量
mov ax,1000
mov ss,ax
mov sp,0010
//設定資料
mov ax,001a
mov bx,001b
//入棧
push ax
push bx
//清零
sub ax,ax
sub bx,bx
//出棧
pop bx
pop ax
介紹完了指令,下面我們來介紹如何編寫,編譯,鏈結,執行乙個匯程式設計序吧。
開啟文字編輯器,編寫下面文字,儲存為.asm
型別的檔案。之後,我們用test.asm
檔案舉例。
assume cs:abe
abe segment
mov ax,2h
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
abe ends
end
知識點介紹:segment …ends
segment ...ends
為成對使用的定義段的偽指令。在編譯的時候,被編譯器翻譯為乙個段。這裡面的段和我們之前提到的記憶體中的段是乙個道理。segment
表示段的開始,ends
表示段的結束,乙個匯程式設計序是由多個段組成的,這些段被用來存放**,資料,堆疊來使用。
abe
為段的名字,我們叫它標號,乙個標號代表乙個位址。
endend
是乙個匯程式設計序的結束標記,編輯器在編譯匯程式設計序的過程中,如果碰到了偽指令end
,就結束對匯程式設計序的編譯,即編譯結束。
assume
assume
這條指令,假設某一段暫存器和程式中的某乙個segment... ends
定義的段相關聯。通過assume說明這種關聯,在需要的情況下可以將段暫存器和某乙個具體的段相關聯。
程式結束符號
下面這兩行**表示結束程式。
mov ax,2c00h
int21h
我使用的是masm 5.0,來編譯檔案。編譯,就是將我們之前編寫的**,程式設計機器可讀的機器碼。通過編譯,我們將編輯檔案,編譯成了目標檔案。(test.asm -> test.obj)
下面是執行:
我使用的是overlay linker3.60,通過連線,我們將編譯生成的目標檔案連線成可執行檔案。(test.obj -> test.exe)
下面是執行:
輸入下面命令列即可:
組合語言程式vs 匯程式設計序
組成原理 這是個常常被人拿來挖坑的地方。組合語言程式就是你用組合語言寫的文字型的程式,我們說用一堆助記符來寫的源 匯程式設計序是彙編階段用來把組合語言翻譯成機器語言指令的程式。二者是不同的概念。比如有些時候問,計算機能夠直接執行的是 a.機器語言程式 b.組合語言程式 c.硬體描述語言程式 組合語言...
組合語言03 第乙個匯程式設計序
整理自魚c論壇課件 匯程式設計序編寫步驟 編寫源 使用masm.exe進行編譯,產生目標檔案 用link.exe,對目標檔案進行鏈結,生成可執行檔案 可執行檔案中包含兩部分內容 1,程式和資料 2,相關的描述資訊 程式有多大,要占用多少記憶體空間等 源程式 assume cs abc abc seg...
匯程式設計序 退出
作為第乙個匯程式設計序,本程式除了退出以外,並沒有執行其他的功能。目的 退出並向linux核心返回乙個狀態碼的簡單程式 輸入 無 輸出 返回乙個狀態碼.在執行程式後可通過輸入echo 來讀取狀態碼 變數 eax儲存系統呼叫號 ebx儲存返回狀態 section data section text g...