汇编语言程序设计(一)
文章目錄
- 1.匯編語言概述
- 2.8086指令集
- 2.1數據傳送類指令
- 2.1.1通用數據傳送指令
- 2.1.2堆棧操作指令
- 2.1.3地址傳送指令
- 2.1.4其他傳送類指令
- 2.2.算數運算類指令
- 2.2.1加法指令
- 2.2.2減法指令
- 2.2.3乘法指令
- 2.2.4除法指令
- 2.3.位操作類指令
- 2.3.1邏輯運算指令
- 2.3.2 移位指令
- 2.3.3循環指令
- 2.4控制轉移類指令
- 2.4.1無條件轉移指令
- 2.4.2條件轉移指令
- 2.4.3循環控制指令
- 2.4.4過程調用和返回
- 2.4.5中斷和返回指令
- 2.5串操作指令
- 2.5.1字符串傳送指令MOVS
- 2.5.2字符串比較指令CMPS
- 2.5.3字符串掃描指令SCAS
- 2.5.4取字符串數據指令CMPS
- 2.5.5寫字符串數據指令STOS
- 2.5.6REP重復前綴
- 2.6處理器控制類指令
- 2.6.1標志操作指令
- 2.6.2外部同步指令
- 2.6.3空操作
- 3.匯編語言數據
1.匯編語言概述
匯編: 源程序在計算機中不能直接被識別和執行,所以需要經過翻譯,產生機器代碼,這種翻譯過程稱為匯編;
源程序: 用匯編語言編寫的程序;
助記符: 選用了一些能反映機器指令功能的單詞或詞組來代表該機器指令。這些選出來的單詞稱為助記符。
匯編語言: 是一種用于微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。
- 在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼;
- 用地址符號(Symbol)或標號(Label)代替指令或操作數的地址。
匯編程序: 是執行把匯編語言源程序翻譯成機器能夠識別和執行的目標程序(即二進制的機器代碼程序)任務的一種系統程序;
機器語言: 用二進制代碼表示,計算機能直接識別和執行的一種機器指令系統的集合;
匯編語言程序: 用匯編語言編寫的源程序;
匯編程序與匯編語言程序是兩個不同的概念。
匯編語言程序中語句類型指令性語句指示性語句匯編程序種類宏匯編程序小匯編程序指令性語句: CPU執行的語句,能夠生成目標代碼,核心是指令系統中的指令。
指示性語句: CPU不執行,而由匯編程序執行的語句,不生成目標代碼,核心是偽指令。
指令語句的格式:(由四段組成)
- 在匯編語言中,名字后無冒號,標號后一定帶冒號;
- 語句的各個組成部分間要有分隔符(常用空格or制表符);
- 標號或名字一般由字母、數字及規定的特殊字符組成,數字不可開頭。字符數最長不超過31個;
- 每個指令語句必須有助記符域。
偽指令 語句的格式:
名字: 變量的符號地址,其后不加冒號;
操作數: 指示性語句中至少有一個操作數。
EX1. 先從一個簡單的8086匯編語言程序示例來了解匯編語言程序的格式、結構及規范。這是一個完成將100個字的數據塊從輸入緩沖區搬到輸出緩沖區的實例。源程序如下所示。
(1)DATA SEGMENT ;定義代碼段 (2)INBUFF DW 100 DUP (?) ;輸入緩沖區 (3)OUTBUFF DW 100 DUP (?) ;輸出緩沖區 (4)DATA ENDS ;定義數據段結束 (5)STACKS SEGMENT PARA STACK ‘STACK’ (6)STA DB 100H DUP(?) (7)TOP EQU LEHGTH STA (8)STACKS ENDS (9)CODE SEGMENT ;定義代碼段 (10)ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKS (11)START: MOV AX,DATA (12) MOV DS, AX (13) MOV DS, AX (14) MOV AX, STACKS (15) MOV SS, AX (16) MOV SP, TOP (17)INIT: MOV SI,OFFSET INBUFF ;設置輸入緩沖區指針 (18) LEA DI,OUTBUFF ;設置輸出緩沖區指針 (19) MOV CX,100 ;塊長度送CX (20) REP MOVSB ;塊搬移 (21) MOV AX,4C00H ;DOS功能調用語句 (22) INT 21H (23) CODE ENDS (24) END START ;匯編結束2.8086指令集
2.1數據傳送類指令
傳送指令把數據從一個位置傳送到另一個位置,
除標志寄存器傳送指令外,均不影響標志位;
按功能可分為五種(掌握):
- 通用數據傳送指令:MOV
- 堆棧操作指令:PUSH、POP
- 地址傳送指令:LEA
- 交換指令:XCHG、XLAT
- 輸入/輸出指令:IN、OUT
2.1.1通用數據傳送指令
格式:
MOV dest( 目的 ), source(源) ;將一個字節或一個字操作數據從源傳送至目的地址中,源內容保持不變。
① MOV REG,im ;立即數送通用寄存器
② MOV REG,REG;通用寄存器之間傳送
③ MOV REG,MEM;存儲器送通用寄存器
④MOV MEM,REG;通用寄存器送存儲器
⑤ MOV MEM,im ;立即數送存儲器
⑥MOV REG,SEG ;段寄存器送通用寄存器(含CS)
⑦MOV MEM,SEG ;段寄存器送存儲器(含CS)
⑧ MOV SEG,REG ;通用寄存器送段寄存器(CS除外)
⑨ MOV SEG,MEM ;存儲器送段寄存器(CS除外)
目的操作數:寄存器(REG)、存儲器(MEM)和段寄存器(SEG);
源操作數:立即數(IM)、寄存器(REG)、存儲器(MEM)和段寄存器(SEG)。
注意:
①MOV指令不能在兩個存貯器單元之間進行數據直接傳送。
②MOV指令不能在兩個段寄存器之間進行數據直接傳送。
③立即數不能直接傳送給段寄存器。
④目的操作數不能為CS、IP。
EX2. 將以AREA1為首地址的100個字節數據搬移到以AREA2為首地址的內存中,若AREA1和AREA2都在當前數據段中,可以用帶有循環控制的數據傳送程序來實現。程序如下:
MOV SI,OFFSET AREA1MOV DI,OFFSET AREA2MOV CX,100AGAIN: MOV AL,[SI]MOV [DI],ALINC SIINC DIDEC CXJNZ AGAIN2.1.2堆棧操作指令
-
堆棧是內存中的一個特定區域,由SS的內容和SP的內容來決定;
-
堆棧操作具有“后進先出”的特點。
-
有兩種指令:
PUSH OPRD (壓入)
格式: PUSH OPRD
功能:將寄存器或內存單元的內容入棧。POP OPRD (彈出)
格式: POP OPRD
功能:將棧頂的一個字送到寄存器或內存
單元中。
堆棧指令中的操作數OPRD:
① SS、DS、ES
② 16位的通用寄存器
③ WORD型的MEM數
2.1.3地址傳送指令
1)取有效地址指令 LEA
格式: LEA DST,SRC ;有效地址傳送到寄存器
功能:把存儲單元的16位有效偏移地址EA送指定的寄存器。
2)取數據段寄存器指令 LDS (Load Data Segment)
格式:LDS DST,SRC ;將雙字指針送到寄存器和DS
功能:把內存4個單元的32位數,分別送到段寄存器DS和由DST指出的偏移量寄存器。
3)取附加段寄存器指令 LES(Load Extra Segment)
格式:LES DST,SRC ;將雙字指針送到寄存器和ES
功能:把內存4個單元的32位數送到段寄存器ES和由DST指出的偏移量寄存器。
2.1.4其他傳送類指令
1) 交換指令XCHG
格式: XCHG DEST,SOURCE
功能:兩個寄存器,寄存器和內存變量之間內容的交換 。
- 段寄存器不能作為操作數;
- 源和目的不能同時為存儲單元;
- 操作數不能為立即數。
2)字節交換指令BSWAP
格式:BSWAP OPRD1
功能:寄存器內部字節交換指令,將指定的32寄存器中的4個字節,通過兩兩交換實現反序排列。
3)查表指令(代碼轉換指令) XLAT
格式:XLAT
功能:AL←[(BX)+(AL)] ;本條指令完成一個字節的編碼轉換,轉換前要先在內存中建立一個代碼轉換表。
(1)表格首地址: BX內容
(2)下標變量: AL內容
常用于無法用公式實現的代碼轉換。
本指令不影響狀態標位,表格長度不超過256字節。
4)標志傳送指令
功能:標志位傳送指令用于了解或保存標志寄存器的內容,或設置某些標志位。
(1)讀標志位LAHF FR寄存器的低8位送AH
格式:LAHF
功能:AH ←FLAGSL
(內含5個標志位CF、PF、AF、ZF、SF)。
(2)寫標志位SAHF AH 送 FR寄存器的低8位
格式:SAHF
功能:FLAGL ←AH
(內含5個標志位CF、PF、AF、ZF、SF)
(3)FLAGS入棧指令 FR寄存器推入堆棧
格式:PUSHF
功能:FLAGS入棧。
(4)FLAGS出棧指令 從棧頂中彈出存入FR寄存器
格式:POPF
功能:FLAGS出棧。
入棧、出棧指令常成對使用,分別用于子程序和中斷服務程序首尾,保護和恢復主程序的各個標志位。
5)輸入輸出指令
(1).IN輸入指令
格式: IN ACC,PORT
功能:從PORT將8位或16位數據送入ACC中。
IN AL , n
IN AX , n
IN AL , DX
IN AX , DX
(2).OUT輸出指令
格式: OUT PORT , ACC
功能:將累加器AL或AX的內容輸出到指定的IO端口中。
OUT n , AL
OUT n , AX
OUT DX , AL
OUT DX , AX
- ACC為累加器,PORT為外設的端口地址;
- PORT的尋址方式為直接尋址或寄存器間接尋址。
2.2.算數運算類指令
- 這類指令實現加、減、乘、除運算。
- 共有兩類數據:無符號數 帶符號數
- 這些指令可實現字節或字的運算。
- 運算結果都會影響六個狀態標志位。
2.2.1加法指令
(1)ADD 不帶進位加法
格式:ADD OPRD1, OPRD2
功能:實現OPRD1和OPRD2兩個操作數相加,結果放入OPRD1。
操作數:
OPRD1: REG、 MEM
OPRD2: REG、 MEM、 im
源和目的操作數不能同時為存儲器,并且源和目的操作數類型要一致。影響所有的狀態標志位。
(2) ADC 帶進位加法
格式:ADC OPRD1, OPRD2
功能:實現OPRD1和OPRD2兩個操作數以及CF相加,結果放入OPRD1。
(3) INC 增量指令
格式:INC OPRD
功能:將操作數的內容加1后,再送回該操作數中。
OPRD為REG或MEM,為無符號數。INC指令常用于在循環程序中修改地址指針和循環次數等。
(4) DAA 組合十進制加法調整
功能:對AL寄存器中的壓縮BCD數加法操作的結果進行十進制調整。
(5) AAA 未組合十進制加法調整
功能:對AL寄存器中的未壓縮BCD數加法操作的結果進行十進制調整。
2.2.2減法指令
(1)SUB 不帶借位減法
格式:SUB OPRD1, OPRD2
功能:實現OPRD1與OPRD2兩個操作數相減,結果放入OPRD1。
( 2) SBB 帶借位減法
格式: SBB OPRD1, OPRD2
功能:實現OPRD1和OPRD2兩個操作數相減,同時減去借位CF,結果放入OPRD1。
( 3) DEC 減量指令
格式:DEC OPRD
功能:將操作數的內容減1后,再送回該操作數中。
OPRD為REG或MEM。為無符號數。
(4) NEG 取補指令
格式:NEG OPRD
功能:對操作數取補,結果再送回。按位變反加1,OPRD為REG或MEM。
(5) CMP 比較指令
格式:CMP OPRD1, OPRD2
功能:實現OPRD1與OPRD2兩個操作數相減,結果不送回。但影響標志位。R----im、R----M、M----im和M----R。
無符號比大小 CMP AX , BX
帶符號數比大小 CMP AX , BX
結論為:
EX3. 若自BLOCK開始的內存緩沖區,有100個帶符號的數,希望找到其中最大的一個值,并將它放到MAX單元中。
(6) DAS 壓縮BCD數減法十進制調整
(7) AAS 非壓縮BCD數減法十進制調整
2.2.3乘法指令
(1) MUL 無符號數乘法指令
格式:MUL SRC
功能:完成兩個無符號數的相乘。
- 被乘數和乘積均為隱含尋址;
- 源操作數可以是寄存器,也可以是存儲器;
- 源操作數不能是立即數;
- 源操作數是存儲器時,需指明類型。
(2) IMUL 帶符號數乘法指令
格式:IMUL SRC
功能:完成兩個帶符號數的相乘
- 可進行字節和字節、字和字的乘法運算,結果放在AX或DX、AX中。
- 本指令影響標志位CF和OF。
- 當結果的高半部分不是結果的低半部分的符號擴展時,標志位CF和OF將置位。
(3) AAM 非壓縮BCD數乘法操作結果校正
功能:完成對兩個非壓縮BCD數乘法結果的十進制數調整。對AX做十進制調整。
2.2.4除法指令
(1) DIV 無符號數除法指令
格式:DIV SRC
功能:完成兩個無符號數的相除。被除數、商和余數均為隱含尋址。
- 如果SRC=0,產生類型0的除法錯中斷。
- 如果結果大于寄存器可以保存的值時,也產生0型中斷。
(2) IDIV 帶符號數除法指令
格式:IDIV SRC
功能:完成兩個帶符號數的相除。被除數、商和余數均為隱含尋址
余數符號位與被除數相同。
(3) AAD 非壓縮BCD數除法校正
- AAA——對AL中ASCII未壓縮的十進制和進行調整;
- AAS——對AL中ASCII未壓縮的十進制差進行調整;
- AAM——對AX中兩個ASCII未壓縮十進制相乘結果進行調整;
- AAD——在除法指令前對AX中ASCII未壓縮的十進制數進行調整。
- DAA——對AL中的兩個壓縮十進制數相加之和進行調整,得到壓縮十進制和;
- DAS——對AL中的兩個壓縮十進制數相減之差進行調整,得到壓縮十進制差。
(4)CBW 帶符號數字節擴展
功能:將AL的符號位(bit7)擴展到整個AH中
- 若AL<80H,則AH<—00H
若AL≥80H, 則AH<—FFH。
(5) CWD 帶符號數字擴展
功能:將AX中的符號位(bit15)擴展到DX中
- 若AX<8000H, 則DX<—0000H
若AX≥8000H,則DX<—FFFFH。
2.3.位操作類指令
位操作指令共同點:
- 可以按二進制位進行操作;
- 邏輯運算指令按邏輯門電路的運算規則;
- 邏輯移位指令有左移和右移,移出的位都進入CF標志;
- 因移空位的補充方式不同有多種指令形式;
- 邏輯移位指令中,移動超過1次則用CL寄存器做計數器;
- 執行邏輯操作指令,CF均被清0。
2.3.1邏輯運算指令
邏輯運算指令,即按位邏輯運算。與算術運算的最大區別就是,不進位。分為: AND、OR、XOR、 NOT、 TEST
(1)AND指令 清零
格式: AND OPRD1,OPRD2
功能:OPRD1和OPRD2按位邏輯與運算。
AND指令可以進行字節操作,也可以進行字操作。常用來屏蔽某些位。
(2)OR指令 置一
格式: OR OPRD1,OPRD2
功能:OPRD1和OPRD2按位邏輯或運算。
OR指令可以進行字節操作,也可以進行字操作。OR指令常用來組合某些位。
(3)XOR指令 取反
格式: XOR OPRD1,OPRD2
功能:OPRD1和OPRD2按位邏輯異或運算。
XOR指令可以進行字節操作,也可以進行字操作。XOR指令常用來取反某些位。
(4)NOT 指令
格式: NOT OPRD
功能:對OPRD按位取反,結果送回原操作數。
操作數可以是寄存器或存貯器的內容。該指令對標志位不產生影響。
(5)TEST指令 執行AND運算
格式: TEST OPRD,im
功能:對OPRD和im按位取與,結果不送回原操作數。影響標志位。
這條指令通常是在不希望改變操作數的前提下,用來檢測某一位或某幾位的狀態。
2.3.2 移位指令
帶符號數:
(1) SAL (Shift Arithmetic Left) 算術左移
(2) SAR(Shift Arithmetic Right) 算術右移
格式:
SAL OPRD,COUNT
SAR OPRD,COUNT
功能:將OPRD中的數左移或者右移若干位。
其中,OPRD為REG或MEM;COUNT為立即數或CL。在8086中,立即數只能為1。
無符號數:
(3) SHL(Shift Logic Left) 邏輯左移
(4) SHR(Shift Logic Right) 邏輯右移
格式: SHL OPRD,COUNT
SHR OPRD,COUNT
功能:將OPRD中的數左移或者右移若干位。
其中:OPRD為REG或MEM,COUNT為im或CL。在8086中,立即數只能為1。開環移位Shift
2.3.3循環指令
小循環移位:
(1) ROL(Rotate Left) 不帶CF循環左移
(2) ROR (Rotate Right) 不帶CF循環右移
格式:
ROL OPRD,COUNT
ROR OPRD,COUNT
功能:將OPRD中的數循環左移或者右移若干位。
其中,OPRD為REG或MEM,COUNT為立即數或CL。在8086中,立即數只能為1.
大循環移位:
(3) RCL(Rotate through CF Left) 帶CF循環左移
(4) RCR(Rotate through CF Right) 帶CF循環右移
格式:
RCL OPRD,COUNT
RCR OPRD,COUNT
功能:將OPRD中的數循環左移或者右移若干位。其中:OPRD為REG或MEM,COUNT為立即數或CL。在8086中,立即數只能為1。 閉環移位Rotate
2.4控制轉移類指令
轉移類指令通過改變CS與IP的值或僅改變IP的值,以改變指令執行的順序。
2.4.1無條件轉移指令
格式: JMP OPRD
功能:無條件的轉移到OPRD表示的目標之處。
說明:OPRD為LABEL、REG或MEM。
(1)段內直接轉移
格式: JMP SHORT PTR LAB8
JMP NEAR PTR LAB16
功能:IP<—(IP)+LAB
說明:LAB8和LAB16分別是8位或16位補碼
- 只修改IP的值就是段內轉移。
- LAB直接出現在指令的機器碼中。就是直接轉移。
- 段內直接轉移屬于相對轉移。
a.段內直接短程轉移
JMP SHORT PTR LAB8
LAB8為8位補碼,轉移范圍:-128~+127
功能:IP<—(IP)+LAB8 ;(IP)代表當前IP值。即JMP指令取走后下一條指令的地址。LAB—地址位移量
b.段內直接近程轉移
JMP NEAR PTR LAB16
LAB16為16位補碼,轉移范圍:-32768~+32767
功能:IP<—(IP)+LAB16 ;NEAR PTR可以省略。
(2) 段內間接轉移
格式: JMP REG16
JMP WORD PTR MEM16
功能:IP<—(REG16) / [MEM16]
說明:轉移地址為某寄存器或某內存兩個連續內存單元內容。
(3)段間直接轉移
格式: JMP FAR PTR LAB32
功能:IP<—直接給出的偏移地址
CS <—直接給出的段地址
說明:FAR PTR為屬性運算符,表示轉移是在段間進行。目標標號在其他代碼段。
(4)段間間接轉移
格式: JMP DWORD PTR OPRD
功能:IP <—內存中的第一字內容
CS <—內存中的第二字內容
說明:OPRD為MEM。以OPRD的尋址方式,計算出PA。訪問相鄰的4B單元。低字送IP,高字送CS。
2.4.2條件轉移指令
格式: JCC LAB 8
功能:條件滿足則轉向LAB8表示的目標之處。
說明:LAB8為LABEL。屬于SHORT類型
- 條件轉移指令將上一條指令所設置的某些標志位的狀態作為測試條件。
- 條件滿足則轉向指令中所指示的目的地址。
- 條件不滿足則順序執行下一條指令。
- 轉移的目標地址是8位補碼。地址范圍:-128~+127
EX4. 求AL和BL寄存器中的兩數之和。若有進位,則AH置1,否則AH清0
ADD AL,BLJC NEXTXOR AH,AHJMP DONE NEXT: MOV AH,01H DONE: NOPEX5. 設某個學生的英語成績已存放在AL寄存器中,若低于60分,則打印F(FAIL);若高于或等于85分,則打印G(GOOD);當在60分和84分之間時,打印P(PASS)。
CMP AL,60JB FAILCMP AL,85JAE GOODPASS: MOV AL,’P’JMP PRINTFAIL: MOV AL,’F’JMP PRINTGOOD: MOV AL,’G’PRINT:…2.4.3循環控制指令
(1)循環指令LOOP
格式:LOOP DST8
功能:CX<—(CX)-1 。
若CX≠0,就轉去DST8循環執行程序;
若CX=0,順序執行后續程序。
可等價于:
DEC CX ;CX<—(CX)-1
JNZ DST8 ;ZF=0,轉向dst執行
(2)相等或為零循環指令LOOPZ /LOOPE
格式: LOOPZ DST8 ;CX ≠ 0且ZF=1循環
LOOPE DST8 ;CX ≠ 0且ZF=1循環
(3)不等或不為零循環指令LOOPNZ /LOOPNE
格式:LOOPNZ DST8 ;CX ≠ 0且ZF=0循環
LOOPNE DST8 ;CX ≠ 0且ZF=0循環
說明:在LOOPE和LOOPNE兩條指令中,只要兩個條件中任一個不滿足,循環就結束。
以上三條指令的執行步驟:CX ← (CX) - 1
檢查測試條件, 若滿足則轉到指令中指定的短標號處; 否則, 順序執行下一條指令。且三條指令對狀態標志位均無影響。
2.4.4過程調用和返回
(1)子程序調用指令CALL
a.段內直接調用
格式: CALL NEAR PTR DISP16
操作:
SP←(SP)-1,[SP]←IPH ;保護斷點
SP←(SP)-1,[SP]←IPL ;保護斷點
IP←(IP)+disp16 ;轉移到目標
- DST為目標地址 , 它是一個近過程名(段內的過程)
- disp16是16位帶符號數,為相對偏移量
- 該指令的相對轉移范圍是±32K
b.段內間接調用
格式: CALL reg16/mem16
操作:
SP←(SP)-2;[SP+1, SP]←IP;
IP←reg16/mem16
其中, reg16和mem16是16位的寄存器或存儲器操作數。
c.段間直接調用
格式: CALL FAR PTR DST
操作:
SP←(SP)-2,[SP+1,SP]←CS,
CS←SEG DST;
SP←(SP)-2,[SP+1, SP]←IP,
IP←OFFSET DST
- DST是一個遠程過程名(其它代碼段的過程)
- SEG和OFFSET是運算符, 功能為取得過程的段基址和偏移地址。
d.段間間接調用
格式: CALL mem32
操作: SP←(SP)-2,[SP+1,SP]←CS;
SP←(SP)-2,[SP+1,SP]←IP;
IP←[mem32],CS←[mem32+2]
mem32是一個32位(4字節)的存儲器操作數
(2)子程序返回指令RET
格式: RET
操作:
近過程返回: IP←[SP+1,SP],SP←(SP)+2
遠過程返回: IP←[SP+1,SP],SP←(SP)+2
CS←[SP+1,SP],SP←(SP)+2
2.4.5中斷和返回指令
(1)雙字節指令INT nnH
格式: INT nnH
功能:啟動一個類型號為nn的軟中斷。
說明: nn是8位的,00H~FFH。
INT指令可以用來建立一系列管理程序,供系統或用戶程序使用。
(2)IRET /IRETD
用在任何一種中斷服務程序的末尾,以退出中斷。
2.5串操作指令
字符串: String,是指一個數據塊或多個字符的集合,簡稱“串”。
串操作: 微機經常要對字符串執行一些諸如串傳送、判斷兩個串是否相同、查找關鍵字、計算串長度、修改字符參數等操作,這些操作統稱為“串操作”。
隱含尋址
DS:SI-----源操作數指針
ES:DI-----目的操作數指針
CX----------字符串長度。
每次串操作后,存放操作數偏移地址的SI和DI內容將自動修改。
DF標志
如果DF=0,則SI和DI按增量修改。
如果DF=1,則SI和DI按減量修改。
2.5.1字符串傳送指令MOVS
格式:
[REP]MOVS dst_string , src_string
[REP]MOVSB ; Byte
[REP]MOVSW ; Word
EX6. 將3000H:1000H地址開始的100個字節數傳送到3000H:2000H開始的單元中。
2.5.2字符串比較指令CMPS
格式:
[REP]CMPS dst_string , src_string [REP] CMPSB ; Byte [REP] CMPSW ; Word- 功能:將源串(DS:SI)所指存儲單元內容減去目的串(ES:DI)所指存儲單元內容
- 但不送結果,僅置標志位(OSZAPC位)
- 并使SI、DI自動修改指向下一單元。
- 常和重復前綴REPE/REPZ使用。
2.5.3字符串掃描指令SCAS
格式:
[REPE/REPNE] SCAS dst_string [REPE/REPNE] SCASB ; Byte [REPE/REPNE] SCASW ; Word比較結果影響狀態標志位。
2.5.4取字符串數據指令CMPS
格式: LODS src_string
LODSB / LODSW
2.5.5寫字符串數據指令STOS
格式: [REP] STOS [ES:]dst_string
[REP] STOSB /[REP] STOSW
2.5.6REP重復前綴
REP 無條件重復前綴。
格式: REP 串指令(MOVS , STOS)
(1)重復前綴REPE 的功能
格式: REPE/REPZ CMPS/SCAS
兩個數相等時才能繼續串操作,若不相等則退出串操作。
(2)重復前綴REPNE 的功能
格式:REPNE/REPNZ CMPS/SCAS
兩個數不相等時才能繼續串操作,若相等則退出串操作。
2.6處理器控制類指令
2.6.1標志操作指令
2.6.2外部同步指令
2.6.3空操作
NOP 空操作指令
單字節 90H 單總線周期
3.匯編語言數據
常數類型數值型常數字符串型常數符號常數- 標識符(identifier )
- 保留字(reserved word)
- 分界符(delimiter )
- 注釋 (note )
保留字: 是系統預先保留下來的具有特殊含義的符號;
標號: 指令性語句的符號地址;
表達式: 由運算對象及運算符組合。
變量:在除代碼段以外的其他段被定義,用來定義存放在存儲單元中的數據,在匯編程序中可以修改變量的值。
- 變量表示定義數據項中第一個字節在現行段中的地址偏移量;
- 定義變量就是給變量分配存儲單元,起一個名字,并為之賦初值;
- 定義變量是由偽指令完成的。
變量的三個屬性:
- 段值(Segment): 變量單元所在段的段地址;
- 偏移量(Offset): 變量單元地址與段的起始地址之間的字節數;
- 類型(Type): 變量有三種類型:字節(Bytes)、字 (Word)、雙字(Double Word);
標號: 標號是指令性語句的符號地址。是轉移指令和調用指令的目的地址。
- 標號和變量類似,都是存儲單元的地址。
- 但是,標號對應的是存儲單元中存放的是指令。
- 而變量對應的是存儲單元中存放的是數據
標號的三個屬性:
- 段值(Segment):指令目標代碼所在段的段地址;
- 偏移量(Offset):指令目標代碼首字節與段的起始地址之間的字節數;
- 類型(Type):標號的類型有兩種: 近(Near)、遠(FAR)。
這篇只是最基礎的概念
真正的實踐和之前所預想的學習計劃相比起來 出入較大
那就下一篇再繼續補充~
總結
以上是生活随笔為你收集整理的汇编语言程序设计(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 36.简繁转换函数
- 下一篇: php事务 面向对象,关于PHP面向对象