【Chapter4】匯編語言及其程序設計,《微機系統》第一版,趙宏偉

一、匯編語言概述

**指令:**指使計算機完成某種操作的命令。

**程序:**完成某種功能的指令序列。

**軟件:**各種程序總稱。

**機器語言:**計算機能直接識別的語言。用機器語言寫出的程序稱為機器代碼。

**匯編語言:**用字符記號代替機器指令。用匯編語言編寫的程序叫匯編語言源程序。

**匯編程序:**一種翻譯程序,把助記符翻譯成機器語言

在計算機上運行匯編語言程序的步驟:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

二、匯編語言語句格式

匯編語句格式有4個字段:

[名字]	操作符	操作數;	[注釋]

[名字]:

  1. 一種標識符

  2. **組成:**AZ,az,0~9;專用符號 ? . @ _ $

  3. 限制:

    1. 第一個字符不能是數字
    2. “.” 必須是第一個字符
    3. 前31個字符有效
    4. 不能為關鍵字
  4. **類型:**標號-指令符號地址

    ? 變量-數據符號地址

操作符:

  • **組成:**CPU指令、偽指令、宏指令

[注釋]:

  • 說明程序、指令的功能,增加程序的可讀性

三、指令格式

一條指令由五部分組成:前綴、操作碼、{尋址方式、偏移量、立即數}(操作數)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

3.1 前綴

**前綴:**是對指令的某種限定或說明。可分為下面四種:

  1. **指令前綴:**說明指令的相關特性。如LOCK、REP、REPE/REPZ、REPNE/REPNZ
  2. 段超越前綴:用超越段取代默認段。三種情況禁止段超越串操作(ES)、堆棧指令(SS)、代碼段(CS)
  3. **操作數大小前綴:**改變默認的數據長度。16→32,32→16。
  4. **地址大小前綴:**改變默認的地址長度。
  • 在實地址、虛擬8086方式下,隱含尋址16位。
  • 在保護方式下,隱含尋址由段描述符中的D位確定,D = 0默認是16位,D = 1默認是32位
  • 指令前綴段超越前綴用于改變顯式特性,2選1,由編程人員編寫
  • 操作數大小前綴地址大小前綴用于改變隱式特性,可共存,由匯編程序自動加入。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

3.2 操作碼

**操作碼:**規定了微處理器執行的操作,如加、減、傳送等。

Pentium微處理器指令的操作碼長為1或2個字節。第一個字節的前6位是操作碼,其余兩位中的D位用來指示數據流的方向W位用來指示數據的長度是字節還是字或雙字。

  • D=1,R/M -> REG
  • D=0,REG-> R/M
  • W = 1,字,或雙字
  • W = 0,字節

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

3.3 尋址方式

**尋址方式:**用來指出CPU獲取操作數的方式,如寄存器尋址、直接尋址、寄存器間接尋址等。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(1)MOD域

MOD域:規定所選指令的尋址方式,選擇尋址類型及所選的類型是否有位移量

MOD域 共2位4種組合含義如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(2)REG域 & MOD = 11下 的R/M域

REG域或者MOD=11時表示R/M選中R三位代碼組合的8種情況的含義如下:

其實就是4個數據寄存器和4個指針和變址寄存器

在W 指示 數據長度為 字節、字、雙字時分別表示寄存器使用8、16、32位

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(3)R/M域

MOD != 11時,表示用于存儲器尋址

其含義如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • MOD = 00、01、11分別表示:無偏移量、8位偏移量、16位偏移量
  • 表格中每一項上下分別表示:段內偏移 和 尋址方式的隱含段

3.4 位/偏移量及立即數

**位/偏移量:**允許指令中直接給出尋址方式所需的位/偏移量。

**偏移量: ** 直接尋址的地址,無符號數,如 MOV AX,[2000H]

位移量: 相對尋址中的地址數據,有符號數,如 MOV AX,[SI+6]

立即數:允許指令中直接給出操作數。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

四、尋址方式

一條匯編指令要解決2個問題:

  1. 做什么
  2. 對象,或對象來源,即尋址方式

**尋址方式掌握要點:**側重理解操作數的尋址過程,如何找到一個操作數。

有2類尋址:

  1. 對操作數尋址
  2. 對轉移地址、調用地址尋址

4.1 數據的尋址方式

Pentium系統中使用字節(8位)、字(16位)、雙字(32位)和4倍字(64位)。采用低端存儲方式。

與數據有關的尋址方式有11種:

  1. 立即數尋址
  2. 寄存器尋址
  3. 存儲器尋址
    1. 直接尋址
    2. 寄存器間接尋址
    3. 寄存器相對尋址
    4. 基址變址尋址
    5. 相對基址變址尋址
    6. 比例變址尋址
    7. 相對比例變址尋址
    8. 基址比例變址尋址
    9. 相對基址比例變址尋址

4.1.1 立即尋址

**立即尋址:**操作數是指令的一部分。完整地取出該條指令之后也就獲得了操作數。這種操作數稱為立即數。

主要用于對寄存器賦值,速度快。

匯編語言規定: 立即數必須以數字開頭,以字母開頭的十六進制數前必須以數字0做前綴數制用后綴表示,(B表示二進制數,H表示十六進制數,(D或者缺省表示十進制數,Q表示八進制數,程序員可以用自己習慣的計數制書寫立即數。匯編程序在匯編時,對于不同進制的立即數一律匯編成等值的二進制數,有符號數以補碼表示。

此外,立即數還可以是用+、-、x、/ 表示的算術表達式。匯編程序按照先乘除后加減的規則自動計算,也可以用圓括號改變運算順序。

立即尋址的例子

MOV AL, 01010101B
MOV BX, 1234H
MOV EAX, 12315678H

4.1.2 寄存器尋址

**寄存器尋址:**操作數在CPU的某個寄存器中,指令指定寄存器號。

寄存器尋址是最通用的數據尋址方式。對于8位操作數,寄存器有AH、AL、BH、BL、CH、CL、DH和DL;對于16位操作數,寄存器可以是AX、BX、CX、DX、SP、BP、SI和DI;在80386以上的微處理器中,還可以是32位操作數,寄存器有EAX、EBX、ECX、EDX、ESP、EBP、EDI和ESI。

有些用寄存器尋址的MOV、PUSH和POP指令可尋址16位的段寄存器(CS、ES、DS、SS、FS和GS)。

寄存器尋址的例子:

MOV DS, AX
MOV EAX, ECX
MOV DL, BH

4.1.3 存儲器尋址

**存儲器尋址:**操作數在存儲器中

存儲器地址:

  • 物理地址
  • 邏輯地址: 段基址:偏移量

CPU要訪問存儲器操作數,必須先計算存儲器的物理地址。

在實地址和保護方式下,段基址的獲取方式不同,但偏移量的獲取思想基本一致。

在存儲器尋址方式中,要解決的問題是如何取得操作數的偏移地址。

有效地址EA:Effective Address,在8086~Pentium微處理器里,把操作數的偏移地址稱為有效地址EA。

有效地址的計算
E A = 基址 + ( 變址 × 比例因子 ) + 位移量 EA = 基址 + (變址\times 比例因子) + 位移量 EA=基址+(變址×比例因子)+位移量
基址:基址寄存器中的內容。基址寄存器通常用于編譯程序指向局部變數據段中數組或字符串的首地址

變址:變址寄存器中的內容。變址寄存器用于訪問數組或字符串的元素

**比例因子:**32位機的尋址方式。尋址中,用變址寄存器的內容乘以比例因子得到變址值。該方式對訪問數組特別有用。(就類比c語言,字符指針+1是移動1個字節,int指針是4個字節,這里的比例因子就起到類似作用,為1就是一次8位,2就是一次16位)

**位移量:**指令中的一個數,但不是立即數,而是一個地址。

8086/286是16位尋址,80386及以后機型是32位尋址,也可用16位尋址。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

9種存儲器尋址方式

如下表:(星號代表二者選一個)

我們發現相對尋址都是帶位移量的,比例尋址都是帶比例因子的

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

存儲器尋址舉例

如下表:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • 我們匯編指令中,用“[]”括起來的操作數代表EA
  • 由于我們處理器是分頁存儲,我們還需要知道段基址,前面提過了指令格式中的尋址方式是有隱含段

尋址方式的段約定和段超越

我們描述段超越的方式就是:在間址前面加上段名加“:”

下面是一些示例:

MOV AL, DS: [BP]	; 用BP間址訪問數據段
MOV AL, ES: [BP]	; 用BP間址訪問ES附加段
MOV AL, FS: [EBP]	; 用EBP間址訪問FS附加段
MOV AL, CS: [BX]	; 用BX間址訪問代碼段
MOV AL, ES: [SI+5]	; 用SI變址尋址,訪問ES附加段
MOV AL, GS: [EAX+10] ; 用EAX基址尋址,訪問GS附加段

為提高程序的可讀性和效率,要盡量少使用段超越

各存儲器操作類型的隱含段、可使用超越段、段內偏移量描述如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

4.2 轉移地址的尋址方式

**轉移地址尋址:**用于確定轉移指令和CALL指令的轉向地址。

轉移指令使程序不再順序執行,而是按指令中給出的操作數轉移到相應的目的地址。

轉移地址:轉移指令中的操作數是轉移的目的地址,稱為轉移地址。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

轉移指令調用指令分為:

  • 段內(IP/EIP)轉移
    • 直接(相對)轉移
    • 間接
  • 段間(CS:IP/EIP)轉移
    • 直接
    • 間接

4.2.1 段內相對尋址

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(位移量+IP = EA)→IP/EIP,即把有效地址EA送給IP/EIP

位移量是相對值,所以稱為段內相對尋址。

因為是相對值,所以便于程序再定位。

用于條件轉移、無條件轉移,條件轉移只能用此方式。

**短跳轉:**JMP SHORT AA9 ;位移量 8位,-128 ~ +127

**近跳轉:**JMP NEAR PTR AA8 ;位移量 16位 ± 32K,32位 ± 2G

4.2.2 段內間接尋址

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • 寄存器(存儲器)內容 = EA→IP/EIP
  • 這種尋址方式不能用于條件轉移指令。
  • JMP BX
  • JMP WORD PTR[BX + AA7]
  • JMP ECX

4.2.3 段間直接尋址

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

指令給出一個邏輯地址,段地址送給CS,段內偏移送給IP或EIP

  • 目標段地址:偏移量 = CS:IP/EIP
  • JMP FAR PTR AA6

4.2.4 段間間接尋址

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

  • 連續的存儲器單元內容 = CS:IP/EIP
  • JMP DWORD PTR [SI];[SI]指向的字送入IP,[SI + 2]指向的字送入CS。

4.3 堆棧地址尋址

**堆棧:**以“先進后出”方式工作的一個特定的存儲區。

一端固定,稱為棧底;另一端浮動,稱為棧頂,只有一個出入口。

**堆棧作用:**保存傳遞參數、現場參數、寄存器內容、返回地址。

80x86規定:

  1. 堆棧向小地址方向增長。
  2. 必須使用堆棧段SS。
  3. PUSH指令壓入數據時,先修改指針按照指針指示的單元存入數據。
  4. POP指令彈出數據時,按照指針指示的單元取出數據再修改指針
  5. 壓入和彈出的數據類型(數據長度)不同,堆指針修改的數值也不同。

16位堆棧地址操作,還是32位堆棧地址操作,由堆棧段SS寄存器內的數提段描述符的屬性說明,確定用SP還是ESD,是一種隱含屬性。

五、指令系統

**指令系統:**指令的集合。軟硬件交界面。

**指令系統掌握要點:**側重掌握指令的功能和使用方法,為后續程序設計打基礎。

  • 8086-110條指令
  • 80286-143條指令
  • 80386-154條指令
  • 80486-160條指令
  • Pentium - 165條指令

Pentium指令系統按功能分為10類:

數據傳送指令、算術運算指令、BCD碼調整指令、邏輯運算指令、位處理指令、控制轉移指令、條件設置指令、串操作指令、處理器控制
指令、保護模式系統控制指令。

5.1 數據傳送指令

**數據傳送指令功能:**源 -> 目

指令執行后,源操作數不變,不影響狀態標志

5.1.1 MOV 傳送(move)

格式:MOV DST, SRC	;	(DST) <- (SRC)

源、目長度相等。CS可出不可入

MOV WORD PTR[BX], 10H;立即數10H送入BX指向的字存儲單元

數據間傳輸關系如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.2 PUSH進棧指令

格式:PUSH SRC	; 堆棧 <- (SRC)

操作:

  • 16位指令:(SP) <- (SP - 2), ((SP) + 1, (SP)) <= (SRC)
  • 32位指令:(ESP) <- (ESP - 4), ((ESP) + 3, (ESP) + 2, (ESP) + 1, ESP) <- (SRC)

類型:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.3 POP出棧(pop from the stack)

格式:POP DST	; (DST) <- 堆棧棧頂內容

操作:

  • 16位指令:(DST) <- (SP + 1, SP), (SP) <- (SP + 2)
  • 32位指令:(DST) <- (ESP + 3, ESP + 2, ESP + 1, ESP), (ESP) <- (ESP + 4)

類型:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

堆棧指令舉例:

MOV AX, 1122H
MOV BX, 3344H
MOV SP, 3110H
PUSH AX
PUSH BX
MOV AX, 0
MOV BX, 0
POP BX
POP AX

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.4 PUSHF / POPF 16位標志寄存器進棧/出棧

格式:PUSHF ;	標志寄存器低16位壓入堆棧POPF	; 從棧頂彈出2個字節送入標志寄存器低16位

5.1.5 XCHG交換 (exchange)

格式:XCHG OPR1, OPR2	;	(OPR1) <-> (OPR2)

類型:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.6 CBW 字節轉換為字 (convert byte to word)

格式:CBW	;	AX <- AL符號擴展

5.1.7 CWD 字轉換為雙字 (convert word to byte)

格式:CWD	; DX:AX <- AX符號擴展

低16位在AX,包括符號位的高16位在DX

5.1.7 LEA 有效地址送寄存器 (load effective address)

格式:LEA REG, SRC	; (REG) <- (SRC)的有效地址

類型:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

操作規則:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

LEA經常用來初始化地址指針

示例如下:

體會一下LEA的作用

MOV AX, MEM ; AX = 3412H
LEA AX, MEM ; AX = 3100H
MOV BX, 2000H
MOV DS, BX
MOV SI, 1000H
MOV AX, [BX+SI+102H] ; AX = 7856H
LEA BX, [BX+SI+102H] ; BX = 3102H

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.8 LAHF 標志送AH (load AH with flags)

格式:LAHF	; AH <- flags低8

5.1.9 AH 送 SAHF 標志寄存器 (store AH into flags)

格式:SAHF	; flags低8<- AH

5.1.10 LDS、LES、LFS、LGS、LSS 指針送寄存器和段寄存器

格式:LDS REG, SRC

功能:

(REG) <- [SRC]

(DS) <- [SRC + 2] (16位EA)

(DS) <- [SRC + 4] (32位EA)

例如:已知(DS)=5100H,(BX)=2000H

LES DI, [BX]

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.11 XLAT 換碼 (translate)

格式:XLAT 

功能:完成代碼轉換,偏移量8位,表長 <= 256

16 位 指令 (AL) <- [(BX) + (AL)]

32 位 指令 (AL) <- [(EBX) + (AL)]

例如:我們通過下面的指令可以實現AL從09H -> 39H

已知(DS) = 5000H,(BX) = 4000H,(AL) <- 09H

XLAT	; AL = 39H

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.1.12 IN / OUT 輸入/輸出 (不需要段地址)

(1)IN 輸入指令(input)

1、直接尋址 (端口地址 <= 255)

IN AL, n; 字節,(AL) <- (n)
IN AX, n;, (AL + 1) <- (n + 1) (AL) <- (n)
IN EAX, n; 雙字, (EAX+3) <- (n+3),(EAX+2) <- (n+2),(EAX+1) <- (n + 1),(EAX) <- (n)

2、間接尋址(全部端口地址可用)

IN AL, DX; 字節, (AL) <- (DX)
IN AX, DX; 字, (AH) <- ((DX + 1)), (AL) <- (DX)
IN EAX, DX; 雙字, 類似

(2)OUT 輸出指令(output)

1、直接尋址 (端口地址 <= 255)

OUT n, AL; 字節,(n) <- (AL)
OUT n, AX; 字
OUT n, EAX; 雙字

2、間接尋址(全部端口地址可用)

OUT DX, AL; 字節, (DX) <- (AL)
OUT DX. AX; 字
OUT DX, EAX; 雙字

5.2 算術運算指令

5.2.1 ADD加法

格式:ADD DST, SRC; (DST) <- (SRC) + (DST)

類型:影響CF、PF、AF、ZF、SF、OF。可進行8、16、32位操作。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

5.2.2 ADC 帶進位加法指令 (add with carry)

格式:ADC DST, SRC; (DST) <- (SRC) + (DST) + CF

和ADD唯一不同就是加了個CF

5.2.3 SUB減法 (subtract)

格式:SUB DST, SRC; (DST) <- (DST) - (SRC)

5.2.4 SBB帶借位減法 (subtract with borrow)

格式:SBB DST, SRC; (DST) <- (DST) - (SRC) - CF

和ADD唯一不同就是減了個CF

5.2.5 INC 加1 (increment)

格式:INC OPR ; (OPR) <- (OPR) + 1

5.2.6 DEC 減1 (decrement)

格式:DEC  OPR ; (OPR) <- (OPR) - 1

5.2.7 NEG求補 (negate)

格式:NEG  OPR ; (OPR) <- ~(OPR) + 1,就是補碼

3條指令共性說明:

  1. 目的操作數:通用寄存器、存儲器單元,可以是8位、16位或32位
  2. 執行INC、DEC指令后,影響AF、OF、PF、SF、ZF,但對CF沒有影響。
  3. 執行NEG指令后,影響AF、CF、OF、PF、SF、ZF這6個標志位。
  4. 如果原來的操作數為80H(即-128),執行NEG指令后,仍為80H,此時OF=1,溢出。
  5. 操作數=0時,在執行NEG指令后,CF=0;其他操作數,執行NEG指令后,CF總為1。

5.2.8 CMP 比較(Compare)

把大小關系轉化為標志位的狀態

格式:CMP OPR1, OPR2; (OPR1) - (OPR2)

5.2.9 MUL 無符號乘法(unsigned multiple)

格式:MUL SRC

功能:

  • 字節乘 (AX) ← (AL) × (SRC)
  • 字乘 (DX:AX) ← (AX) × (SRC)
  • 雙字乘 (EDX:EAX) ← (EAX) × (SRC)

說明:

  1. 乘數和被乘數必須等長
  2. SRC:通用寄存器、存儲器單元。
  3. 被乘數:默認AL、AX、EAX之一
  4. 若乘積的高半部分結果為0,則CF=0、OF = 0;否則,CF = 1、OF = 1。而AF、PF、ZF、SF無定義,即狀態不定。

5.2.10 IMUL 帶符號數乘法 (signed multiple)

格式1:IMUL SRC

功能:

  • 字節乘 (AX) <- (AL) × (SRC)
  • 字乘 (DX:AX) <- (AX) × (SRC)
  • 雙字乘 (EDX:EAX) <- (EAX) × (SRC)

5.2.11 DIV 無符號數除法 (unsigned divide)

格式:DIV SRC

功能:

  • 字節除(AL) ← (AX)/(SRC)的商,(AH)←(AX)/(SRC)的余數,如果結構一個字節裝不下就是除法溢出,下面類似不再贅述
  • 字除(AX) ← (DX:AX)/(SRC)的商,(X)←(X:AX)/(SRC)的余數
  • 雙字除(EAX) ← (EDX:EAX)/(SRC)的商,(EDX)←(EDX:EAX)/(SRC)的余數

說明:

被除數默認在AX、DX:AX、EDX:EAX中。SRC是通用寄存器、存儲器單元。所有標志位無定義。

5.2.12 IDIV 帶符號數除法 (signed divide)

格式:IDIV SRC

功能:和DIV指令相同

5.3 BCD碼調整指令

在 Pentium 微處理器中,表示十進制數的 BCD 碼可以用壓縮的 BCD 碼和非壓縮的BCD碼兩種格式來表示。

壓縮的BCD碼,每4位二進制數表示一位十進制數,每字節存2個BCD 碼,對于n位十進制數,則需用4 × n位二進制數。

非壓縮的BCD碼,每字節用低 4位表示1位 BCD 碼,而高4位無意義。

而我們的運算指令只適用于二進制運算,所以我們需要針對BCD碼的調整指令來將BCD碼調整為二進制數。

5.3.1 DAA 壓縮BCD碼加法調整(decimal adjust for addition)

格式: DAA

功能:

  1. 如果AL的低4位大于9或AF=1,則(AL)+6→(AL)和 1→AF。
  2. 如果AL的高4位大于9或CF=1,則(AL)+60H→(AL) 和 1→CF。

說明:

  1. 只對AL調整
  2. OF無定義, 其他5個狀態受影響

例:

MOV AL, 54H;	54H代表十進制數54
MOV BL, 37H;	37H代表十進制數37
ADD AL, BL;		AL中的和為十六進制數8BH
DAA	;		AL = 91H, AF = 1, CF = 0

5.3.2 DAS 壓縮BCD碼減法調整 (decimal adjust for subtraction)

格式: DAS

功能:

  1. 如果AL的低4位大于9或AF=1,則(AL)-6→(AL)和 1→AF
  2. 如果AL的高4位大于9或CF=1,則(AL)-60H→(AL)和 1→CF

5.3.3 AAA 非壓縮BCD碼加法調整 (ASCII adjust for addition)

格式: AAA

功能:

  1. 如果AL的低4位小于等于9,并且AF=0,則轉步驟3;

  2. (AL)+6→AL, 1→AF, (AH)+1→AH;

  3. AL高4位清0;

  4. AF→CF。

說明: 影響AF和CF, 而PF、SF、ZF、OF無定義。

5.3.4 AAS 非壓縮BCD碼減法減整 (ASCII adjust for subtraction)

格式: AAS

功能:

  1. 如果AL的低4位小于等于9,并且AF=0,則轉步驟3;
  2. (AL) - 6 → AL,1 → AF,(AH) - 1 → AH;
  3. AL高4位清0;
  4. AF→CF。

5.3.5 AAM 非壓縮BCD碼乘法調整 (ASCII adjust for multiplication)

格式: AAM

**格式:**AAM

功能:(AL)/0AH→(AH),余數→(AL)

**說明:**影響SF、ZF、PF,而OF、AF、CF無定義。

5.3.5 AAD 非壓縮BCD碼除法調整 (ASCII adjust for division)

格式: AAD

功能:(AH) × 10 + (AL)→(AL),0 → (AH)

**說明:**先調整后運算。影響SF、ZF、PF,而OF、CF和AF無定義

5.4 邏輯運算指令

5.4.1 AND 按位邏輯與運算

格式:AND DST,SRC;  (DST) <- (DST) & (SRC)

5.4.2 OR 按位邏輯或運算

格式:OR DST,SRC;  (DST) <- (DST) | (SRC)

5.4.3 XOR 按位邏輯異或運算(exclusive or)

格式:  XOR DST, SRC;  (DST)(DST) ^ (SRC)

5.4.4 TEST 按位邏輯比較運算

將兩個操作數按位與,但是不影響操作數

格式:TEST OPR1, OPR2;  (OPRI) & (OPR2)

4條指令類型:同ADD。

4條指令說明:CF、OF置0,影響SF、ZF、PF,AF無定義。

5.4.5 NOT按位取反

格式: N O T O P R ; ( O P R ) ← O P R  ̄ 格式:NOT OPR ; (OPR) \leftarrow \overline{OPR} 格式:NOTOPR;(OPR)OPR

**類型:**通用寄存器、存儲器單元,8位、16位、32位。

**說明:**不影響標志位。

5.5 位處理指令

5.5.1 SHL 邏輯左移(shift logical left)

格式:SHL OPR, CNT

5.5.2 SAL 算術左移(shift arithmetric left)

格式:SAL OPR, CNT

5.5.3 SHR 邏輯右移(shift logical right)

格式:SHR OPR, CNT

5.5.4 SAR 算數右移(shift arithmetric right)

格式:SAR OPR, CNT

移位指令說明:

  1. OPR:通用寄存器、存儲器單元。8位、16位、32位。
  2. CNT:8位立即數(1 - 31,8086中只能為1)、CL。
  3. CF依操作設置。OF當CNT=1時有效。

5.5.5 ROL 循環左移(rotate left)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

ROL OPR, CNT

5.5.6 ROR 循環右移(rotate right)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

 ROR OPR, CNT

5.5. 7 RCL 帶進位循環左移(rotate left through carry)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

RCL OPR, CNT

5.5.8 RCR 帶進位循環右移(rotate right through carry)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

RCR OPR, CNT

5.6 控制轉移指令

5.6.1 無條件段內相對短轉移(jump)

格式:JMP SHORT OPR

功能: (IP)←(IP) + 8位位移量 或 (EIP) ← (EIP) + 8位位移量

說明: SHORT是短轉移屬性描述符,8位位移量是一個帶符號數,范圍是-128到+127字節。

5.6.2 無條件段內相對近轉移

格式:JMP NEAR PTR OPR

功能: (IP) ← (IP) + 16位位移量 或 (EIP) ← (EIP) + 32位位移量

說明: NEAR是近轉移屬性描述符,16位、32位位移量是一個帶符號數。即和對應字長一樣大小。

5.6.3 無條件段內間接轉移

JMP OPR; OPR可以是寄存器、存儲器

功能: (IP)←(EA) 或 (EIP)←(EA)

5.6.4 無條件段間直接轉移

格式: JMP FAR PTR OPR ; OPR為指令的標號(即指令地址)

功能:

  • (IP/EIP)←OPR的段內偏移地址
  • (CS)←OPR所在段的段地址

5.6.5 無條件段間間接轉移

格式:  JMP DWORD PTR OPR; OPR為存儲器單元

功能:

  • (IP/EIP)←[EA]
  • (CS)←[EA+2] / EA+4]

5.6.6 條件相對轉移(8位偏移量)

1、單條件相對轉移

JZ/JE OPR; ZF=1轉移(結果為零或相等轉移)
JNZ/JNE OPR; ZF=0轉移(結果不為零或不相等轉移)
JS OPR; SF=1; 轉移(結果為負轉移)
JNS OPR SF=0; 轉移(結果為正轉移)
JO OPR; OF=1轉移(結果溢出轉移)
JNO OPR; OF=0轉移(結果不溢出轉移)
JP/JPE OPR;PF=1轉移(結果為偶轉移)
INP/JPO OPR; PF=0 轉移(結果為奇轉移)
JC OPR; CF=1轉移(有借位或有進位轉移)
JNC OPR; CF=0 轉移(無借位或無進位轉移)
  • J:jump E:equal Z:zero N:not
  • S:sign P:parity C:carry O:over flow
  • PE:parity even PO:parity odd

2、無符號數比較條件相對轉移(A-B,Above,Below)

  • JB / JNAE / JC OPR ; CF=1 (A<B轉移)

  • JAE / JNB / JNC OPR ; CF=0 (A>=B轉移)

  • JBE / JNA OPR ; (CF V ZF)=1 (A <= B轉移)

  • JA / INBE OPR ; (CF V ZF)=0 (A > B轉移)

3、有符號數比較條件相對轉移 (G-L,Greater,Less)

  • JL / JNGE OPR ; (SF xor OF)=1 (A<B轉移)

  • JGE / JNL OPR ; (SF xor OF)=0 (A>=B轉移)

  • JLE / JNG OPR ; ((SF xor OF) V ZF)=1(A≤B轉移)

  • JG / INLE OPR ; ((SF xor OF) V ZF)=0(A>B轉移)

4、測試CX條件相對轉移

  • JCXZ OPR ;(CX)=0轉移

5.6.7 LOOP循環控制相對轉移

**格式:**LOOP OPR

功能:(CX/ECX) <- (CX/ECX) - 1; (CX/ECX) != 0 轉移

5.6.8 LOOPZ/LOOPE循環控制相對轉移

**格式:**LOOPZ/LOOPE OPR

功能:(CX/ECX) <- (CX/ECX) - 1; (CX/ECX) != 0 且 ZF = 1轉移

5.6.9 LOOPNZ/LOOPNE循環控制相對轉移

**格式:**LOOPNZ(或LOOPNE) OPR

功能:(CX/ECX)<- (CX/ECX) - 1; (CX/ECX) != 0 且 ZF = 0 轉移

**說明:**上述三條循環控制相對轉移指令中的轉移地址為(IP/EIP )<- (IP/EIP) + 8位帶符號數;8位位移量是由目標地址OPR確定的。

5.6.10 子程序調用與返回

**子程序:**具有獨立功能的程序模塊。

程序中可由調用程序(或稱主程序)調用這些子程序,而在子程序執行完后又返回調用程序繼續執行。為實現這一功能,微機提供了CALL調用指令和RET返回指令。

  1. 段內相對調用

    1. 格式:CALL DST; DST為直接入口地址,指令中給出

      ? CALL NEAR PTR DST

    2. 功能:

      操作數16位:

      ? SP <- (SP) - 2, [SP] <- (IP)

      ? IP <- (IP) + 16位位移量

      操作數32位:

      ? ESP <- (ESP) - 4, [ESP] <- (EIP)

      ? EIP <- (EIP) + 32位位移量

    3. 說明:16、32位位移量是一個有符號數

  2. 段內間接調用

    1. 格式:CALL DST ; DST為R、M

    2. 功能:

      操作數16位:

      ? SP <- (SP) - 2, [SP] <- (IP)

      ? (IP) <- (EA)

      操作數32位:

      ? ESP <- (ESP) - 4, [ESP] <- (EIP)

      ? (EIP) <- (EA)

    3. **類型:**寄存器、存儲器單元

  3. 段間直接調用

    1. 格式:CALL DST ; DST為直接入口地址,指令中給出

    2. 功能:

      操作數16位:

      ? SP <- (SP) - 2, [SP] <- (CS)

      ? SP <- (SP) - 2, [SP] <- (IP)

      ? IP <- DST的偏移地址

      ? CS <- DST所在段的段地址

      操作數32位:

      ? ESP <- (ESP) - 2, [ESP] <- (CS)

      ? ESP <- (ESP) - 4, [ESP] <- (EIP)

      ? ESP <- DST的偏移地址

      ? CS <- DST所在段的段地址

    3. 說明:該指令先將CS、IP或EIP壓棧保護返回地址。然后轉移到由DST(DST為匯編語言中的過程名)指定的轉移地址。

  4. 段間間接調用

    1. 格式:CALL DST;DST為M

    2. 功能:

      操作數16位:

      ? SP <- (SP) - 2, [SP] <- (CS)

      ? SP <- (SP) - 2, [SP] <- (IP)

      ? IP <- (EA)

      ? CS <- (EA + 2)

      操作數32位:

      ? ESP <- (ESP) - 2, [ESP] <- (CS)

      ? ESP <- (ESP) - 4, [ESP] <- (EIP)

      ? EIP <- (EA)

      ? CS <- (EA + 4)

    3. 說明:先保護返回地址,然后轉移到由DST指定的轉移地址。EA由DST確定的任何內存尋址方式

  5. 段內返回

    1. **格式:**RET

    2. 功能:

      操作數16位:IP <- 棧彈出2字節, SP <- (SP) + 2
      操作數32位:(EIP) <- 棧彈出4字節,ESP <- (ESP) + 4

  6. 段內帶參數返回

    1. **格式:**RET
    2. 功能:
      操作數16位:IP <- 棧彈出2字節,SP<- (SP) + 2
      SP <- (SP) + N
      操作數32位:EIP <- 棧彈出4字節,ESP <- (ESP) + 4
      ESP <- (ESP)+N
    3. **說明:**N是一個16位的常數(偶數)
  7. 段間返回

    1. **格式:**RET
    2. 功能:
      **操作數16位:**IP <- 棧彈出2字節,SP <- (SP)+2
      CS <- 棧彈出2字節,SP <- (SP)+2
      操作數32位:
      EIP <- 棧彈出4字節,ESP <- (ESP)+4
      CS <- 棧彈出2字節,ESP <- (ESP)+2
  8. 段間帶參數返回

    1. **格式:**RET N

    2. 功能:

      操作數16位:

      IP <- 棧彈出2字節,SP <- (SP)+2
      CS <- 棧彈出2字節,SP <- (SP)+2
      SP <- (SP)+N

      操作數32位:

      EIP <- 棧彈出4字節,ESP <- (ESP)+4
      CS <- 棧彈出2字節,ESP <- (ESP)+2
      ESP <- (ESP)+N

5.6.11 中斷指令

**中斷指令作用:**調用中斷服務程序。中斷向量地址 = 中斷類型碼 × 4。

(1)INT 中斷指令

**格式:**INT n ; 不影響標志位
功能:

  1. SP <- (SP) - 2
  2. PUSH (FR);標志寄存器FR進棧
  3. SP <- (SP) - 2
  4. PUSH(CS);斷點段地址CS進棧
  5. SP <- (SP) - 2
  6. PUSH (IP);斷點地址指針IP進棧
  7. TF <- 0;禁止單步
  8. IF <- 0;禁止中斷
  9. IP <- [n × 4];轉向中斷服務程序
  10. CS <- [n × 4 + 2];

(2)INT3 中斷斷點

**格式:**INT3;同 INT n
**說明:**產生類型為3的中斷,不影響標志位。

(3)INTO 溢出中斷

**格式:**INTO;OF=1產生類型為4的中斷,OF = 0順序執行下條指令。
**說明:**產生中斷時,TF <- 0,IF <- 0,其他標志位不受影響。

(4)IRET中斷返回

**格式:**IRET;標志位隨標志寄存器出棧操作而不變

功能:

  1. IP <- 棧彈出2字節;斷點偏移量出棧
  2. SP <- (SP)+2
  3. CS <- 棧彈出2字節;斷點段地址出棧
  4. SP <- (SP)+2
  5. FR <- 棧彈出2字節;標志寄存器出棧
  6. SP <- (SP) + 2

(5)INT 21H 系統功能調用

**系統功能調用:**DOS為系統程序員及用戶提供的一組中斷服務程序。

DOS規定用中斷指令INT 21H作為進入各功能調用中斷服務程序的總入口,再為每個功能調用規定一個功能號,以便進入相應各個中斷服務程序的入口。

程序員使用系統功能調用的過程:

  1. AH <- 功能調用編號
  2. 設置入口參數
  3. CPU執行 INT 21H
  4. 給出出口參數

DOS共提供了約80個功能調用

  1. 功能號:1;等待鍵盤輸入,并回送顯示器

    MOV AH,1;(AH)一功能號01H
    INT 21H;調用21H號軟中斷

    **說明:**出口參數(AL) = 鍵入字符的ASCII碼。

  2. **功能號:2;**輸出字符送顯示器

    MOV DL,41H;入口參數:(DL) <- 字符 A 的ASCII碼

    MOV AH,2;(AH) <- 功能號02H
    INT 21H;在屏幕上顯示輸出字符A
    **說明:**無出口參數。

  3. 功能號:4CH;終止程序,返回

    MOV AH,4CH;(AH) <- 功能號4CH

    INT 21H;調用21H號軟中斷

5.7 串操作指令

串操作指令處理連續存放在存儲器中的數據。(相比于多次單個處理,效率更高)

X86系列CPU有7個串操作指令,其中與存儲器相關的5個,與I/O相關的2個。

**存儲器相關的5個:**傳送MOVS、比較CMPS、掃描SCAS、裝入LODS、存儲STOS

**與IO相關的2個:**輸入INS、輸出OUTS

共同特性:

  1. **數據類型:**字節、字、雙字

  2. **源串:**DS:SI/ESI,允許段超越

  3. **目的串:**ES:DI/EDI

  4. 每執行一次串操作指令,SI/ESI、DI/EDI自動修改,指向下一位置。

  5. **地址修改方向:**由DF控制,DF=0增址(CLD),DF=1減址(STD)

  6. 帶B、W、D為隱式,否則為顯式,如MOVS BYTE PTR[DI],[SI]

  7. 指令中只給出一個操作數時,另一個隱含為AL、AX、EAX之一。

  8. 可加相應的重復前綴,賦值CX/ECX為計數值。

1、MOVS 串傳送(move string)

  • 格式:MOVS DST, SRC

    ? MOVSB(字節)

    ? MOVSW(字)

    ? MOVSD(雙字)(自386起有)

  • 功能: ES:[DI/EDI] <- DS:[SI/ESI] ; 不影響標志位

    ? 字節傳送: (DI/EDI) <- (DI/EDI) ± 1

    ? (SI/ESI) <- (SI/ESI) ± 1

    ? 字傳送: (DI/EDI) <- (DI/EDI) ± 2

    ? (SI/ESI) <- (SI/ESI) ± 2

    ? 雙字傳送: (DI/EDI) <- (DI/EDI) ± 4

    ? (SI/ESI) <- (SI/ESI) ± 4

2、LODS串裝入(load from string)

  • 格式:LODS SRC; 字節裝入 AL <- DS:[SI/ESI]

3、STOS串存儲(store into string)

  • 格式:STOS DST; 字節存儲 ES:[DI/EDI] <- AL

4、CMPS串比較(compare string)

  • 格式:CMPS DST, SRC;DS:[SI/ESI] - ES:[DI/EDI], 影響標志位

5、SCAS 串掃描(scan string)

  • 格式:SCAS DST ; 字節掃描(AL)- ES:[DI/EDI], 影響標志位

6、INS串輸入(input from port to string)

  • 格式:INS DST, DX; ES:[DI/EDI] <- [DX]

7、OUTS串輸出(output string to port)

  • 格式:OUTS DX, SRC; [DX] <- DS:[SI/ESI]

8、REP 計數重復串操作(repeat)

  • 格式:REP OPR ; OPR是MOVS、STOS、LODS、INS、OUTS
  • 功能:
    1. 如果(CX) = 0,則退出REP,否則往下執行
    2. (CX) <- (CX) - 1
    3. 執行其后的串指令
    4. 重復①~③

9、REPZ 計數相等重復串操作(repeat while zero/equal)

  • 格式:REPZ/REPE OPR ; OPR是CMPS、SCAS
  • 功能:
    1. 如果(CX) = 0或ZF = 0,則退出REP,否則往下執行
    2. (CX) <- (CX) - 1
    3. 執行其后的串指令
    4. 重復①~③

10、REPNZ 計數不相等重復串操作(repeat while not zero/ not equal)

  • 格式:REPNZ/REPNE OPR ; OPR是CMPS、SCAS
  • 功能:
    1. 循環條件和REPZ相反

5.8 處理器控制指令

5.8.1 標志處理指令

標志處理指令只設置或清除本指令的標志位而不影響其他標志位。

  • CLC;進位位置0,CF <- 0(clear carry)
  • CMC;進位位取反, C F ← C F  ̄ CF \leftarrow \overline{CF} CFCF (complement carry)
  • STC;進位位置1,CF <- 1 (set carry)
  • CLD;方向標志位置0,DF <- 0 (clear direction )
  • STD;方向標志位置1,DF <- 1 (set direction )
  • CLI;中斷標志置0,IF <- 0,禁止中斷 (clear interrupt)
  • STI ;中斷標志置1,IF <- 1,允許中斷(set interrupt)

5.8.2 處理器控制指令

處理器控制指令可以控制處理機狀態。它們都不影響條件碼。

**1)HLT;**暫停

暫停指令停止軟件的執行。有三種方式退出暫停:中斷、硬件復位、DMA操作。

2)NOP;空操作

不執行任何操作。

3)ESC;換碼

指定由協處理器執行的指令。486后浮點處理部件已裝入CPU,系統可直接支持協處理器指令,因此ESC指令已成為未定義指令。

4)WAIT;等待

使處理機處于空轉狀態,它也可以用來等待外部中斷發生,但中斷結束后仍返回WAIT指令繼續等待。

5)LOCK;封鎖前綴
有此前綴的指令執行后,CPU封鎖總線,禁止其他總線主設備訪問總線。如 LOCK MOV AL, [SI]

5.9 偽指令

**偽指令功能:**指示匯編程序完成規定的操作。如選擇處理器、定義數據、分配存儲區等。

5.9.1 程序開始和結束偽指令

END 源程序結束偽指令

  • **格式:**END [標號]
  • **功能:**表示源程序結束,不可缺,源程序最后一條語句
  • 說明:
    1. 標號指示程序開始執行的起始地址。
    2. 主程序缺省值為代碼段的第一條指令的地址。
    3. 多個模塊鏈接,主程序用標號,其他程序不用

5.9.2 段定義偽操作

**段定義:**確定代碼組織與數據存儲的方式,

**有2種段定義偽指令:**完整的段定義、簡化的段定義。

簡化的段定義偽指令只能在MASM 5.0以上的匯編語言版本中使用。

1.完整的段定義偽操作

(1)SEGMENT、ENDS 段定義偽指令

**格式:**段名 SEGMENT[定位類型][組合類型][字長類型]['類別’]

段名 ENDS

**功能:**定義段名、段屬性,并表示段的開始位置、結束位置。

說明:

  1. SEGMENT和ENDS必須成對出現,而且偽指令前面的段名也要相同
  2. 段名是段的標識符,指明段的基址,由程序員指定。
  3. 一般情況下,選項可以不用,使用默認值。但若需鏈接程序,就必須使用這些說明

**1、定位類型:**指定段起始地址邊界。

5種定位類型:

  1. **BYTE:**任意地址。
  2. **WORD:**偶地址,地址最低1位為0。
  3. **DWORD:**4的倍數地址,地址最低2位為0。
  4. **PARA:**16的倍數地址,地址最低4位為0。默認值
  5. **PAGE:**256的倍數地址,地址最低8位為0。一頁的起點。

**2、組合類型:**表示本段與其他模塊段之間,具有相同段名的各段的組合關系。

注意3個前提:連接時,類型相同,段名相同

6種組合類型:

  1. PUBLIC:連接時,把不同模塊中類型相同、段名相同的段連接到同一物理存儲段中,共用一個段地址。連接次序由連接命令指定。即同名段連接在一起,有共同段地址。
  2. STACK:用于說明堆棧段。與PUBLIC的處理方式一樣,長度為各原有段的總和。LINK自動將新段的段地址送SS,
    長度送SP/ESP。若未定義STACK類型,需在程序中用指令設置SS、SP。
  3. COMMON:連接時,使類型相同、段名相同的段具有同一個起始地址,即生一個覆蓋段。新段的長度是最長COMMON段的長度,新段的內容取決于依次覆蓋的最后內容。
  4. MEMORY:表示該段定位在所有段的最下面(即地址最大的區域),多個MEMORY段產生覆蓋,連接時與PUBLIC類型同等對待。
  5. PRIVATE:獨立段,不與同名段合并。默認值。
  6. AT 表達式:指定本段起始地址為“表達式”,偏移量為0,不能用于代碼段。

**3、字長類型:**386以后,說明使用16位尋址還是32位尋址。

2種字長類型:

**1)USE16:**16位尋址,段長 ≤ 64KB,16位段地址,16位偏移量。默認值

**2)USE32:**32位尋址,段長 ≤ 4GB,16位段地址,32位偏移量。

4、類別:引號括起來的字符串。連接時,類別相同的段(它們可能不同名)放在連續的存儲空間中,但它們仍然是不同的段。

4種類別:

  1. **DATA:**段類別是數據段。
  2. **CODE:**段類別是代碼段。
  3. **STACK:**段類別是堆棧段。
  4. **EXTRA:**段米別是附加數據段

(2)ASSUME 段分配偽指令

格式:

ASSUME 段寄存器名:段名,段寄存器名:段名,…

**功能:**說明某個段使用哪一個段寄存器。

說明:

  1. 程序段必須用CS,堆棧段必須用SS。
  2. 該語句一般放在代碼段最前面。
  3. 說明性語句,除CS外(初始化賦值),各段寄存器在程序中賦值。
  4. 取消語句:ASSUME NOTHING

5.9.2 地址計數器偽指令

1、地址計數器$

功能:指出匯編地址,是偏移量,記載下一個變量或指令在當前段中的偏移量。

每個段開始時,$=0,隨著匯編過程的進行而增值。每處理一條指令,$增加一個值,此值是該指令所需的字節數。

允許直接引用$,如JNE $ + 6,轉向JNE指令的首地址加上6。

$用于指令時,表示本條指令的第一個字節的地址;

$用于其他情況,表示$的當前值.

2、ORG 地址計數器設置(起始地址定義)

**格式:**ORG 數值表達式

**功能:**定義指令或數據的起始地址,$ ← 表達式的值。

**說明:**數值表達式取值范圍在 0 ~ 65535 之間。

3、EVEN 偶數地址定義(使地址計數器成為偶數)

**格式:**EVEN

**功能:**使下一個變量或指令從偶地址開始。

**說明:**便于字存儲對準。EVEN在代碼段中可能多出一個NOP語句。

4、ALIGN 邊界定義(使地址計數器滿足邊界要求)

**格式:**ALIGN n;n必須是2的整數冪, n = 2 i n = 2^i n=2i

**功能:**使下一個變量或指令從n的整倍數地址開始,

**說明:**保證雙字、四倍字對準。當 n = 2 時,即 ALIGN 2 和 EVEN 是等價的。

5.9.3 數據定義偽指令

格式:

? [變量名] 操作符 操作數 [;注釋]

**功能:**為操作數分配存儲單元,用變量與存儲單元相聯系。

變量名和注釋是可有可無的。

**操作符:**定義操作數類型。

**DB:**一個操作數占有1個字節單元(8位),定義的變量為字節變量。

**DW:**一個操作數占有1個字單元(16位),定義的變量為字變量。

**DD:**一個操作數占有1個雙字單元(32位),定義的變量為雙字變量

DF:一個操作數占有1個三字單元(48位),定義的變量為三字變量

DQ:一個操作數占有1個四字單元(64位),定義的變量為四字變量

DT:一個操作數占有1個五字單元(80位),定義的變量為五字變量

**操作數:**常數、表達式、字符串、?等。

特別說明1:字符串

操作數是字符串定義形式

包括在單引號中的若干個字符形成字符串,字符串在存儲中存儲的是相應字符的ASCII碼。

當定義的字符串中字符多于2個時,只能使用DB定義,而不能使用DW。匯編程序將DW ‘AB’ 按一個字來處理。

特別說明2:“?”

操作數是 “?” 定義形式.

此時只分配存儲空間,但不定義初值。

DATA1 DB 1, 2, ?, 4

特別說明3:DUP

操作數用復制操作符DUP定義形式,此時表示操作數重復若干次。

DATA1 DB 2 DUP(12H, 34H, 56H)

含義是把括號內的數據復制兩次

5.9.4 PROC和ENDP過程定義偽指令

格式:

過程名 PROC(屬性]
(過程體)
過程名 ENDP

**功能:**用于定義子程序結構,定義一段程序的入口(過程名)及屬性。

**說明:**過程名是該過程(子程序)的入口,是CALL的操作數。

**屬性:**FAR、NEAR(默認)

5.10 操作數字段

操作數包括:寄存器、變量、標號、常數、表達式

5.10.1 常數

**常數:**主要用作指令中的直接操作數,也可作為存儲變量操作數的組成部分,或者在偽指令中用于給變量賦初值。

**常數包括:**數值常數、符號常數、字符串常數

1.數值常數

**數值常數:**2進制數B、8進制數Q、10進制數D(默認)、16進制數H

格式:.RADIX數值表達式;基數控制偽指令

**功能:**把默認的基數改變為2~16范圍內的任何基數。

2.字符串常數

**字符串常數:**在單引號中的若干個字符。

字符串在存儲中存儲的是相應字符的ASCII碼。

3、符號常數

(1) EQU賦值偽指令

**格式:**符號常數名 EQU 表達式;將表達式的值賦給符號常數

**說明:**表達式可以是有效的操作數格式,也可以是任何可求出數值常數的表達式,還可以是任何有效的符號(如操作符、存器、委量

注意:只能定義一次。

DATA1	EQU 88	;所有出現DATA1的地方都會替換為88
AAAI	EQU CX	;同理
DATA2	EQU DATA1 + 12	;同理

(2) = 偽指令

**格式:**符號常數名 = 表達式;同EQU偽指令

注意:可重復定義(和EQU的區別)

DATA1 = 88;
DATA1 = DATA1+99;

5.10.2 表達式

表達式是一個組合序列,包括常數、寄存器、標號、變量。

**兩種形式:**數字表達式、地址表達式。

1.運算符

**6種:**算術運算、邏輯運算、移位運算、關系運算、返回值運算、屬性運算。

  1. **算術運算符:**+、-、*、/、MOD
  2. **邏輯運算符:**AND、OR、XOR、NOT
  3. **移位運算符:**左移SHL、右移SHR
  4. **關系運算符:**等于EQ、不等NE、小于LT、大于GT、小于等于LE、大于等于GE。
    • 關系運算符的兩個操作數的**計算結果應為邏輯值:**結果為真(即關系成立),表示為0FFFFH,結果為假(即關系不成立),則表示為0。

5.返回值運算符

**返回值運算符:**返回變量或標號的段地址(SEG)、返回變量或標號的偏移地址(OFFSET)、返回變量或標號的類型值(TYPE)、返回變
量的單元數(LENGTH)、返回變量的字節數(SIZE):

  • 操作數 SEG 變量/標號;段地址值賦給操作數。
  • 操作數 OFFSET 變量/標號;偏移量值賦給操作數。
  • 操作數 TYPE 變量/標號;代表變量/標號類型的值賦給操作數。
  • 操作數 LENGTH 變量;第一個數占用的單元數賦給操作數。
  • 操作數 SIZE 變量;第一個數占用的字節數賦給操作數。

**TYPE:**變量DB返回1、DW返回2…標號NEAR返回-1、FAR返回-2.

LENGTH:只對DUP定義的變量有意義,返回分配給該變量的元素的個數(不是字節數),其他情況均送1。

SIZE:只對DUP定義的變量有意義,返回分配給該變量的字節數。SIZE = LENGTH × TYPE

6.屬性運算符

1)PTR 屬性說明運算符

**格式:**類型 PTR 變量/標號;臨時改變類型屬性

**說明:**變量:字節BYTE、字WORD、雙字DWORD、三字FWORD、四字QWORD、五字TWORD;

標號:近類型NEAR、遠類型FAR。

2)THIS 指定類型屬性運算符

**格式:**變量/標號 EQU THIS 類型

**功能:**將變量或標號定義成指定的類型。

**說明:**THIS指定的變量或標號本身并不分配存儲單元,它與緊跟其后的變量或標號只有類型不同,而段地址和偏移量均相同,從而便于程序設計。該指令可以指定的類型與PTR相同。

5.10.3 數字表達式

**數字表達式:**由常數、變量、標號與一些運算符相組合的序列。它的結果必須是常數。

MOV DX, (AAA1 LT 3 AND 10H OR AAA1 GE 3 AND 0AFH) SHL 2

5.10.4 變量

**變量:**數據單元的符號地址,

**5種屬性:**段值、偏移值、類型、單元數(也稱長度)、字節數。

  • **段值屬性:**變量所在段的段地址。
  • **偏移值屬性:**變量的偏移地址。
  • **類型屬性:**變量一個數據的字節數。
  • **長度屬性:**變量在數據區中的單元數。
  • **字節數屬性:**在數據區中分配給該變量的字節數。

在同一個程序中,相同的變量或標號名只允許定義一次,否則,匯編時匯編程序指出錯誤。

5.10.5 地址表達式

**地址表達式:**其值是存儲器地址,即EA的計算。

地址表達式使用規則:

  1. 變量和標號可以加上或減去某個結果為整數的數值表達式。

  2. 同一段內的變量和變量、標號和標號之間可以相減。

  3. 寄存器的內容可作為地址使用,用“[]”表示。方括號“[]”內可以出現一個或兩個寄存器,也可加、減某個數值表達式,但不能有變量或標號出現。

  4. 可以使用段超越前綴,其格式為:

    段寄存器/段名:變量/標號/地址表達式

  5. 地址表達式的書寫格式:

    MOV AX, [BX + SI + 8]
    MVO AX, [BX + SI]8
    MOV AX, [BX][SI]8
    MOV AX, 8[BX + SI]
    

符:**AND、OR、XOR、NOT
3. **移位運算符:**左移SHL、右移SHR
4. **關系運算符:等于EQ、不等NE、小于LT、大于GT、小于等于LE、大于等于GE。
- 關系運算符的兩個操作數的
計算結果應為邏輯值:**結果為真(即關系成立),表示為0FFFFH,結果為假(即關系不成立),則表示為0。

5.返回值運算符

**返回值運算符:**返回變量或標號的段地址(SEG)、返回變量或標號的偏移地址(OFFSET)、返回變量或標號的類型值(TYPE)、返回變
量的單元數(LENGTH)、返回變量的字節數(SIZE):

  • 操作數 SEG 變量/標號;段地址值賦給操作數。
  • 操作數 OFFSET 變量/標號;偏移量值賦給操作數。
  • 操作數 TYPE 變量/標號;代表變量/標號類型的值賦給操作數。
  • 操作數 LENGTH 變量;第一個數占用的單元數賦給操作數。
  • 操作數 SIZE 變量;第一個數占用的字節數賦給操作數。

**TYPE:**變量DB返回1、DW返回2…標號NEAR返回-1、FAR返回-2.

LENGTH:只對DUP定義的變量有意義,返回分配給該變量的元素的個數(不是字節數),其他情況均送1。

SIZE:只對DUP定義的變量有意義,返回分配給該變量的字節數。SIZE = LENGTH × TYPE

6.屬性運算符

1)PTR 屬性說明運算符

**格式:**類型 PTR 變量/標號;臨時改變類型屬性

**說明:**變量:字節BYTE、字WORD、雙字DWORD、三字FWORD、四字QWORD、五字TWORD;

標號:近類型NEAR、遠類型FAR。

2)THIS 指定類型屬性運算符

**格式:**變量/標號 EQU THIS 類型

**功能:**將變量或標號定義成指定的類型。

**說明:**THIS指定的變量或標號本身并不分配存儲單元,它與緊跟其后的變量或標號只有類型不同,而段地址和偏移量均相同,從而便于程序設計。該指令可以指定的類型與PTR相同。

5.10.3 數字表達式

**數字表達式:**由常數、變量、標號與一些運算符相組合的序列。它的結果必須是常數。

MOV DX, (AAA1 LT 3 AND 10H OR AAA1 GE 3 AND 0AFH) SHL 2

5.10.4 變量

**變量:**數據單元的符號地址,

**5種屬性:**段值、偏移值、類型、單元數(也稱長度)、字節數。

  • **段值屬性:**變量所在段的段地址。
  • **偏移值屬性:**變量的偏移地址。
  • **類型屬性:**變量一個數據的字節數。
  • **長度屬性:**變量在數據區中的單元數。
  • **字節數屬性:**在數據區中分配給該變量的字節數。

在同一個程序中,相同的變量或標號名只允許定義一次,否則,匯編時匯編程序指出錯誤。

5.10.5 地址表達式

**地址表達式:**其值是存儲器地址,即EA的計算。

地址表達式使用規則:

  1. 變量和標號可以加上或減去某個結果為整數的數值表達式。

  2. 同一段內的變量和變量、標號和標號之間可以相減。

  3. 寄存器的內容可作為地址使用,用“[]”表示。方括號“[]”內可以出現一個或兩個寄存器,也可加、減某個數值表達式,但不能有變量或標號出現。

  4. 可以使用段超越前綴,其格式為:

    段寄存器/段名:變量/標號/地址表達式

  5. 地址表達式的書寫格式:

    MOV AX, [BX + SI + 8]
    MVO AX, [BX + SI]8
    MOV AX, [BX][SI]8
    MOV AX, 8[BX + SI]
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37152.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Forecasting from LiDAR via Future Object Detection

Forecasting from LiDAR via Future Object Detection 基礎信息 論文&#xff1a;cvpr2022paper https://openaccess.thecvf.com/content/CVPR2022/papers/Peri_Forecasting_From_LiDAR_via_Future_Object_Detection_CVPR_2022_paper.pdfgithub&#xff1a;https://github.co…

SyncUnsafeCell替換Mutex提高性能

1. 背景 在Rust開發過程中&#xff0c;很多情況下需要在不可變的情況下獲取可變性或者在多線程的情況下可以安全的貢獻可變數據。這種情況下我們一般使用**Mutex來實現通過加鎖來實現。現在我們可以通過使用SyncUnsafeCell來替代Mutex**。 2. SyncUnsafeCell SyncUnsafeCell…

【計算機網絡——1.1網絡internet】

網絡 就是用通信線路和通信設備把很多個“主機/端設備“相互聯系。然后按照某種溝通方式&#xff0c;專業術語叫“協議”&#xff0c;共享信息。 **&#xff08; 計算機網絡&#xff1a;節點和邊構成的系統 節點&#xff1a; 主機節點&#xff1a;主機/端設備(手機&#x…

K8S之網絡深度剖析(一)(持續更新ing)

K8S之網絡深度剖析 一 、關于K8S的網絡模型 在K8s的世界上,IP是以Pod為單位進行分配的。一個Pod內部的所有容器共享一個網絡堆棧(相當于一個網絡命名空間,它們的IP地址、網絡設備、配置等都是共享的)。按照這個網絡原則抽象出來的為每個Pod都設置一個IP地址的模型也被稱作為I…

SpringBoot(一)創建一個簡單的SpringBoot工程

Spring框架常用注解簡單介紹 SpringMVC常用注解簡單介紹 SpringBoot&#xff08;一&#xff09;創建一個簡單的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多環境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

3.ROS串口實例

#include <iostream> #include <ros/ros.h> #include <serial/serial.h> #include<geometry_msgs/Twist.h> using namespace std;//運行打開速度控制插件&#xff1a; rosrun rqt_robot_steering rqt_robot_steering //若串口訪問權限不夠&#xff1a…

詳解PEFT庫中LoRA源碼

前言 GitHub項目地址Some-Paper-CN。本項目是譯者在學習長時間序列預測、CV、NLP和機器學習過程中精讀的一些論文&#xff0c;并對其進行了中文翻譯。還有部分最佳示例教程。如果有幫助到大家&#xff0c;請幫忙點亮Star&#xff0c;也是對譯者莫大的鼓勵&#xff0c;謝謝啦~本…

讀書筆記-《Spring技術內幕》(三)MVC與Web環境

前面我們學習了 Spring 最核心的 IoC 與 AOP 模塊&#xff08;讀書筆記-《Spring技術內幕》&#xff08;一&#xff09;IoC容器的實現、讀書筆記-《Spring技術內幕》&#xff08;二&#xff09;AOP的實現&#xff09;&#xff0c;接下來繼續學習 MVC&#xff0c;其同樣也是經典…

Spring底層原理之bean的加載方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 這種方式和第七種比較像 要實現兩個方法 第一個方法是實現工廠 第二個方法叫后處理bean注冊 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…

解決idea中git無法管理項目中所有需要管理的文件

點擊文件->設置 選擇版本控制—>目錄映射 點擊加號 設置整個項目被Git管理

【python入門】自定義函數

文章目錄 定義自定義函數的基本語法參數類型示例代碼函數作用域匿名函數&#xff08;Lambda&#xff09;閉包裝飾器 Python中的自定義函數允許你編寫一段可重用的代碼塊&#xff0c;這段代碼可以帶參數&#xff08;輸入&#xff09;&#xff0c;并可能返回一個值&#xff08;輸…

MySQL高級-事務-并發事務演示及隔離級別

文章目錄 0、四種隔離級別1、創建表 account2、修改當前會話隔離級別為 read uncommitted2.1、會出現臟讀 3、修改當前會話隔離級別為 read committed3.1、可以解決臟讀3.2、會出現不可重復讀 4、修改當前會話隔離級別為 repeatable read&#xff08;默認&#xff09;4.1、解決…

解決docker鏡像pull失敗的有效

機器環境 本實踐將在 Ubuntu 22.04.3LTS 系統上進行測試 docker 版本Docker Engine - Community 24.0.6 &#xff0c;原則上docker版本無影響 本實踐進僅學習研究使用&#xff0c;無作他用途。 背景 曾幾何時&#xff0c;docker鏡像的拉去會失敗&#xff0c;網速會慢&#xff0…

代碼隨想錄算法訓練營第五十三天| 739. 每日溫度、 496.下一個更大元素 I、503.下一個更大元素II

LeetCode 739. 每日溫度 題目鏈接&#xff1a;https://leetcode.cn/problems/daily-temperatures/description/ 文章鏈接&#xff1a;https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 思路 * 單調棧的本質是空間換時間&#xff0c;因為在遍歷的過…

【論文閱讀】transformer及其變體

寫在前面&#xff1a; transformer模型已經是老生常談的一個東西&#xff0c;以transformer為基礎出現了很多變體和文章&#xff0c;Informer、autoformer、itransformer等等都是頂刊頂會。一提到transformer自然就是注意力機制&#xff0c;變體更是數不勝數&#xff0c;一提到…

【目標檢測】DN-DETR

一、引言 論文&#xff1a; DN-DETR: Accelerate DETR Training by Introducing Query DeNoising 作者&#xff1a; IDEA 代碼&#xff1a; DN-DETR 注意&#xff1a; 該算法是在DAB-DETR基礎上的改進&#xff0c;在學習該算法前&#xff0c;建議掌握DETR、DAB-DETR等相關知識…

TCP和UDP的區別以及應用場景

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是兩種不同的傳輸層協議 區別 TCP是面向連接的&#xff0c;UDP是無連接的&#xff1b; TCP是可靠的&#xff0c;UDP是不可靠的&#xff1b; TCP是面向字節流的&#xff0c;UDP是面向數據…

如何高效配置與使用Pip換源

目錄 1. Pip源的基本概念 1.1 常見的國內鏡像源 2. 臨時換源 2.1 使用命令行參數指定鏡像源 2.2 安裝多個包時指定鏡像源 3. 永久換源 3.1 修改用戶級配置文件 3.1.1 創建和編輯配置文件 3.2 修改全局配置文件 3.2.1 創建和編輯全局配置文件 4. 驗證換源配置 5. 切…

VMamba: Visual State Space Model論文筆記

文章目錄 VMamba: Visual State Space Model摘要引言相關工作Preliminaries方法網絡結構2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 論文地址: https://arxiv.org/abs/2401.10166 代碼地址: https://github.com/MzeroMiko/VMamba 摘要 卷積神…

防火墻共性檢測技術

防火墻共性檢測技術 防火墻共性檢測技術是指防火墻在監控和控制網絡流量時&#xff0c;共同采用的一些檢測和過濾方法。無論是哪種類型的防火墻&#xff0c;這些技術都可以用于識別和阻止惡意流量&#xff0c;確保網絡安全。以下是防火墻共性檢測技術的詳細介紹&#xff0c;包…