組合語言 第3章巨集組合語言

2023-01-09 17:51:02 字數 5451 閱讀 2596

第三章巨集組合語言

一:巨集組合語言格式

3.1.1 指令語句格式

指令語句的一般格式如下:

[標號:] 指令助記符運算元 ;注釋

1. 標號:標號是機器指令語句存放位址的符號表示,代表該指令目標**的第乙個位元組位址,後面必須緊跟冒號「:」 。

2.指令助記符:指令助記符為語句的核心成分,表示了該語句的操作型別。

3.運算元:運算元表示指令助記符的操作物件。

4.注釋:注釋均以分號開始,它可佔一行或多行,一般放在一條語句的後面。

3.1.2 偽指令語句格式

偽指令語句格式如下:

[符號名] 偽指令符運算元 ;注釋

1.符號名:符號名是偽指令語句的乙個可選項。

2.偽指令符:偽指令符指定匯程式設計序要完成的具體操作,如資料定義偽指令db、dw、dd,段定義偽指令segment,假定偽指令assume等。

2. 運算元:偽指令後面的運算元可以是常數、字串、變數、表示式等,其個數由具體的偽指令決定,各個運算元之間必須以「逗號」分隔。

4.注釋:偽指令的注釋必須以「;」開始,其作用同指令語句中的注釋部分。

3.2 彙編語句表示式

3.2.1 常量

1.數值常量

2. 字串常量

字串常量是用單引號或雙引號引起來的乙個或多個字元。字串常量是以各字元的ascⅱ碼表示的。如『a』用41h 表示,字串『a1b2』用41h,31h,42h,32h表示。

3.2.2 變數

1.變數

(1)段屬性

(2)偏移位址屬性

(3)型別屬性

2.變數的定義

表示式項是給變數或指定儲存單元賦予初值,它有以下幾種形式:

(1)數值表示式

資料定義偽指令可以為乙個或連續的儲存單元設定數值初值。

【例】為資料段分配儲存單元。

data segment

a db 11h,12h,13h

b dw 1122h,3344h

c dd 12345678h

data ends

上述變數的儲存單元分配及初始化情況如下圖3.1所示。

資料段中資料儲存分配圖

(2) 字串表示式

字串表示式中的字串必須用引號引起來。db、dw、dd偽指令將字串中的各字元均以ascⅱ碼形式存放在相應的儲存單元,但表示形式各不相同。

【例】為字串分配儲存單元。

data segment

str1 db 『1234』

str2 dw 『ab』,『cd』,『a』

str3 dd 『ab』

data ends

其儲存單元分配如下圖所示。

(3)位址表示式(只適用dw和dd兩個偽指令)

如果該位址表示式為一變數(或標號)名,用dw偽指令則是取它的偏移位址來初始化變數,用dd偽指令則是取它的段首址和偏移位址來初始化變數。

例如:buf1 dw a

buf2 dd b

(4) ? 表示式

?表示不確定的值

(5)帶dup的表示式

在表示式中使用重複資料操作符dup,可以為連續的儲存單元提供重複資料,其格式為:

n dup(表示式)

其中n為重複因子,只能取正整數,表示定義了n個重複資料儲存單元,其型別由它前面的資料定義偽指令確定,而每個資料儲存單元中的初值由dup後面圓括號中的表示式給定。

例如: buf db 100 dup(0)

以上語句定義了以buf為首址,大小為100個位元組,初值為0的資料儲存單元。

3.2.3 標號

標號是一條指令語句的符號位址。在彙編源程式中,只有在需要轉向一條指令語句時,才為該指令語句設定標號,以便在轉移類指令(含子程式呼叫指令)中直接引用這個標號。因此,標號可作為轉移類指令的運算元,即轉移位址。

【例】符號位址表示。

next:mov al, [si] ;帶標號next的指令

dec cx

jne next;標號next作轉移指令的運算元

標號也具有三種屬性

1.段屬性

2.偏移位址屬性

3.型別屬性

3.2.4 表示式與運算子

1.算術運算子

算術運算子包括:+(加)、-(減)、*(乘)、/(除)、mod(求模)、shl(左移)、shr(右移)幾種,它既可以用於數值表示式又可用於位址表示式。

【例】用算術運算子進行數值表示式運算。

┆num1 equ 25*4 –50 ;num1=50

num2 equ num1 / 7 ;num2=7

num3 db num1 mod 7 ;num3=1

var1 db 1,2,3,4,5

var2 db 『12345』

num4 equ var2-var1 ;num4=5

num5 equ 0fh

mov al,num5 shl 4 ;(al)=11110000b

mov bl,num5 shr 4 ; (bl)=00000000b

2. 輯運算子

邏輯運算子包括:邏輯乘(and)、邏輯加(or)、按位加(xor)、邏輯非(not)四種運算。由於邏輯運算是按位操作,且在彙編過程中完成,因而運算的結果仍為整數常量。

【例】用邏輯運算子進行運算。

mov al,34h and 0fh;04h→al

mov bl,05h or 30h;35h→bl

mov cx,not 00ffh;0ff00h→cx

mov dx,789ah xor 000fh;7895h→dx

3.關係運算子

關係運算子包括:相等(eq),不等(ne),小於(lt),大於(gt),小於等於(le)及大於等於(ge)。

【例】用關係運算子進行數值表示式運算。

num1 db 10 lt 5num1=0

num2 db 0aaaah gt 7fffh ;num2=0ffffh

mov ax,『a『 eq 41h ;0ffffh→ax

mov bx,num2 lt num1 ;0→bx

4。屬性運算子

ptr運算子

格式: 型別 ptr 位址表示式

ptr與equ連用,可定義與ptr右邊位址表示式型別不同的新變數名或新標號,但不另分配儲存單元。

5。數值返回運算子

(1)seg 運算子

格式:seg 變數或標號

功能:分離出其後變數或標號所在段的段首址。例如:

mov ax,seg arr

mov ds,ax

(2)offset運算子

格式:offset 變數或標號

功能:分離出其後變數或標號的偏移位址。例如:

mov bx,offset buf

(3)type運算子

格式:type 變數或標號

功能:分離出其後變數或標號的型別。如果是變數,將返回該變數的型別對應位元組數;如果是標號,則返回代表標號型別的數值。它們之間的關係見表3.2所示。

(4)length運算子

格式:length 變數

功能:取出變數所含的資料儲存單元個數。

【例】取出變數佔儲存單元個數。

data segment

a db 『abcdef』

b dw 10 dup(1,2dup(2))

c db 3,20 dup(0)

data ends

mov ax,length a ;1→ax

mov bx,length b ;10→bx

mov cx,length c ;1→cx

┆(5)size運算子

格式:size 變數

功能:取出變數所含的資料儲存區大小。其返回值為:

length 變數 * type 變數

例如:上例中a、b、c三變數:

size a = length a*type a = 1

size b = length b*type b = 20

size c = length c*type c = 1

(6)位元組分離運算子

位元組分離運算子包括:high和low。

格式:high 常量或位址表示式

low 常量或位址表示式

功能:high 用來分離出其後16位常量或位址表示式的偏移量的高位元組;low用來分離出其後16位常量或位址表示式偏移量的低位元組。

3.2.5 運算子的優先順序

3.3 偽指令

3.3.1 資料定義偽指令

常用的資料定義偽指令有db,dw,dd,dq,dt。

格式:[變數名]  資料定義偽指令表示式 [,…]

功能:定義資料儲存區,型別由資料定義偽指令確定,初值由表示式給定。

3.3.2 符號定義偽指令

1.等價偽指令

格式:符號名 equ 表示式

功能:為常量、表示式及其他各種符號定義乙個等價的符號名,但它不申請儲存單元。

用途:① 用符號表示常量、數值表示式,即定義符號常量。使用符號常量可使程式簡單明瞭,增強程式的可讀性和通用性。

② equ與屬性運算子ptr或this聯合使用,可以給變數或標號定義新的型別屬性並重命名,但保持其段偏移位址屬性不變。

③ 利用equ可以用乙個符號名替代乙個複雜的位址表示式和其他一些符號,如指令助記符、變數名、標號、段名、暫存器名、巨集定義名等。

2。等號偽指令

格式:符號名 = 表示式

功能:為常量、表示式及其他各種符號定義乙個等價的符號名,並能對所定義的符號多次重複定義,且以最後一次定義的值為準。

【例】定義等價符號名。

┆cost = 20

m = mov

lost = lost+10 ;30→lost

m = add ;m=add

┆3。定義符號名偽指令

格式:變數名或標號  label  型別

功能:定義與原有變數型別不同的新變數或為指令語句定義有指定型別的標號。通常與資料定義偽指令連用,其功能類似語句「變數名或標號 equ this 型別」。

【例】定義新型別的變數。

ddbuf label dword

buf db200 dup(0)

alabelfar

bleadx,buf

3.3.3 段定義偽指令segment/end

1.段名

段名是為該段起的名字,用來指出匯程式設計序為該段分配的儲存區起始位置。

2.定位方式

組合語言總結

一 乙個完整的源程式的結構 乙個源程式一般由若干個段組成,每個分段可以是棧段 資料段和 段。乙個源程式可以有多個棧段 資料段和 段,從語法規則上來看,棧段是有明顯標誌的 段最好的型別為 code 的標記,並用cs作為段界暫存器,只有資料段不要求標誌。完整的源程式的結構一般形式如下 程式名稱 二 源程...

組合語言總結

組合語言學習體會 大一大二期間學寫了一些高階語言,如c語言和c 在對一些實際問題的程式設計處理上使用這些高階語言顯得很是方便。於是在剛接觸這門課的時候就對其實用性產生了懷疑和一些的牴觸情緒。再學習了一段時間後,雖然對一些繁雜的指令有些討厭 但還是硬著頭皮學著下來了 但後來再經過實驗課的學習感覺組合語...

組合語言程式設計

實驗報告 軟體學院 一 實驗目的與意義 理解並熟練掌握組合語言程式設計過程中的編輯 彙編 鏈結和除錯等各個步驟,提高對彙編課程內容的理解和組合語言的掌握,通過上機練習加深對課程內容的理解和掌握。通過組合語言編制的程式上機除錯 執行檢驗程式設計是否正確。熟悉和掌握編輯 彙編 連線和除錯四個實用程式的使...