組合語言程式設計

2022-07-07 09:24:13 字數 2741 閱讀 7559

乙個完整的源程式通常由若干邏輯段組成,包括資料段、附加段、堆疊段和**段。它們分別對映到儲存器中的物理段上。每個邏輯段以segment語句開始,以ends結束,整個源程式用end語句結尾。

**段中存放源程式的所有指令碼、資料、變數等則放在資料段和附加段中。程式中可以定義堆疊段,也可以直接利用系統中的堆疊段。具體乙個源程式中要定義多少個段應根據實際需求來定。

dseg segment ;定義資料段

data1 dw 0f865h ;dw是定義2位元組空間

data2 dw 360ch

dseg ends

eseg segment ;定義附加段

sum dw 2 dup(?) ;定義存放結果

eseg ends

cseg segment ;定義**段

assume cs:cseg,ds:dseg,es:eseg

start:mov ax,dseg

mov ds,ax ;初始化ds

mov ax,eseg

mov es,ax ;初始化es

lea si,sum ;存放結果的偏移位址送si

mov ax,data1 ;取被加數

add ax,data2 ;兩數相加

mov es:[si],ax ;和送附加段的sum

hltcseg ends

end start

表示式不是乙個指令,本身不能執行,在程式彙編時,匯程式設計序將表示式進行相應的運算,得出乙個確定的值。

+-*/:當運符作為乙個數值表示式時,其彙編結果就是乙個數值。

邏輯運算子:只用於數值表示式,用於對數值進行位運算並得到乙個結果。

關係運算子:有六個,eq(相等),ne(不相等),lt(小於),gt(大於),le(小於等於),ge(大於等於)。

取值運算子和屬性運算子

offset:可以得到乙個標號或變數的偏移位址。例如:mov si,offset data1將變數data1的偏移位址送si。與lea si,data1執行結果相同。

ptr:屬性運算子用來指定定位於其後的儲存器運算元的型別。call dword ptr[bx]說明儲存器運算元為4個位元組,即呼叫遠端。

格式[變數] 偽操作 運算元,[運算元...],常用資料定義偽指令有以下5種。

db:定義變數為位元組型別,變數中的每個運算元佔乙個位元組,db偽指令也常用來定義字串。

dq:定義變數為四字型別,在記憶體中存放。

dt:定義變數為十字節型別,在記憶體中存放。

運算元

data db 11h,33h ;定義包含兩個元素的位元組變數data

num dw 100*5+88 ;定義乙個字型別,其初值為表示式的值

str db 'hello!' ;定義乙個字串,首位址為str

sum dq 0011223344556677h ;將4個字存入sum,它們在記憶體中的存放由低到高為77h,66h,55h,44h

data2 dw ? ;為變數data2分配2個位元組的空間,初值為任意值

重複操作符

[變數名] 資料定義偽操作 n dup(初值,[初值...]),圓括號中為重複的內容,n為重複的次數,如果用n dup(?)作為資料定義偽操作的唯一運算元,則匯程式設計序僅保留n個元素大小的資料區。

data1 db 20 dup(?) ;為變數data1分配20個位元組的空間,初值為任意值。

data2 db 20 dup(30h) ;為變數data2分配20個位元組的空間,初值均為30h

段定義偽指令
段名 segment [定位型別][組合型別]['類別']

...段名 ends

定位型別

組合型別

none:表示本段與其他邏輯段不組合。即對不同程式模組中的邏輯段,即使具有相同的段名,也分別作為不同的邏輯段裝入記憶體而不進行組合。

public:表示對於不同程式模組中用public說明的具有相同段名的邏輯段,彙編將它們組合到一起,構成乙個大的邏輯段。

stack:組合型別為stack時,其含義和public基本相同,但僅限於堆疊段使用。

memory:表示當幾個邏輯段連線時,本邏輯段定位在位址最高的地方。如果被連線的邏輯段中有多個段的組合型別都是memory,則匯程式設計序只將首先遇到的段作為memory,而其餘的都作為common處理。

設定段暫存器偽指令

assume偽指令用於向匯程式設計序說明所定義的邏輯段屬於何種型別的邏輯段。說明方法是將邏輯段的短命和對應的段暫存器聯絡起來。一般格式為assume 段暫存器名:段名,[段暫存器:段名]

; 程式功能:10ms延時的子程式

delay proc ;定義乙個子過程 proc的作用是子程式定義偽指令

push bx ;保護原有bx內容

push cx ;儲存原有cx內容

mov bl,2 ;外迴圈次數

next: mov cx,4167 ;內迴圈次數(延時5ms)

w10ms:loop w10ms ;cx不等於0時則迴圈

dec bl ;修改外迴圈計數值

jnz next ;bx不為0時則進行第二輪迴圈

pop cx ;恢復cx值。

pop bx ;恢復bx值。

ret ;過程返回

delay endp

組合語言程式設計

1.彙編語句的三種基本型別 2.標號相關 3.變數相關 4.運算元定址方式 buffer dw 500 x 17 rept 500 這是乙個重複巨集,以下重複彙編500遍 x x 979 mod 65535 這句話我也不懂 dw x endm 巨集在這裡結束transto10 proc near 函...

《組合語言程式設計》說明

組合語言程式設計說明 我只是對其中的大部分東西作簡要的摘錄。一方面害怕自己忘記而沒有書籍查證 這本書是向圖書館借的 另一方面是現在大部分組合語言是基於win32平台的,而這本書是基於linux下面的彙編,值得學習。而又不敢獨享,遂與大家分享。基於以上原因呢,就沒有表明是原創的。為什麼從第四章開始?也...

ARM 組合語言程式設計

教材 嵌入式系統及應用,羅蕾 李允 陳麗蓉等,電子工業出版社 迴圈程式設計 子程式及其呼叫 匯程式設計序訪問全域性 c 變數 普通分支程式 多分支 散轉 程式 程式分支點上有多於兩個以上的執行路徑的程式叫做多分支程式。利用條件測試指令或跳轉表可以實現多分支程式 帶 arm thumb 狀態切換的分支...