20192431張瀟文彙編程式設計前四章學習筆記
第一章
1.1節—概述
計算機程式語言可以分為:機器語言、高階語言和組合語言三類。
1. 機器語言:就是把控制計算機的命令和各種資料直接用二進位制數碼錶示的一種程式設計語言。
2. 高階語言:遮蔽了許多操作細節,但是效率比機器語言低
3. 組合語言:便於記憶和閱讀,使用字母和符號來表示。組合語言程式與機器語言程式的關係是一條組合語言的語句與一條機器語言指令對應,組合語言程式與機器語言程式效率相同。組合語言和硬體密切聯絡。
1.2進位制以及數的表示部分:
進位計數制及其相互轉換:
- 位權:各個位置上所表示的基本數值稱為位權,簡稱權。
- 基數:每個數位上能使用不同數碼的個數稱為基數。每個數位能取的最大數碼值=基數-1.二進位制在機器語言當中用的比較多。
- 二進位制與八進位制十六進位制:3位二進位制數與一位八進位制數一樣,4位二進位制數與一位十六位進位制數類似。
常用的字母表達:
各種數制間的相互轉換:主要討論二進位制與十進位制之間的轉換。
1.3十進位制整數轉換為二進位制數:
1. 減權定位法:從二進位制數高位起,依次用帶轉換的十進位制數與各位權值進行比較,如果夠減,該位為1,不夠減該位為0。如圖:
2. 除基取餘法。如圖:
但是要注意是從下往上讀。這種轉換方法同樣適合於其它進位制數之間的轉換。
- 十進位制小數轉換為二進位制數:
1. 減權定位法:
1. 乘基取整法:
1.4、二進位制整數轉換為十進位制數:
1. 按權相加法
2. 逐次乘積相加法:
1.5二進位制小數轉換為十進位制數:
(1)按權相加法
(2)逐次除基相加法:
1.6帶符號數的表示:
-
用“+”或“-”表示正負的數叫真值
-
用“0”或“1”表示正負的數叫機器數
-
原碼錶示
-
二進位制數的最高位表示符號,0表示正,1表示負,數值部分用二進位制數絕對值表示
注:8位二進位制數原碼的最大數為01111111(+127),最小數為11111111(-127)0的原碼有兩種表示形式:00000000和10000000(+0和-0)
補碼錶示
補碼的定義:帶符號數X的補碼錶示[X]補定義為[X]補=M+X(Mod
M),其中模數M根據機器數的位數而定,如位數為8則M=2^8
用補碼錶示的機器數,符號位仍然表示數的符號:0為正,1為符。對於正數,補碼與原碼相同,對於負數需要進行變換。
-
負數的真值變換為補碼的方法:將各位變反(0變1,1變0)然後在最低位加1
-
負數的原碼變換為補碼:保持符號位不變,其餘各位變反,最低位加1.
當位數為8時,最大補碼為01111111=[+127]補,最小補碼為10000000=[-128]補(這考慮進位),0的補碼只有一個,[0]補=00000000,[-128]補=10000000,[-1]補=11111111.
補碼的加減運算:
規則:[X+Y]補=[X]補+[Y]補
[X-Y]補=[X]補-[Y]補=[X]補+[-Y]補
注:其中[-Y]補是對[Y]補執行一次求補運算(求補運算是將原數連同符號位一起(不管是正還是負)按位求反,再在最低位加1)。
1.7字元的表示:
在計算機內部,各種字元都是按一定的方式編寫成二進位制資訊,不同的計算機以及不同的場合所採用的編碼形式可能不同,目前最廣泛採用的是ASCII碼。標準ASCII碼為一位元組,其中用低七位表示字元編碼,用最高位表示奇偶數校驗位。一共128個
非列印和列印ASCII碼,非列印的有33個。
基本邏輯運算:
常見的基本邏輯運算就是與或非和異或。
具體見下表即可理清楚:
第二章 IBM微機基本結構
2.1節:微機基本結構:
一般計算機應包括五大部件:運算器、控制器、儲存器,輸入裝置和輸出裝置。由於微機的主要特點是其體積很小,因此在系統上就有一些特殊考慮。將運算器和控制器兩大部件整合在一個積體電路晶片上,稱為中央處理器,簡稱CPU,也叫微處理器。
系統採用匯流排結構,匯流排結構分為三種,是計算機內部不同部件之間的傳輸通道。這個示意圖顯示出了五大部件之間的連線關係,三大匯流排可以相互連線,控制和傳輸的作用。
中央處理器CPU,它包括運算器和控制器。分析從主儲存器取來的各條指令的功能,控制計算機各部件完成指定功能的各項操作。
儲存單元的多少標識了其大小,對每個儲存單元是按照地址來進行訪問的。
在大多數計算機中,儲存器的組織都是以位元組為基本單位,每一個基本單位稱為一個儲存單元。10位就是1K個單元。
主機:習慣上將CPU於主儲存器合稱為主機,在計算中,一般還配置有輔助儲存器,稱為輔存,也可叫做外村。
輸入輸出裝置及介面:磁碟、磁帶,觸控顯示屏二者功能兼有。
由於I/O裝置不同的裝置查邊很大,因此需要有I/O接口才能與系統匯流排連線。
三大匯流排傳輸的內容是不同的。
組合語言由一系列的指令構成,是最基本的單位。在執行指令的過程中有兩個步驟,取指令和執行指令。這兩個步驟執行又分為序列和指令流水線方式。
序列方式:以CPU為例,取指,執行,存數。
特點是:當CPU在指令執行階段,不需要佔用系統匯流排,但此時匯流排也不工作,因此係統匯流排的空閒時間比較多。
在儲存器取指令、取資料或存資料時,匯流排處於忙狀態,其所佔用的時間也比較長。而CPU卻只需要花很短的時間去處理,因此大部分時間處於閒置狀態。
8086CPU結構分為兩部分(執行單元EU和匯流排介面單元BIU)。
EU當中主要進行計算控制,通用暫存器,ALU等等。
BIU中通過三種類型的匯流排去進行功能。
EU和BIU是相互獨立合作的。
2.2節:CPU暫存器結構及其用途
一共有14個暫存器,8個16位通用暫存器。AX,BX,CX,DX(8個通用暫存器)。H表示高位,L表示低位。AX是累加器,BX是基址暫存器,CX是計數暫存器,DX是資料暫存器。具體可看下圖:
一、通用暫存器:
AX資料暫存器既可以用來存放參加運算的運算元,也可以存放運算的結果。在多數情況下,使用這些暫存器時必須在指令中明確指示。
如 MOV AX BX;將BX的內容送到AX中去。
很顯然後面的是源地址,前面的是目的地址。
在有些指令中,不需要明確指出使用的暫存器名,即隱含使用了某暫存器。比如在迴圈指令LOOP中,CX被隱含指定做迴圈次數計數用。
特定使用:移位指令 SHL AX,CL。CL被固定用作移位次數。
指標暫存器有堆疊指標SP和基址指標BP,它們一般用來存放16位地址,在形成20位的實體地址時,常被作為偏移量來使用。SP隱含使用時,用來指向堆疊頂部單元。BP一般指向堆疊段內某一儲存單元。當然也可存放結果運算元之類的。
SI(源變址暫存器),DI(目的變址暫存器)。也可以作為通用暫存器
段暫存器(有四個):每個段用來存放不同的內容,如程式程式碼、資料等等。每個儲存段的起始位置叫做段基址。由低到高。
CPU在訪問儲存器時必須指明兩個內容:儲存單元屬於哪個段,儲存單元與段基址的偏移量。
在程式設計中,一個程式將儲存器劃分成多少個儲存段式任意的,但在程式執行的時候最多隻有四個段,分別由CS、DS、ES、SS指定。
指令指標IP:IP作為偏移量,段暫存器CS作為程式碼段的基址指標,共同形成一條指令的存放地址。
當CPU從記憶體中取出一條指令後,IP自動修改為下一條指令的地址。
IP的內容不能被直接訪問,可以通過某些指令的執行而自動修改IP內容,轉移指令和子程式呼叫指令CALL可以自動改變IP暫存器的內容。
子程式呼叫指令CALL,將IP原有內容自動壓入堆疊,而將子程式的入口地址偏移量自動送入IP,而返回指令RET,又自動從堆疊中彈回原有IP的內容。
標誌暫存器:用來反映CPU在執行時的某些狀態,8086/8088中是16位,但只定義了其中9位,如圖:
標誌位分為狀態標誌和控制標誌
狀態標誌:CF,PF,AF,ZF,SF,OF
控制標誌:TF,DF,IF
CF用在借位或者進位,當然在移位類指令中,CF也用來存放從最高位(左移)或最低位(右移)移出的數值
PF:低八位中含有1的個數為偶數時,被置1。
AF:置反映運算結果低八位,與運算元長度無關。
OF:超過補碼所能表示數的範圍時置1,否則置0.
溢位和進位是不同的
2.3儲存器組織結構
儲存器由若干個儲存單元構成。每個儲存單元存放相同長度的二進位制數,8位一個位元組。每個儲存單元有唯一的地址編號——地址。
8086/8080CPU有20根地址匯流排。
為了方便書寫,在源程式中常用5位16進位制數或一個符號來表示一個儲存單元的地址。
任何兩個相鄰位元組單元就構成一個字單元。即16位二進位制數位一個字。
放資料的時候就是低對低,高對高。
在定義一個地址時必須指出是位元組或字型別屬性。
儲存器的段結構具有以下幾個特點:
每個段的最大長度為64K。在這些段裡使用者可以任意設定長度和用途以及段的個數。
2.每個段的基址必須是一個小節的首址。
小節:每16個位元組單元稱為一個小節。
3.邏輯段在物理儲存器中可以是鄰接的、間隔的、部分重疊的和完全重疊的燈四種情況。記憶體中的一個物理儲存單元可以映象到一個或多個邏輯段中。
4.在任一時刻,一個程式只能訪問4個當前段中的內容。4個段分別是程式碼段、資料段、堆疊段和附加段。
三、邏輯地址與實體地址及對應關係。
1.實體地址:00000H~FFFFFH
邏輯地址:包含段基值和偏移量。
段基值:存放在那4個段暫存器中的值。
偏移量:表示某個儲存單元與它所在段的段基址之間的位元組距離。
邏輯地址的表示方法:段基值:偏移量
邏輯地安置轉為實體地址:將邏輯地址的段基址左移4位,形成20位的段基址(低位為0)然後與16位的偏移量相加,結果即為20位的實體地址。
同一個實體地址可以被多個邏輯地址對映。
邏輯地址的來源:在程式的執行過程中,CPU根據不同操作型別訪問儲存器,其邏輯地址中段基值和偏移量的來源是不一樣的。
2.4堆疊及其操作方法:
堆疊是一個特定的儲存區,訪問該儲存區一般需要按照專門的規則進行操作。主要用於暫存資料以及在過程呼叫或處理中斷時儲存斷點資訊。
堆疊的構造:專用堆疊儲存器和軟體堆疊。
專用:專門設計的儲存器
軟體:在記憶體中劃分出一塊區域。
堆疊的一端是固定的,稱為棧底,棧底是堆疊儲存區的最大地址單元。另一端是浮動的稱為棧頂,棧頂是最後存入資訊的儲存單元。棧頂是隨著堆疊中存放資訊的多少而改變。
堆疊指標SP,指示堆疊的頂部。
堆疊存取資料的規則是FILO。
堆疊暫存器SS指示了一段空間,SS是堆疊的起始位置。
資料滿的時候指向棧頂。沒有資料的時候指向棧頂+2,其值就是堆疊的長度。如果指向棧底,說明還是有資料的。如果堆疊的資料超過了64K的話,那麼我們只要多設定幾個棧就好。
堆疊的操作:
1.設定堆疊,對堆疊段暫存器SS和堆疊指標SP賦值。
PARA STACK就是用來說明本段為堆疊段。SP會被設定為初值100。
2.進棧PUSH,由指令PUSH或者由機器自動實現,可以將通用暫存器、段暫存器或字儲存單元的內容壓入堆疊頂部。
進棧的過程:首先將堆疊指標SP-2,將資料放入SP指向的單元裡。
3.出棧POP,把堆疊頂部彈出一個字(兩個位元組)傳送到儲存單元中。
將SP指向的字單元(即棧頂字單元)內容送往指定的暫存器或儲存器,堆疊指標SP內容加2。資料少了就應該變長。
進棧操作先操作指標,出棧的操作先進行內容,再處理指標。
第三章 定址方式與指令系統
3.1節定址方式:
定址方式:一條指令通常由操作碼和運算元兩大部分構成。操作碼:行為,運算元:物件。定址就是找運算元的方法。
運算元的方法有以下四種:立即數運算元,在指令程式碼中提供。
暫存器運算元
儲存器運算元
I/O埠運算元。
1.立即數定址:立即數可以是8位或者16位。
MOV AX 20A0H:表示將16位立即數20A0H送入AX中。
立即數定址速度非常快,直接從BIU的指令佇列中取出,它不需要另外佔用匯流排週期,因此這種定址方式執行速度快。立即數只能作為源運算元,而不能作為目的運算元。
2.暫存器定址:運算元在暫存器裡可以是通用暫存器也可以是段暫存器。MOV
AX,BX。這種定址方式在CPU內部進行,不需要匯流排週期,所以執行速度也很快。
後面的定址方式就將在儲存器中。
一個儲存單元邏輯地址表示為:段基值:偏移量。
有效地址也叫做偏移量EA。
儲存器定址方式:
1.直接定址:運算元的有效地址EA只有位移量地址分量。在組合語言程式中,直接定址方式用符號或常數來表示。再用常數表示的時候要用方括號括起來。
2.暫存器間接定址:EA直接從基址暫存器BX或BP或變址暫存器(SI或DI中獲得)。如果在程式執行期間,只要對暫存器內容進行修改,就可以實現用同一條指令實現對不同儲存單元進行修改。指示儲存器所在段的段暫存器可以省略,當指令中使用的BP暫存器,則隱含表示使用SS段暫存器,其餘情況則隱含使用DS段暫存器。
3.基址定址/變址定址:EA由兩個分量構成。段暫存器的隱含使用規則與暫存器間接定址方式相同。
基址和變址稱為暫存器相對定址,只需改變暫存器的內容就可以用一條指令訪問不同的儲存單元。
4.基址變址定址:EA=基址+變址+位移量
5.串操作定址方式,使用SI和DI專門指示,在尋找源運算元時,隱含使用SI作為地址指標,在尋找目的串時,隱含使用DI作為地址指標,在串操作完成之後,自動對SI和DI進行修改,使它們指向下一個運算元
6.I/O埠定址:在計算機系統,對I/O埠的定址方式:儲存器編址方法(需要佔用儲存地址空間)
I/O埠編址方法:與儲存器地址分開,並使用專門的輸入指令和輸出指令。
直接埠定址:埠地址一般採用兩位16進位制數,也可以用符號表示。直接埠定址可訪問的埠數為0~255個。
暫存器間接埠定址:把I/O埠的地址先送到DX中,用DX作間接定址暫存器。如果訪問的埠地址大於255,則必須用I/O埠間接定址。
3.2指令系統:
指令的劃分:
無運算元指令:不需要運算元的指令,如HLT
在指令格式中,沒有顯式地指明運算元,但是它隱含指明瞭運算元的存放地方,如PUSHF
一、傳送類指令:MOV DEST,SRC
MOV指令對標誌暫存器的各位無影響。立即數只能作源運算元,且它不能傳送給段暫存器。暫存器之間的傳送中要注意,段暫存器CS只能作源運算元,不能作目的運算元。段暫存器之間不能直接傳送,儲存單元之間不能直接傳送資料,暫存器與儲存單元之間傳送。
二、交換指令
指令格式:XCHG DEST,SRC
資料交換可以在暫存器之間或暫存器與儲存器單元之間進行,但是不能再儲存單元之間直接進行資料交換,暫存器只能使用通用暫存器。
三、標誌傳送指令:對標誌暫存器進行存取的指令有4條,它們都是無運算元指令,即指令隱含指定標誌寄存區,AH暫存器或堆疊為運算元。
(1)取標誌暫存器指令:指令格式:LAHF,將標誌暫存器的低8位送入AH暫存器,即將標誌SF/ZF/AF/PF/CF送入AH的第7,6,4,2,0位,而AH的5,3,1位不確定。
(2)儲存標誌暫存器指令:指令格式:SAHF,將暫存器AH中的送入標誌暫存器中
(3)標誌進棧指令:指令格式:PUSHF,將堆疊指標SP-2,然後將16位標誌暫存器內容送入SP指向的字單元。
(4)標誌出棧指令:指令格式:POPF
四、地址傳送指令:將儲存單元的地址送暫存器
(1)裝入有效地址:格式:LEA
DEST,SRC,源運算元必須是一個地址,目的是一個16位通用暫存器。作用是將SRC儲存單元地址中的偏移量,即有效地址EA傳送到一個16位通用暫存器中。指令執行對標誌暫存器各位無影響。
(2)裝入地址指標指令:格式:LDS DEST,SRC/LES DEST,SRC
五、算術運算類指令
加減乘除指令,這些指令可以對位元組資料或字資料進行運算,參加運算的可以是無符號數,也可以是帶符號數,帶符號數用補碼錶示
(1)加法指令:指令格式:ADD
DEST,SRC。DEST只能是通用暫存器或儲存器運算元,不能是立即數。
DEST和SRC不能都為儲存器運算元。可以是位元組運算元相加,也可以是字運算元相加。
(2)帶進位加法指令:指令格式:ADC DEST,SRC
與ADD不同的是結果要加上進位標誌CF的值。注意CF是本條指令執行之前的值。
(3)加1指令:指令格式:INC
DEST,目的運算元可以是任意的8位16位通用暫存器或儲存器運算元,它不影響CF,INC指令主要用於某些計數器的計數和修改地址指標。
(4)減法指令:指令格式:SUB
DEST,SRC,,目的-源,再放入目的地址。不能同時為儲存器運算元減法指令對借位標誌的影響,若採用變減為加的運算方法,則產生的進位與CF標誌結果相反。
(5)帶借位減法:指令格式:SBB DEST,SRC,其實就是多減了一個CF和帶進位加法類似。
(6)減1指令:指令格式:DEC DEST
(7)求負數指令:指令格式:NEG
DEST,也叫做取補指令。對進位CF的影響:只有當運算元為0的時候,CF才被置0。當位元組運算元為-128,或字運算元為-32768時,執行NEG指令的結果運算元將無變化,但OF被置1.
六、位操作類指令:
(1)邏輯運算指令,邏輯運算指令共有4條,它們的指令格式分別是邏輯“與”指令:AND
DEST,SRC
邏輯“或”指令:OR DEST,SRC
邏輯“異或”指令:XOR DEST,SRC
邏輯“非”指令:NOT DEST
這四條指令都是執行按位邏輯運算。
邏輯指令對標誌位的影響:NOT對標誌無影響,而其餘三條指令將根據結果影響SF、ZF和PF,而CF和OF總是置0,AF為不確定。可以對一些數分離其高位或低位,或者把最低位置1,最高位置0,取反等等。
(2)測試指令:TEST
DEST,SRC。與AND類似,但是運算的結果不送入目的運算元。主要用於測試某一運算元的一位或幾位的狀態。
(3)移位/迴圈移位指令:
1.算術移位:算術左移和算術右移
左移:SAL DEST,COUNT
右移:SAR DEST,COUNT(符號位不動)
2.邏輯移位:邏輯左移和邏輯右移
左移:SHL DEST,COUNT(和算術左移一樣)
右移:最高位補0
3.迴圈移位:小迴圈:迴圈右移:ROR,迴圈左移;ROL
迴圈左移:不移CF,最高位到最低位,同時最高位還要到CF裡面。
迴圈右移:最低位到最高位,最低位還要移到CF裡。
大迴圈:帶進位的迴圈左移和迴圈右移,也就是要把CF納入到迴圈當中,最高位到CF,CF到最低位。
以上移位的八條指令的共通點:DEST為操作物件,COUNT決定移位的次數,移位的次數>1必須使用暫存器CL,移位次數是1時可以使用常數。在執行移位時,根據指令不同,每移位一次,最高位(左移)或最低位(右移)都要送到進位標誌CF。
算術移位和邏輯移位,對標誌位CF,PF,ZF,SF和OF,而AF不確定。後四條移位僅修改CF和OF。
對OF的影響:移位次數為1時,移位前後運算元的符號位發生變化,則OF->1,否則置0.移位次數大於1時,OF不確定。
算術左移相當於×2^n,移位後的結果不能發生溢位。
對於多位元組或多字資料的移位,需要使用帶進位迴圈移位指令。
七、處理器控制類指令:
(1)標誌位操作指令,能直接操作的標誌位有CF,IF和DF。
1.清除進位標誌:CLC:置CF為0.
2.置1進位標誌:STC:置CF為1
3.進位標誌取反:CMC:CF的值取反
4.清除方向標誌:CLD:置DF為0
5.置1方向標誌:STD:置DF為1
6.清除中斷標誌:CLI:置IF為0
7.置1中斷標誌:CTI
(2)與外部事件同步的指令:ESC,HLT,WAIT,LOCK
(2)空操作指令:NOP,相當於延時,三個CPU的時鐘週期。
3.3節——指令編碼
四種編碼格式:
(1)雙運算元指令編碼格式:
兩種情形(一個運算元在暫存器中,另一個在暫存器或儲存器中)(目的運算元在暫存器或儲存器中,源運算元時立即數)
操作特徵:1位元組,又分為OPCODE,6bit,標明瞭該指令所執行的功能和兩個運算元的來源,如果源運算元是立即數,則需要使用第二位元組中REG欄位作輔助操作碼。有一個方向欄位d,與定址特徵一起決定源運算元和目的運算元的來源。當SRC為IMM時,d欄位無效。位元組欄位W,W=1為字,=0是位元組
定址特徵:1位元組:與操作特徵部分的d結合,知道兩個運算元的定址方式和哪個暫存器。MOD,REG和R/M三個欄位。REG欄位確定一個運算元,另外兩個一起確定一個運算元。d=1時,目的操由REG欄位確定,源由另外兩個確定。d=0反過來即可。REG欄位確定一個運算元是某一通用暫存器的內容,使用的是暫存器定址方式。
位移量:2位元組。根據定址特徵中MOD和R/M欄位確定的有效地址計算方法,位移量可以是以下三種情況之一:沒有位移量
,1位元組位移量disp8,2位元組位移量disp16
立即數:兩位元組
(2)單運算元指令編碼格式:這種編碼適用於只有一個運算元的指令,如INC,DEC,移位迴圈之類的。
操作特徵部分:OPCODE、V和W三個欄位。V欄位只有移位/迴圈指令中才有該欄位。其它指令中沒有該欄位。V=0時,指令中常使用常數1作為移位或迴圈次數,V=1時,CL。
(3)與AX或AL有關的指令編碼格式:這種編碼格式用於隱含指定AX/AL作為一個運算元的雙運算元指令。
(4)其它指令編碼格式:如標誌位操作指令、堆疊操作指令等。一般只有一個位元組。有些單位元組指令的編碼中,將該位元組劃出部分位作為REG欄位,例如PUSH指令。
第四章——組合語言程式格式
4.1節:組合語言種類及其格式
常用的彙編程式有:ASM,MASM,TASM,OPTASM。
組合語言語句種類及其格式:語句可以分為指令語句和偽指令語句。
指令語句:可執行語句,一般格式為
標號:指令助記符,運算元;註釋(多個運算元用逗號隔開)
標號欄位:可選欄位,後面必須有:。標號是一條指令的符號地址,代表了該指令的第一個位元組存放的地址。一般放在一個程式段或子程式的入口處,控制程式的執行轉到該程式位置,在轉移指令中可直接引用這個標號
指令助記符(必須有的),表示這條語句要求CPU完成什麼具體操作,可以在前面加上字首,比如重複操作REP。
運算元欄位:運算元數量不定。
註釋欄位:可有可無。不會影響到程式的。
偽指令語句:又叫做命令語句,本身並不產生對應的機器目的碼,只是告訴彙編程式對其後面的指令語句和偽指令語句的運算元應該如何處理。
格式:符號名 偽指令符,運算元;註釋
符號名:可選的,可以是常量名,過程名,結構名,和記錄名等。可以作為其他指令語句或偽指令語句的運算元,實際上是一個地址。
偽指令符:介紹功能,必須要有的。
運算元:和指令語句的運算元類似。
三、識別符號:標號和符號名統稱為識別符號。識別符號是由若干個字元構成的,具體什麼規則可查。
4.2組合語言資料:
運算元的基本組成部分,由數值和屬性兩部分構成,在說明資料時不僅需要指定其數值,還需要說明它的屬性,比如是位元組還是字。常數變數和標號是三類資料格式。
1.常數:不會改變,二進位制數,八進位制數,十進位制數,十六進位制數,注意十六進位制數的常數的第一個數字是字母的話,為了與識別符號加以區分,必須在前面加上0。實數。
在彙編程式裡,可把實數轉換為4位元組八位元組的二進位制數。字串常數,用單引號或雙引號括起來的字元。ASCII碼儲存。
常數的使用方法,作指令語句的源運算元,在直接定址方式,變址(基址)定址方式或基址變址定址方式中作位移量。在資料定義偽指令中使用。
2.變數:表示用來存放資料的儲存單元。可以被改變。要給變數賦予一個符號名,即變數名。還要為這些儲存單元置初值。
變數定義的一般格式:變數名 表示式1,表示式2……
DB:位元組變數,DW:字,DD:4,DQ,DT依次增2.
變數的三個屬性:段屬性,偏移量屬性,型別屬性。
給變數賦初值的表示式有四種形式:數值表示式,?表示式,不帶引號的問號“?”表示可以預置任意內容。字串表示式。兩個字元的存放順序是前一個字元放在高地址,後一字元放低地址單元。注意,DW和DD指令不能用兩個以上字元構成的字串賦初值,否則將出錯。
DUP表示式:多個多次。
變數可能在定址中作為偏移量,在偽指令中表示取變數地址的偏移量。
3.標號:指令地址的別名。NEAR和FAR。(距離屬性)
隱含方式,預設為NEAR屬性也就是說只能被本段的轉移指令和呼叫指令。
用LABEL偽指令給標號指定距離屬性。還可以用來定義變數的屬性,即改變一個變數的屬性,如把自變數的高低位元組作為位元組變數來處理。
4.3符號定義語句。
兩種符號定義語句:等值語句:符號名 EQU 表示式
等號語句:符號名=表示式,等號語句可以對一個符號進行多次定義。等號語句不能為助記符定義別名。等值語句與等號語句都不會為符號分配儲存單元,因此所定義的符號沒有段、偏移量和型別等屬性。
4.4表示式與運算子。
大多與別的程式語言類似,SHR為右移,左邊移出來的空位用0表示,SHL左移。注意移位運算子是對一個數,注意和移位指令進行區別。數字表達式一般由數字常量、數字變數、數字運算子和括號構成。與數字表達式相關的運算子如下:
①“+”、“—”、“×”、“/”及“mod”算術運算子
以上的算術運算子分別代表加、減、乘、除和取餘數運算。例如,以x和y表示兩個數字表達式,則:
x+y 表示x與y的和。 x—y 表示x與y的差。 x×y 表示x與y的乘積。 x/y 表示x除以y的商。
x:mod:y 表示x除以y的餘數。 ②“rol”、“ror”、“shl”及“shr”移位運算子
以x和y表示兩個數字表達式,以上的移位運算子代表的運算如下。 x:rol:y
表示將x迴圈左移y位。 x:ror:y 表示將x迴圈右移y位。 x:shl:y 表示將x左移y位。
x:shr:y 表示將x右移y位。
③“and”、“or”、“not”及“xor”按位邏輯運算子
以x和y表示兩個數字表達式,以上的按位邏輯運算子代表的運算如下。 x:and:y
表示將x和y按位做邏輯與的操作。 x:or:y 表示將x和y按位做邏輯或的操作。 :not:y
表示將y按位做邏輯非的操作。 x:xor:y 表示將x和y按位做邏輯異或的操作。
4.關係運算符:EQ、NE、LT、LE、GT、GE。用來比較兩個表示式的大小,兩個表示式要不都是常數,或同一邏輯段中的變數。如果是常量的比較,則按無符號數進行比較,如果是變數的比較則比較它們的偏移量的大小。關係運算的結果只能是全1或全0。
一個重要的例子:
5.數值返回運算子:將變數或標號的某些特徵值或儲存單元地址的一部分提取出來。
SEG運算子:取變數或標號所在段的段基址。
OFFSET運算子:取變數或標號在段內的偏移量
TYPE運算子:取變數或標號的型別屬性,並用數字形式表示,對變數來說就是取它的位元組長度。
LENGTH運算子:取變數的長度,如果變數是用重複資料操作符DUP說明的,則LENGTH運算取外層DUP給定的值,如果沒有用DUP說明,則LENGTH運算返回值總是1.
SIZE運算子:等於LENGTH*TYPE(只能用於變數)
6.屬性修改運算子:對變數、標號或儲存器運算元的型別屬性進行修改或指定。
PTR運算子:型別 PTR
地址表示式(將地址表示式所指定的標號、變數或用其它形式表示的儲存器地址的型別屬性修改為“型別”所指的值)。修改是臨時的。
HIGH/LOW運算子:將表示式的值分為高位元組和低位元組。如果表示式是一個常量,則將其分離成高8位和低8位,若果表示式是一個地址,則分離出它的高位元組和低位元組。
THIS運算子:一般與等值運算子EQU連用,用來定義一個變數或標號的型別屬性。所定義的變數或標號的段基值和偏移量與緊跟其後的變數或標號相同。
4.5程式的段結構:
四個段暫存器CS,DS,ES,SS。使用偽指令來使用和定義這些段。
(1)段定義偽指令:SEGMENT和ENDS定義一個邏輯段,必須配對,表示定義的開始和結束。段名是由使用者自己任意選定的。一個段的開始與結尾必須是一致的。
(2)定位型別:決定段的起始邊界,第一個可存放資料的位置。不是段基址,可以有四種。PAGE(表示該段從一個頁面的邊界開始)。PARA型別表示該段從一個小節的邊界開始,一般預設值都是PARA。WORD,偶數字節地址開始。BYTE表示可以是任一地址值。
(3)組合型別:段與段之間的連線關係和定位。六種形式查就可以了。
(4)類別名。必須用單引號引起來,所用字串可以任意選定,它不能使用程式中的標號、變數名或其他定義的符號。
二、段定址偽指令:
ASSUME的作用是告訴彙編程式在處理源程式時,定義的段與哪個暫存器關聯。ASSUME並不設定各個段暫存器的具體內容,段暫存器的值是在程式執行時實現的。
在一個程式碼段中可以有幾條ASSUME偽指令,對於前面的設定,可以用ASSUME改變原來的設定。可以使用關鍵字NOTHING將前面的設定刪除。
三、段暫存器的裝入:
段基值裝入到段暫存器裡去。
(1)DS和ES的裝入:在程式中使用資料傳送模式傳輸
(2)SS的裝入:兩種方法,使用STACK引數,並在定址偽指令語句中把該段與SS段暫存器關聯。或使用類似於DS和ES的裝入方法。
(3)CS的裝入:必須在程式執行前裝入CS和IP的值,因此,CS和IP的初始值就不能用可執行語句來裝入。
4.6過程定義偽指令
(PROC/ENDP)過程其實就是一個程式。被用作CALL的目的運算元,它類同一個標號的作用。
過程名 PROC[NEAR/FAR]
……
RET
……
過程名 ENDP
4.7當前位置計數器$與定位偽指令ORG
將表示式的值賦給當前位置計數器,ORG語句後面的指令或資料以表示式給定的值作起始偏移量。
4.8標題偽指令TITLE
TITLE 標題名
功能:給程式指定一個標題,以便在列表檔案中每一頁的第1行都顯示這個標題。字串個數不能超過60。
4.9從程式返回作業系統的方法
一般有兩種方法:
- 使用程式字首PSP(100H位元組),將程式碼段(CS)指向EXE程式的程式碼段,SS指向堆疊段,DS和ES並不指向使用者程式的資料段和附加段,而是指向PSP。
在PSP首地址(第一、二位元組)有一條軟中斷指令“INT
20H”(有關中斷部分我會在以後說到),而這條指令的功能就是結束使用者程式返回作業系統,因此可以用程式段字首實現返回DOS,其步驟如下:
a、將程式編織成一個過程,並且將過程的型別屬性設定為FAR
b、將PSP的起始邏輯地址壓入堆疊,即將“INT
20H”指令的地址壓入堆疊。由於EXE檔案裝入記憶體時DS和ES都是指向PSP的,因此用指令“PUSH
DS”就可以實現將PSP的起始邏輯地址壓入堆疊的操作。
c、在程式編制而成的過程結束時使用返回指令RET,這樣執行該指令時系統便會將儲存在堆疊中的PSP起始邏輯地址彈出到CS和IP中,進而轉去執行PSP首地址處的指令INT
20H, 從而實現返回DOS的目的。 - 用4CH系統功能呼叫實現返回
4CH系統呼叫功能是結束程式執行返回DOS,因此可以利用它來完成程式返回作業系統,其具體方法是在程式
結束時使用下列命令:
MOV AH, 4CH
INT 21H
但並不是任何程式都可以用這種方法來實現返回DOS的,只有返回DOS的主程式才能使用這種方式,而對於呼叫的子程式應該返回給的是呼叫程式而不是系統,所以不能用4CH實現返回。