匯編語言指令


 

匯編語言源程序中以語句表示指令,語句有三種基本類型:

  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  等 )
MOV
 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不允許為段寄存器
LEA LDS LES
1 格式 :LAFH    ;(AH)<--PSW的寄存器的低8位
2           SAHF    ;PSW的寄存器的低8位<--(AH)
3 說明:指令LAHF可以將PSW寄存器中的低8位傳送到集訓器AH中,而指令    SAHF可以將AH的內容傳送到PSW寄存器的低8位。源操作數和目的操作數的尋址方式均為隱含尋址方式
LAHF SAHF
1 #數據交換指令 XCHG
2 格式:XCHG DST,SRC   ;DTS<-->SRC
3 說明:數據交換指令完成兩個操作數之間數據的交換,但兩者不能同時為存儲單元,XCHG指令可以完成寄存器與寄存器之間、寄存器和存儲單元之間的內容交換,但應該注意,這里不能采用段寄存器。
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' '''
XLAT
 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             
PUSH POP PUSHF POPF

 

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
說明:同加法
ADD ADC INC SUB SBB DEC NEG
 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
CMP

 

 

微處理器狀態字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只要涉及運算,其結果就會影響狀態標志

段寄存器不能參與運算

 

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM