匯編語言源程序中以語句表示指令,語句有三種基本類型:
1、指令:匯編后形成一條機器語言指令,它們之間是一一對應的,在程序執行時指令得以執行。
2、偽指令:只是告訴匯編程序如何進行匯編,匯編后沒有生成機器語言指令,他在程序匯編時得以執行。
3、宏指令:它是由用戶自己定義的指令,由指令和偽指令構成,他在程序匯編進行時宏展開,以相應的指令和偽指令替代宏指令。
1/1、匯編語言中語句的組成
匯編語言中的語句由以下四部分組成:
名稱 空格或: 操作助記符 空格 操作數 ;注釋
注 : 每條語句可以有名稱,也可以沒有名稱。這種名稱有兩種含義:
1. 標號: 當語句中名稱與助記符之間以冒號間隔時,該名稱表示標號,用於表示指令的地址(段地址、偏移地址)。
2. 變量名: 當語句中名稱與助記符之間以空格間隔時,該名稱表示變量名,用於表示存放數據的儲存空間。
1/2、匯編語言中的常數與表達式
常數 :
數值:B(二進制)、 D(十進制)、 H(十六進制)
字符串: 單引號內部 ,表示各字符的ASCII 碼
表達式 : 由操作數和操作符組成
""" 算數操作符:+、-、*、/、MOD 邏輯操作符:AND OR NOT XOR 關系操作符:EQ(相等)、 EN (不等) LT (小於)、 GT (大於) LE (小於等於)、GE(大於等於) """
1/3 標號、變量
#標號用於指示相應指令的地址,與助記符之間用冒號間隔 例 : START:MOV AX,1000 注: 標號START代表了指令“ START:MOV AX,1000”的地址,這樣,可以使用轉移語句JMP START ,轉移到改地址。
#變量由偽指令來定義,之間用空格而不是冒號 格式為: 變量名 DB/DW/DD/DQ/DT 表達式 ;定義(8/16/32/64/80) 注: 1、變量名可有可無 2、一個或多個表達式或常數之間用逗號分隔 3、一個、多個問號(?),這是表示只給變量分配存儲空間 4、重復方式,這時表達式的形式為 重復次數 DUP (表達式)
5、$ 出現在表達式中時,表示當前匯編語句的偏移地址
6、偽指令 DW DD 的特殊用法
偽指令DD DW 除定義變量外,還可以用來預置變量的段內偏移地址
DW 用法格式 : 變量名1 DW 變量名2
例: AD2 DW AD1 ; AD2指向AD1的起始地址
DD 用法格式和上面用法相同
例: AD4 DD AD1 ; AD4指向AD1的起始地址(只是DD為雙字,第一個字內存放段內偏移地址,第二個字為段地址)
1/4 屬性操作符和PTR 操作符
PTR操作符可以用來暫時改變已經定義過的變量或標號的類型(包括BYTE字節型、WORD字型、DWORD雙字型,也可以取標號的類型NEAR近型、FAR遠型)
使用格式 : 類型 PTR 表達式
#屬性操作符 SEG 取出段地址 OFFSET 取出偏移地址 TYPE 取出其類型 LENGTH 取出變量重復的次數 SIZE 取出變量的大小
2/1 數據與轉移地址的尋址方式
1、數據的尋址方式:尋找指令操作所需數據的方法
2、轉移地址的尋址方式: 尋找轉移指令所需程序地址的方法
#數據的尋址方式 8086CPU指令系統的常用數據尋址方式有8種:立即尋址、寄存器尋址、存儲器尋址(5種:直接尋址、寄存器間接尋址、寄存器相對尋址、基址變址尋址、基址變址且相對尋址)、隱含尋址 以下通過一些例子介紹較難理解的尋址方式: #寄存器相對尋址 MOV CX,VAR1[BX] ; (CX)<--((BX)+OFFSET VAR1) MOV AL,VAR2[DI-15] ; (AL)<--((DI)+(OFFSET VAR2 -15)) MOV 5[SI+24],DX ;((SI)+(5+24))<--(DX) #基址變址尋址 MOV DX,[BX][SI] ;(DX)<--((BX)+(SI)) MOV AX,[BP][SI] ;(AX)<--((BP)+(SI)) BP默認段地址在SS段 #基址變址且相對尋址 MOV VAR1[BP][DI],AX ;((BP)+(DI)+OFFSET VARI)<--AX #隱含尋址 MOVSB ;指令含義:從(DS:SI)的存儲單元中取出一個字節,傳送 到(ES:DI)存儲單元,並且SI和DI的內容自動增1(當DF=1)時,或自動減1(當DF=1時) #轉移地址的尋址方式 轉移地址的尋址方式有4種:段內直接方式與間接方式、段間直接方式與間接方式
2/1
數據傳送類指令 :通用傳送類指令 MOV
獲取有效地址指令 LEA
獲取地址指針指令 LDS, LES
標志傳送指令 LAHF, SAHF
數據交換指令 XCHG
字節轉換指令 XLAT
堆棧操作指令 PUSH, POP, PUSHF, POPF

#通用傳送指令 格式MOV DST,SRC ; 說明:將源操作數中的一個字節或一個字傳送到目的操作數所指定的位置。 注意:MOV指令不能直達的路徑: (1)、立即數 段寄存器 (2)、存儲單元 存儲單元 (3)、段寄存器 段寄存器 如果要完成以上這些數據的傳送,可以分以下步驟完成 立即數--通用寄存器--段寄存器 """ MOV AX,3A01H MOV DS,AX """ 存儲單元--通用寄存器--存儲單元 """ MOV AX,VAR1 MOV VAR2,AX """ 段寄存器--通用寄存器--段寄存器 """ MOV AX,CS MOV DS,AX """ (CS寄存器不能用作目的寄存器) 對於雙操作指令,兩個操作數的類型必須匹配: ~兩者都指定了類型,則必須一致,否則出錯 ~兩者之一指定了類型,一般指令無措 ~兩者都無類型,則指令出錯 對於操作數的類型 ~立即數是無類型的 ~不含變量名的直接尋址、寄存器相對尋址、寄存器間接尋址、基址變址尋址、基址變址且相對尋址的操作數也是無類型的 ~利用PTR操作符可指定或暫時改變存儲單元的類型 從形式上看,立即數有:由常數等組成的表達式、所有由屬性操作符得到的標號或變量的屬性(OFFSET SEG LENGTH TYPE 等 )

1 #取有效地址指令LEA 2 格式:LEA REG16,MEM 3 說明:取有效地址指令LEA可以將源操作數的有效地址送入16位寄存器REG16,它傳送的不是MEM(存儲單元)的內容,而是存儲單元的有效地址。這里源操作數MEM只能是直接尋址方式 4 5 例如: 6 LEA DI,VAR1 :等同於 MOV DI,OFFSET VAR1 7 LEA BX,VAR1+15 8 9 #取地址指針指令 LDS LES 10 格式:LDS REG16,MEM :(DS)<--(MEM+2),(REG16)<--(MEM) 11 LES REG16,MEM :(ES)<--(MEM+2),(REG16)<--(MEM) 12 說明:取地址指令LDS可以將雙字節變量MEM內容的高16位送入到DS,低16位送入指定的REG16中,取地址指令LES可以將雙字節變量MEM內容的高16位送入到ES,低16位送入指定的REG16中. 13 注意:這里的REG16不允許為段寄存器

1 格式 :LAFH ;(AH)<--PSW的寄存器的低8位 2 SAHF ;PSW的寄存器的低8位<--(AH) 3 說明:指令LAHF可以將PSW寄存器中的低8位傳送到集訓器AH中,而指令 SAHF可以將AH的內容傳送到PSW寄存器的低8位。源操作數和目的操作數的尋址方式均為隱含尋址方式

1 #數據交換指令 XCHG 2 格式:XCHG DST,SRC ;DTS<-->SRC 3 說明:數據交換指令完成兩個操作數之間數據的交換,但兩者不能同時為存儲單元,XCHG指令可以完成寄存器與寄存器之間、寄存器和存儲單元之間的內容交換,但應該注意,這里不能采用段寄存器。

1 #字節轉換指令 2 格式:XLAT ;(AL)<--((BX)+(AL)) 3 說明:字節轉換指令XLAT可以將有效地址BX+AL的存儲單元的內容送入AL。當輸入為一個字節(AL的內容時)時,輸出也是一個字節(同樣存放在AL中) 4 例: 5 在DS段: 6 7 TABLE DB 30H,31H,32H,33H,34H 8 在CS段: 9 MOV AL,4 10 LEA BX,TABLE 11 XLAT 12 13 '''即AL=34H 字符'4' '''

1 #堆棧操作指令 2 堆棧必須按字操作!且操作數不能為立即數 3 堆棧的段地址由SS指定,堆棧的偏移地址由SP指定 4 5 格式:PUSH SRC 6 PUSHF 7 POP SRC 8 POPF 9 10 說明:將SRC壓入堆棧 11 將PSW的內容壓入堆棧 12 從堆棧彈出一個字送入到SRC 13 從堆棧中彈出一個字送入到PSW 14
2/2
算數運算類指令:
加減法指令 ADD ADC INC SUB SBB DEC NEG
比較指令 CMP
乘除法指令 MUL IMUL DIV IDIV
符號擴展指令 CBW CWD
BD數運算調整指令 AAA DAA AAS DAS AAM AAD

#加法指令 ADD ADC 格式:ADD DST,SRC ;(DST)<--(SRC)+(DST) ADC DST,SRC ;(DST)<--(SRC)+(DST)+(CF) 說明:ADC為帶進位的加法指令 ADD ADC指令會正常影響PSW中的6個狀態標志位:CF AF OF SF ZF PF #增量指令 INC DST ;(DST)<--(DST)+1 INC指令可以影響PSW中的5個標志位,但不會影響CF位。 #減法指令 SUB SBB 格式:SUB DST,SRC SBB DST,SRC 說明:同加法 #減量指令 格式:DEC DST 說明:同加法

1 #比較指令 2 格 式:CMP DST,SRC ;(DST)-(SRC),並設置PSW中的 狀態標志位 3 說 明:(DST)-(SRC),並設置PSW中的 狀態標志位,但其結果不保存到DST。CMP指令會影響PSW中的6個狀態標志位 4 對兩個數進行CMP運算,其主要的目的是為了比較兩個數的大小、相等關系 5 ~若兩個數相等,則ZF=1 6 ~SF等同於最高位 7 ~CF OF視具體情況而定, 8 當兩個無符號數進行比較時, 9 如果CF=0 ZF=0則表示DST>SRC 10 如果CF=1 則表示DST<SRC 11 當兩個有符號數進行比較時, 12 OF=1表示運算產生了溢出,但大小的比較要根據OF和SG共同決定,當 OF 與上 SF == 0 時,DST >=SRC,當OF SF 同時為1時,DST<SRC
微處理器狀態字PSW各標志位(9個):
CF:進位標志 D7或D15有無進位,有進位CF=1
PF:奇偶標志 操作結果的低8位含有‘1’的個數,偶數個為1,奇數個為0
AF:輔助進位標志 D3位有無進位,有進位AF=1
ZF:零標志位 運算結果為0時ZF=1
SF:符號標志 操作結果為負SF=1
OF:溢出標志 溢出OF=1
DF:方向標志DF=0時,變址寄存器(SI,DI)的內容遞增
TF:陷阱標志 TF=1時,CPU處於單步執行方式
IF :中斷允許標志 IF=1時,CPU能夠響應中斷請求
兩點說明:
CPU只要涉及運算,其結果就會影響狀態標志
段寄存器不能參與運算