汇编语言程序格式
1 邏輯段
匯編語言源程序由一個或多個邏輯段組成。
? 一個程序中可以有幾個同一類型的邏輯段。
? 必須至少有一個代碼段。
[注]源程序分段的目的在于程序結構清晰、便
于內存分配,尋址方便,一個源程序需要設置
幾個段應根據具體問題來定。
段定義偽操作
段名 segment 定位 組合 段字 ‘類別’
… ;語句序列
段名 ends
- 完整段定義由SEGMENT和ENDS這一對偽指令實現,
SEGMENT偽指令定義一個邏輯段的開始,ENDS偽指令
表示一個段的結束 - 如果不指定,則采用默認參數;但如果指定,注
意要按照上列次序 - 段名對外表現為立即數,為該段的段地址
常數和數值表達式
常數(常量)表示一個固定的數值
(1)十進制常數: 以字母D或d結尾或缺省
(2)十六進制常數:以字母H或h結尾,以字
母A~F 開頭的十六進制數,前面要用0表達。
(3)二進制常數:由0或1兩個數字組成,以
字母B或b結尾
(4)八進制常數:以字母Q或q結尾
(5)字符串常數:字符的ASCII碼,如’abc’
(6)符號常數(常量),有點像#define出來的常量
?等價EQU偽指令
符號名 EQU 數值表達式
符號名 EQU <字符串>
?等號=偽指令
符號名 = 數值表達式
?=和EQU區別:
前者可多次使用,后者只能使用一次
數值表達式
- 數值表達式——用常數、符號常數和算
術、邏輯、關系運算符組成的表達式。
如:(75*2+X)/Y - 匯編程序在匯編過程中計算,最終得到
一個數值(常數) - 程序運行之前,就已經計算出了結果;
所以,程序運行速度沒有變慢,但增強
程序的可讀性
變量和標號
變量
? 變量——是指數據單元的符號地址。
? 變量的書寫格式:不能使用系統保留字、不能以數字開頭
? 變量的定義:用數據定義偽指令來定義
標號
? 標號——一個指令單元的符號地址。
? 標號的書寫格式:不能使用系統保留字、不能以數字
開頭
? 標號的定義:在一條指令語句前輸入標號且用“:”隔
開,即定義了該標號;或用Label來定義
變量定義偽指令
格式:
? [變量] DB/DW/DD/ DF / DQ / DT 操作數1,…,操作數n
功能:
? 定義變量;
? 在內存中分配一組存儲單元;
? 并對單元進行初始化。
分類
? DB:用來定義字節,其后每個操作數占用一個字節。
? DW:用來定義字,其后每個操作數占用一個字。
? DD:用來定義雙字,其后每個操作數占用兩個字。
? DQ:用來定義四個字,其后每個操作數占用四個字。
? DT:用來定義十個字節,其后每個操作數占用十個字節。
操作數
常數或一組常數或數值表達式;
? 例如:DATA DB 2, 100*2-5, 0, -1
一組字符串
? 如: STRING DB ‘This is a string’,其數值是每個字符對
應的ASCII碼的值
? 注意比較DB “ab”和 DW “ab”
變量名或標號名
? ADDR1 DW BLOCK ;BLOCK偏址放在
ADDR1單元
? ADDR2 DD BLOCK ;BLOCK的偏址和段
址依次存放在ADDR2四字節單元中。
一組“?”
? 只分配空間,不進行初始化
? 例如:BLOCK DW ?,? ;分配兩個字,但
為隨機值
重復DUP語句
? 格式:重復數 n DUP(重復內容)
? 功能:將DUP后的內容重復定義n
次。
? 例如:BLOCK DB 3 DUP (0,1,-1)
? 如同:BLOCK DB 0,1,-1, 0,1,-1,
0,1,-1
[注]DUP語句中可以包含DUP語
句。
起始地址和對準語句
ORG
? 格式:ORG 表達式
? 功能:指定隨后指令或者定義數據的偏移地址
? 說明:
?
“ORG”偽指令可設置程序段、數據段任何位置。
? 若程序中沒有設置“ORG”語句,一般情況每個邏
輯的起始地址為0000H。
EVEN
? 格式:EVEN
? 功能:偶地址對齊指令。若當前地址是奇數,
則加1;
上課講過這個的用途,什么尋址時偏移地址最后一位無效,兩個內存單元一起,然后有些字取一次就行有些要取兩次。我給整忘了
ALIGN
? 格式: ALIGN n
? 功能:使隨后的數據或者指令起始于n(2,4,8…)
的倍數地址
這個的原因和上面那個差不多,這個2的n次是有意義的。
NOTICE
匯編語言強類型!
變量有類型!
BUFFER DW 1234H
? MOV AL, BUFFER
? MOV AL,BYTE PTR BUFFER ;這個就是強制其為字節
? MOV AX, BUFFER
地址表達式
地址表達式——由“變量、標號、“+”、
“-” 數值表達式組成。
? 如:DATA+5;
? [注]含有變量的地址表達式其類型與該變
量一致,如VARY+4與VARY類型一樣
(VARY[BX]亦然);
? 地址表達式可以相減,不能相加(指針能夠相減但不能相加)
變量和標號屬性
變量的屬性:
? 段屬性——變量的段地址
? 偏移屬性——變量的偏移地址
? 類型屬性——變量所指單元的類型,字節變量、字變
量、雙字變量等
標號的屬性:
? 段屬性——是指定義標號所在段的段地址。
? 偏移屬性——是指定義標號處到段地址的距離。
? 類型屬性——NEAR型和FAR型。(不清楚是什么)
地址操作符
SEG 運算符
? 格式:SEG 變量或標號
? 功能:分離出其后變量或標號所在段的段首址。
? MOV AX,SEG ARR
? MOV DS,AX
OFFSET運算符
? 格式:OFFSET 變量或標號
? 功能:分離出其后變量或標號的偏移地址。
? MOV BX,OFFSET BUF
類型操作符
類型名 PTR
? 功能:指定類型 例: MOV WORD PTR [BX], 5
匯編程序編寫
源程序分別用兩種格式書寫
?第一種格式從MASM 5.0開始支持
? 簡化段定義格式
?第二種格式MASM 5.0以前就具有
? 完整段定義格式
(1) 段類型說明偽操作
- 在代碼段開始必須用ASSUME偽操作聲明段和
寄存器之間的關系,格式為:
ASSUME 段寄存器:段名 [,段寄存器名:段名, …] - 通知MASM,建立段寄存器與段的缺省關系;
在需要時自動插入段超越前綴。這是ASSUME
偽指令的主要功能。 - 實際上,數據段之所以成為數據段,是由于DS
指向它。由于程序運行時可以改變DS的值,使
得任何段都可以成為數據段。
ASSUME語句位于在程序段開始位置
在ASSUME語句中并沒有給段寄存器
賦值。
DS、ES的初值必須在程序中設置:
? MOV AX,<段名>
? MOV DS/ES/SS,AX
CS與IP的初值不能在程序中顯式設置,由系統自動設置
為END后指定的起始地址
為SS與SP的初值
? 可在程序中顯式設置: SS同上,SP用 MOV SP,St_TOP
? 堆棧段定義時給出了屬性STACK,則由系統自動設置。
? 其他,則由系統指定堆棧,編譯時給出警告錯誤
(2)匯編結束偽指令
格式:
? END [標號]
功能:
? 指示源碼到此結束;
? 指示程序開始執行點(標號處)。
總結
- 上一篇: 将mysql服务移除_怎么将mysql服
- 下一篇: 电子通讯录的基本模板