第乙個程式「hello world」,使用記事本編寫**如下,並儲存為hello.asm:
; hello.asm,hello word第乙個masm彙編**。
assume cs:code
code segment
db 'hello world', '$'
start:
mov ax, code
mov ds, ax
mov dx, 0
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
code ends
end start
說明如下:
masm中單行注釋是以「;」符號開頭。
masm彙編中不區分大小寫。
assume偽指令將段和段暫存器關聯起來。
code segment
和code ends
指明乙個段的開始和結束, segment是關鍵字,code是名稱可以自己取。
db
關鍵字是masm中的關鍵字,用來指定後面跟著的內容是以位元組為單位存放,後面可以跟字串,也可以跟數字,如:db 12h, a8h, 'h', 'l', 'aaa', 0
。除db
外,還有dw
,dd
等分別表示字(word)或者雙字(double word)。
mov ax, code
是將code段位址傳送到ax暫存器中,masm中段名稱代表了該段的段位址。
int 21h
是呼叫了dos中斷,dos中斷可以看成是dos系統提供給程式編寫者的庫函式,本例中使用了dos 21h中斷的兩個子功能。
7.1、21h中斷的09h子功能用來顯示字串,字串首位址必須存放在ds:dx指定的位置。字串要以』$'結尾。
7.2、21h中斷的4ch子功能用來退出程式將cpu的控制權交還dos系統。
7.3、彙編中最常用的除dos中斷外,還有bios中斷,bios中斷是bios提供的功能,均用int
指令來呼叫。
start
標號和end start
指明程式的開始和結束位置,start
是自定義標號,可以自己取,不一定必須寫成start, end 是masm的關鍵字,end 後跟標號指明了程式的結束。
匯程式設計序的編譯一般有兩個過程,分別是編譯和連線,編譯是將程式翻譯成二進位制的中間資料(obj檔案),但是程式可能還有呼叫庫等操作,所以還需鏈結程式經過鏈結後才能生成最終的二進位制程式(exe或com等可執行程式)。
x86彙編工具一般有masm,nasm等,masm是微軟開發的組合語言整合開發工具,主要支援windows。nasm是開源組合語言開發工具,支援windows和linux。另linux下還有gas彙編器,是gcc使用的預設彙編器,其使用at&t語法,與nasm的intel語法相比較其較為繁瑣,但在linux下也較常用,此外還有tasm等等,對於跨平台開發,nasm是個不錯的選擇,以後有時間再研究下nasm的語法。
綜1所述,幾種彙編工具的寫法不盡相同,但主要思想是一致的,思想比工具重要。
[1]: 王爽老師的 組合語言(第3版)
彙編學習筆記 五
記憶體位址由段位址暫存器和偏移位址暫存器共同儲存 辣麼為什麼位址要分段呢?8086暫存器有 20根 資料線 cpu為16位的無法處理 20 位 的位址資訊 所以額外假設了乙個位址加法器 運算規則 實體地址 段位址 16 偏移位址 基礎位址 段位址 處理器位數 實體地址 基礎位址 偏移位址 個人理解 ...
ARM彙編程式設計學習筆記(五)
硬體平台 使用友善之臂mini2440平台。軟體平台 keil 下面直接給出例子和注釋。關於使用keil的一些注意事項,以及除錯的注意事項,放在本文末給出。area led,code,readwrite 宣告乙個 段,可讀寫,名字為led entry 標記下面的指令為入口點 include regi...
彙編學習筆記 第五章
從鍵盤獲取乙個位元組 輸出乙個位元組 輸出字串 mov dx,offset lable mov ah,09h int 21h cmp的詳細解釋 cf標誌位 無符號數 of標誌位 帶符號數 單標誌條件轉移指令 無符號數條件轉移指令 帶符號數條件轉移指令 cx暫存器條件轉移指令 of 0 的情況比較方便...