




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第九講杭州電子科技大學微機原理與接口技術1/14/20241§3-38086的指令系統
按功能可分為以下六類:數據傳送指令算術運算指令邏輯運算和移位指令串操作指令轉移指令處理器控制指令1/14/20242§3-38086的指令系統一、數據傳送指令(14條)通用數據傳送指令地址目標傳送指令MOV字節或字的傳送LEA裝入有效地址PUSH如棧指令LDS裝入數據段寄存器POP出棧指令LES裝入附加段寄存器XCHG交換字或字節標志傳送指令XLAT表轉換LAHF標志寄存器低字節裝入AH輸入輸出指令SAHFAH內容裝入標志寄存器低字節IN輸入PUSHF標志寄存器入棧指令OUT輸出POPF出棧,并送入標志寄存器1/14/20243§3-38086的指令系統加法減法ADD加法SUB減法ADC帶進位的加法SBB帶借位的減法INC增量DEC減量AAA加法的ASCII調整NEG取負DAA加法的十進制調整CMP比較除法AAS減法的ASCII調整DIV無符號數除法DAS減法的十進制調整IDIV整數除法乘法AAD除法的ASCII調整MUL無符號數乘法CBW把字節轉換成字IMUL整數除法CWD把字轉換成雙字AAM乘法的ASCII調整二、算術邏輯指令(20條)1/14/20244§3-38086的指令系統—邏輯運算和移位指令
三、邏輯運算和移位指令邏輯運算算術邏輯移位NOT取反SHL/SAL邏輯/算術左移AND邏輯乘(與)SHR邏輯右移OR邏輯加(或)SAR算術右移XOR異或循環移位TEST測試ROL循環左移ROR循環右移RCL通過進位的循環左移RCR通過進位的循環右移1/14/20245§3-38086的指令系統—字符串處理指令
字符串操作指令的類型和格式指令名稱字節/字操作字節操作字操作字符串傳送字符串比較字符串掃描字符串裝入字符串存儲MOVS
目的串,源串CMPS
目的串,源串SCAS
目的串LODS
源串STOS
目的串MOVSBCMPSBSCASBLODSBSTOSBMOVWCMPSWSCASWLODSWSTOSW1/14/20246無條件轉移和過程調用指令JMPCALLRET無條件轉移過程調用過程返回條件轉移JZ/JE
(10條指令)JA/JNBE(8條指令)直接標志轉移間接標志轉移條件循環控制LOOPLOOPE/LOOPZLOOPNE/LOOPNZJCXZCX≠0則循環CX≠0和ZF=1則循環CX≠0和ZF=0則循環CX=0則轉移中斷INTINTOIRET中斷溢出中斷中斷返回控制轉移類指令1/14/20247§3-38086的指令系統—控制轉移指令無條件轉移指令的類型和方式類型方式尋址目標指令舉例段內轉移直接直接立即短轉移(8位)立即近轉移(16位)JMPSHORTPROG_SJMPNEARPTRROG_N間接間接寄存器(16位)存儲器(16位)JMPBXJMPWORDPTR5[BX]段間轉移直接間接立即轉移(32位)存儲器(32位)JMPFARPTRPROG_FJMPDWORDPTR[DI]1/14/20248§3-38086的指令系統—控制轉移指令
⑴直接標志轉移指令(10條)指令助記符測試條件指令功能JCJNCJZ/JEJNZ/JNEJSJNSJOJNOJP/JPEJNP/JPOCF=1CF=0ZF=1ZF=0SF=1SF=0OF=1OF=0PF=1PF=0有進位轉移無進位轉移結果為零/相等轉移不為零/相等轉移符號為負轉移符號為正轉移溢出轉移無溢出轉移奇偶位為1/為偶轉移奇偶位為0/為奇轉移1/14/20249§3-38086的指令系統—控制轉移指令
(2)間接標志條件轉移指令類別指令助記符測試條件指令功能無符號數比較測試JA/JNBEJAE/JNBJB/JNAEJBE/JNACF∨ZF=0CF=0CF=1CF∨ZF=1高于/不低于等于轉移高于等于/不低于轉移低于/不高于等于轉移低于等于/不高于轉移帶符號數比較測試JG/JNLEJGE/JNLJL/JNGEJLE/JNG(SF⊕OF)∨ZF=0SF⊕OF=0SF⊕OF=1(SF⊕OF)∨ZF=1大于/不小于等于轉移大于等于/不小于轉移小于/不大于等于轉移小于等于/不大于轉移1/14/202410§3-38086的指令系統—控制轉移指令
3.循環控制指令(IterationControl)特點:▲是一組增強型的條件轉移指令,控制程序段的重復執行,重復次數存于CX寄存器中。▲指令的字節數均為2,第一字節是操作碼,第二字節是8位偏移量,轉移的目標都是短標號。▲循環指令中的偏移量都是負值。▲循環控制指令均不影響任何標志。這類指令共有4條。1/14/202411§3-38086的指令系統—控制轉移指令
(1)LOOP循環指令(Loop)指令格式:LOOP短標號指令功能:控制重復執行一系列指令,重復次數放在CX寄存器中,每執行一次LOOP指令,CX自動減1。如果減1后CX≠0,則轉移到指令中所給定的標號處繼續循環;若自動減1后CX=0,則結束循環。一條LOOP指令相當于執行以下兩條指令的功能:
DECCXJNZ標號1/14/202412§3-38086的指令系統—控制轉移指令⑵LOOPE/LOOPZ相等或結果為零時循環(LoopIfEqual/Zero)指令格式:LOOPE標號或LOOPZ標號指令功能:LOOPE是相等時循環;LOOPZ是結果為零時循環;指令執行前,先將重復次數送到CX中,每執行一次指令,CX自動減1,若減1后CX≠0和ZF=1,則轉到指令所指定的標號處重復執行;若CX=0或ZF=0,便退出循環。1/14/202413§3-38086的指令系統—控制轉移指令
⑶LOOPNE/LOOPNZ不相等或結果不為零循環
(LoopIfNotEqual/NotZero)
指令格式:LOOPNE標號
或LOOPNZ標號
指令功能:LOOPNE是不相等時循環;LOOPNZ是結果不為零循環。指令執行前,應將重復次數送入CX,每執行一次,CX自動減1,若減1后CX≠0和ZF=0,則轉移到標號所指定的地方重復執行;若CX=0或ZF=1,則退出循環,順序執行下一條指令。1/14/202414§3-38086的指令系統—控制轉移指令
⑷JCXZ若CX為0跳轉(JumpIfCXZero)指令格式:JCXZ標號指令功能:若CX寄存器為零,則轉移到指令中標號所指定的地址處,它不對CX寄存器進行自動減1的操作。主要用在循環程序開始處,為跳過循環,把CX寄存器清零。1/14/202415§3-38086的指令系統—處理器控制指令1.標志操作指令:
六、處理器控制指令指令指令助記符操作指令名稱CLCCF←0進位標志清0(ClearCrray)CMCCF←/CF進位標志求反(ComplementCarry)STCCF←1進位標志置1(SetCarry)CLDDF←0方向標志清0(ClearDirection)STDDF←1方向標志置1(SetDirection)CLIIF←0中斷標志清0(ClearInterrupt)STIIF←1中斷標志置1(SetInterrupt)1/14/2024162.外部同步指令§3-38086的指令系統—處理器控制指令
使CPU與其它協處理器同步工作的指令,用于多處理機;指令執行后均不影響標志位。共3條。⑴ESC換碼指令(Escape)
指令格式:ESC外部操作碼,源操作數
指令功能:換碼指令用來實現8086對8087協處理器的控制。⑵WAIT等待指令(Wait)
通常用在CPU執行ESC指令后,表示8086CPU正處于等待狀態,它不斷檢測8086的測試引腳TEST,每隔5個時鐘周期檢測一次,若此腳為高電平,則重復執行WAIT指令,處理器處于等待狀態。一旦TEST引腳的信號變為低電平,便退出等待狀態,執行下條指令。⑶LOCK封鎖總線指令(LockBus)
是一種前綴,加在指令的前端,用來維持8086的總線封鎖信號LOCK有效,帶有LOCK前綴的指令在執行過程中,禁止其它協處理器使用總線。1/14/202417§3-38086的指令系統—處理器控制指令3.停機指令和空操作指令⑴HLT停機指令(Halt)CPU進入暫停狀態,不進行任何操作。下列情況發生時,CPU才脫離暫停狀態:在RESET線上加復位信號;在NMI引腳上出現中斷請求信號;在允許中斷的情況下,在INTR引腳上出現中斷請求信號;⑵NOP空操作或無操作指令(NoOperation)
單字節指令,執行時需耗費3個時鐘周期的時間,但不完成任何操作。常在循環等操作中增加延時,或在調試程序時使用空操作指令。1/14/202418§3-38086的指令系統—指令的執行時間和軟件延時
表中的EA項表示,該指令執行時還要考慮計算有效地址所需要的時間。七、指令的執行時間和軟件延時
8086指令的執行速率是由晶振控制產生的時鐘決定的,每條指令執行時都需要幾個時鐘周期。已知8086CPU的工作時鐘為5MHZ,則1個時鐘周期為0.2us。一些指令執行時需要的時鐘數和時間值指令時鐘周期數執行時間MOV寄存器,寄存器CALL段內直接調用CALL段間間接調用21937+EA0.2μs×2=0.4μs0.2μs×19=3.8μs0.2μs×(37+EA)μs1/14/202419§3-38086的指令系統—指令的執行時間和軟件延時計算EA所需要的時間尋址方式時鐘周期數直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址6597~811~12
在程序中需要一定的延時或進行定時時,可以選用適當的指令(如NOP等)和循環控制指令構成延時程序。這種方法常被稱為軟件延時或定時。1/14/202420§3-38086的指令系統—指令的執行時間和軟件延時例設CPU的時鐘頻率為5MHZ,試編寫一個延時1ms的程序。解:程序如下: ;時鐘周期×執行次數
DEL_1MS: MOV CX,N ;4×1NEXT: NOP ;3×N NOP ;3×N LOOP NEXT ;循環時為17,不循環為5延時常數N的計算:CPU的時鐘頻率為5MHZ,則一個時鐘周期為:0.2us。延時t=1ms所需要的總的時鐘周期數CT為:CT
=1s/0.2us=5000總的時鐘周期數CT又可以用循環常數N來表示:
∵CT=4+3N+3N+17(N-1)+5=23N-8=5000∴N=(5000+8)/23=218=0DAH,可實現1ms的精確延時。(注:第一條指令只執行一次;兩條NOP指令各執行N次;最后的LOOP指令,共循環執行N一1次,最后一次不循環)1/14/202421§3-38086的指令系統—指令的執行時間和軟件延時例若希望獲得時間更長的延時,可以采用嵌套的多重循環程序來實現。這時程序中往往有兩個定時常數,通常先指定其中的一個,再計算出另一個。
;時鐘×次數
MOV BX,N1 ;4×1CNT1: MOV CX,N2 ;4×N1CNT2: LOOP CNT2 ;(17×N2-12)×N1 DEC BX ;2×N1 JNZ CNT1 ;16×N1-12
上面程序執行所需要的總的時鐘周期數CT為:
CT=4+(4×N1)+((17×(N2-1)+5)×N1)+(2×N1)+(16×(N1-1)+4)
=4+(4×N1)+((17×N2-12)×N1)+(2×N1)+(16×N1-12)
=17×N1×N2+10×N1-8
假設CPU的時鐘頻率仍為5MHz,可根據所需的延時,計算出總的時鐘周期數。然后,先選定常數N2,再根據上式算出N1來。1/14/202422§3-38086的指令系統—本章小結
8086指令的尋址方式類型一、立即尋址方式二、寄存器尋址方式三、直接尋址方式四、寄存器間接尋址方式五、寄存器相對尋址方式六、基址變址尋址方式七、相對基址變址尋址方式八、其它
指令分為以下六類
一、數據傳送指令二、算術運算指令三、邏輯運算和移位指令四、字符串處理指令五、控制轉移指令六、處理器控制指令1/14/202423小結1.重點
尋址方式、指令系統2.難點
指令的正確應用1/14/202424第四章宏匯編語言程序設計匯編語言程序格式MASM中的表達式偽指令語句DOS系統功能調用和BIOS中斷調用內容提要1/14/202425▲匯編語言(AssemblyLanguage)
指令的助記符
+符號地址+標號是機器語言的符號表示,是較低級的語言。▲源程序利用匯編語言編寫的程序,稱源程序。不能被機器識別。▲源程序的運行匯編程序翻譯成二進制的浮動目標程序
連接程序將目標文件與庫文件相連,形成可執行程序
可執行的程序在機器上直接運行▲高級語言:可讀性好,編程簡單;
匯編語言:實時性能好,程序效率高,節省內存,運行速度快,
第四章宏匯編語言程序設計—概述概述1/14/202426第四章宏匯編語言程序設計—概述例
在屏幕上顯示并打印字符串“Thisisasampleprogram”。一個完整的用匯編語言編寫程序的格式:
DATA SEGMENT
;數據段
DA1 DB ‘Thisisasampleprogram.’ DB 0DH,0AH,‘$’DATA ENDSSTACK SEGMENT
;堆棧段
ST1 DB 100DUB(?)STACK ENDSCODE SEGMENT
;代碼段MAIN PROC FAR ASSUMECS:CODE,DS:DATA,SS:STACK ORG 1000 START: PUSH DS ;正常返回所需段地址及偏移地址
MOV AX,0 PUSH AX 1/14/202427第四章宏匯編語言程序設計—概述
MOV AX,DATA ;送數據段段地址
MOV DS,AX MOV AX,STACK ;送堆棧段地址
MOV SS,AXMOV AH,9 ;DOS9號功能調用,顯示字符串
MOV DX,OFFSETDA1 INT 21H RETMAIN ENDPCODE ENDS END START1/14/202428§4-1匯編語言程序格式§4-1匯編語言程序格式—概述
宏匯編使用的語句分兩類指令性語句偽指令語句1/14/202429§4-1匯編語言程序格式—指令性語句
指令性語句:機器指令相對應,可譯成目標代碼(機器指令代碼)。語句格式:標號:指令助記符操作數,操作數 ;注釋標號:指令語句的符號地址,后面必須緊跟冒號“:”。標號可使用的字符為字母(A~Z,a~z)、數字(o~9)或某些特殊字符(@、一、?)等。第一個字符必須為字母或某些特殊字符,最大有效字符長度為31個字符(匯編程序僅識別前面31個字符)。標號可以省略,它經常作為表示轉移的地址。指令助記符:指令名稱的代表符號,指出指令的操作類型。可譯成機器碼;不可省略,是關鍵字。一、指令性語句1/14/202430§4-1匯編語言程序格式—指令性語句
操作數:參與指令運算的數據。可以有一個、多個操作數或無操作數;多個操作數之間用逗號“,”隔開,操作數與指令助記符之間用“空格”隔開。操作數可以是常數、變量、標號、寄存器名或表達式。注釋:說明指令或程序的功能,可省略。注釋前加分號“;”。一、指令性語句1/14/202431§4-1匯編語言程序格式—偽指令語句
偽指令語句:無對應的機器指令,匯編時對偽指令進行處理,可完成數據定義、存儲區分配、段定義、段分配、指示程序結束等功能。語句的格式:名字偽指令指示符操作數,操作數;注釋名字:用符號地址表示,名字后不允許帶冒號“:”,但可以省略。通常是變量名、段名、過程名、符號名等。偽指令指示符:匯編程序MASM規定的符號。常用的有變量定義語句(DB、DW),符號定義語句(EQU、=),段定義語句(SEGMENT…END),段分配語句(ASSUME),過程定義語句(PROC…ENDP)等。操作數:不同偽指令有不同要求。操作數可以是常數、變量、字符串、表達式等。二、偽指令語句1/14/202432§4-1匯編語言程序格式——數據項
匯編語言中的操作數,可以是常數、寄存器、存儲器、變量、標號或表達式。其中,常數、變量、標號是三種基本數據項。1.常數三、數據項是固定值,沒有屬性,是確定的數據。二進制:字母“B”結尾,例00110100B;八進制:字母“Q”或“O”結尾,例1037O、2370Q;十進制:字母“D”結尾或省略,或科學表示法,例1234D、5678、2.735E-2;十六進制:字母“H”結尾,“A~F”開頭時,前面加0,例56H、0A7F2H;字符串:用單引號‘’括起來,機內存放的是各字符的ASCII碼。例‘ABC’。1/14/202433§4-1匯編語言程序格式——數據項2.變量變量通常指存放在存儲單元中的值,程序運行中可以修改。所有的變量都具有三個屬性。⑴段值(SEGMENT):變量所在段的段基址。⑵段內偏移地址(OFFSET):指變量所在地址與所在段首地址之間的地址偏移字節數。
⑶類型(TYPE):指變量中每個元素所包含的字節數,類型有字節變量(BYTE)、字變量(WORD)、雙字變量(DWORD)等。1/14/202434§4-1匯編語言程序格式—數據項3.標號標號是可執行指令語句的地址的符號表示,可作為程序轉向的目標地址。具有三個屬性。
(1)段值(SEGMENT):標號所在段的段基址。
(2)段內偏移地址(OFFSET):標號所在地址與所在段的段首址之間的偏移地址字節數。
(3)類型(TYPE):指在轉移指令中標號可轉移的距離,也稱距離屬性。類型NEAR,表示此標號為近標號,只能實現段內轉移或調用;類型FAR,表示此標號為遠標號,可以實現段間轉移或調用。
注意:若標號后面緊跟冒號,表示隱含此標號距離屬性為NEAR,也可用偽指令將此屬性改為FAR。1/14/202435§4-2MASM中的表達式—概述§4-2MASM中的表達式概述表達式:運算對象+運算符。在匯編時進行運算,運算結果作為語句中的操作數。運算對象:常數、變量、標號。得到的運算結果可以是一個常數字,也可以是一個存儲器的地址。
MASM中6類運算符:如表4-1所示。算術運算符(ArithmeticOperators)邏輯運算符(LogicalOperators)關系運算符(RelationalOperators)數值返回運算符(Value-ReturningOperators)修改屬性運算符(ModifingattributeOperators)其它運算符(otherOperators)1/14/202436§4-2MASM中的表達式—
概述MASM的表達式中的運算符(1)類型符號名稱運算結果算術運算符+-*/MODSHLSHR加法減法乘法除法模除左移右移和差乘積商余數左移后二進制數右移后二進制數邏輯運算符ANDORXORNOT與運算或運算異或運算非運算邏輯與結果邏輯或結果邏輯異或結果邏輯非結果1/14/202437§4-2MASM中的表達式—概述MASM的表達式中的運算符(2)類型符號名稱運算結果關系運算符EQNELTLEGTGE相等不等小于小于等于大于大于等于結果為真輸出全“1”結果為假輸出全“0”數值返回OFFSETSEGTYPELENGTHSIZE返回偏移地址返回段基址返回元素字節數返回變量單元數返回變量總字節數偏移地址段基址字節數單元數總字節數1/14/202438§4-2MASM中的表達式—概述MASM的表達式中的運算符(3)類型符號名稱運算結果修改屬性段寄存器名PTRTHISHIGHLOWSHOR段前綴修改類型屬性指定類型/距離屬性分離高字節分離低字節短轉移說明修改段修改后類型指定后類型高字節低字節-128~127字節間轉移其他運算符()[].<>MASKWIDTH園括號方括號點運算符尖括號記錄位圖記錄寬度改變運算符優先級下標或間接尋址連接結構與變量修改變量位圖形記錄/字段位數1/14/202439§4-2MASM中的表達式—算術運算符包括7種:十、一、×、\(除,只取除法運算結果之商)、MOD(模,只取除法運算結果之余數)、SHL(左移,左移1位相當于乘2)、SHR(右移,右移1位相當于除2)。
注意:▲所有的算術運算符均可以對數據進行運算,運算對象與運算結果都是整數。▲若對地址運算,通常是在標號上加/減某一個數字量。例
數組ARRAY定義如下
ARRAY DB 1,2,3,4,5,6,7,8TRY DB 20指令為:MOV AX,30*5 MOV CX,(TRY-ARRAY)匯編時,計算表達式形成如下指令:
MOV AX,150 MOV CX,8一、算術運算符1/14/202440§4-2MASM中的表達式—
算術運算符例匯編程序指令格式如下:
DA EQU 300 MOV AX,DA-80 MOV BX,DAMOD100 MOV CX,DA/100 MOV DH,01100100BSHR2匯編時,計算表達式形成指令為:
DA EQU 300 MOV AX,220 MOV BX,0 MOV CX,3 MOV DH,19H1/14/202441§4-2MASM中的表達式—邏輯運算符
包括4種:AND(與)、OR(或)、NOT(非)、XOR(異或)
注意:按位運算的,只能對常數進行運算,得到結果也是常數。例
MOV AL,NOT0FFH MOV BL,8CHAND73H MOV AH,8CHOR73H MOV DH,01100100BSHR2
匯編時,計算表達式形成指令為:
MOV AL,0 MOV BL,0 MOV AH,0FFH MOV CH,0FFH
例
IN PORT ;PORT為輸入端口號
AND DX,PORTAND0FEH OUT DX,AX ;DX為輸出端口號二、邏輯運算符1/14/202442§4-2MASM中的表達式—邏輯運算符
例
MOV AL,NOT0FFH MOV BL,8CHAND73H MOV AH,8CHOR73H MOV DH,01100100BSHR2匯編時,計算表達式形成指令為:
MOV AL,0 MOV BL,0 MOV AH,0FFH MOV CH,0FFH例
IN PORT ;PORT為輸入端口號
AND DX,PORTAND0FEH OUT DX,AX ;DX為輸出端口號1/14/202443§4-2MASM中的表達式—關系運算符
包括6種:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)
。
注意:關系運算符的兩個操作數必須是數據,或是同一段內的兩個存儲單元的地址;若結果為真,輸出全是l,即0FFH或0FFFFH;若結果為假,輸出全是0。例
MOVAX,10HGT16ADDBL,6EQ0110BMOVCX,((PORTLT5)AND100)OR((PORTGE5)AND200)匯編時,計算表達式形成指令為:
MOV AX,0 ADD BL,0FFH MOV CX,100 ;當端口<5時三、關系運算符1/14/202444§4-2MASM中的表達式—數值返回運算符數值返回運算符也稱作分析運算符(Analyticopertors)。包括5種:OFFSET、SEG、TYPE、LENGTH、SIZE
。
【功能】加在變量或標號前,返回運算對象的某個參數值。例如偏移地址值、段地址值、類型屬性、變量包含的單元數等。
1.OFFSET
【格式】OFFSET
變量或標號
【功能】返回標號或變量的偏移地址值。
例若DA1為數據段中一個變量名
MOVBX,OFFSETDA1 ;等價于LEABX,DA1四、數值返回運算符1/14/202445§4-2MASM中的表達式—數值返回運算符2.SEG【格式】SEG
變量或標號【功能】取變量或標號的段基值。例 MOV AX,SEGM1 MOV DS,AX設:M1是段名為DATA的數據段中的一個變量名;如DATA段從0500H開始,上述指令把0500H作為立即數在連接時插入指令,匯編后指令變為: MOV AX,0500H MOV DX,AX1/14/202446§4-2MASM中的表達式—數值返回運算符3.TYPE【格式】TYPE
變量或標號【功能】加在變量前,返回變量的類型屬性;加在標號前,返回標號的距離屬性。如下表所示。TYPE運算符返回值-1[FFH]-2[FEH]NEARFAR標號DBDWDDDQ類型1248返回值
變量1/14/202447
§4-2MASM中的表達式—數值返回運算符例
A1 DB20H,30H A2 DW0438H A3 DD?L1: MOV AH,TYPEA1 MOV BH,TYPEA2 ADD AL,TYPEA3 MOV BL,TYPEL1匯編時,計算表達式形成指令為:
MOV AH,1 MOV BH,2 MOV AL,4 MOV BL,0FFH1/14/202448§4-2MASM中的表達式——數值返回運算符4.LENGTH【格式】LENGTH
變量【功能】當變量中使用DUP時,LENGTH返回此變量所包含的單元數,對其它變量則返回1。例 M1 DW100DUP(?) M2 DW1,2,3 M3 DB‘A,B,C,D‘ MOV CX,LENGTHM1 MOV BL,LENGTHM2 ADD AL,LENGTHM3 MOV BL,TYPEL1匯編時,計算表達式形成指令為:
MOV CX,100 ;返回變量所包含的100個字單元
MOV BL,1 MOV AL,11/14/202449§4-2MASM中的表達式——數值返回運算符5.SIZE【格式】SIZE變量【功能】加在變量前,返回該變量包含的總字節數。SIZE=LENGTH*TYPE例對上例定義的M1,M2,M3 MOV CX,SIZEM1 ADD BL,SIZEM2 MOV AL,SIZEM3匯編時,計算表達式形成指令為:
MOV CX,200 ;返回變量所包含的200個字單元
MOV BL,2 MOV BL,1
1/14/202450§4-2MASM中的表達式—修改屬性運算符修改同性運算符也稱作綜合運算符(Syntheticoperators)。包括6種:段操作符、PTR、THIS、HIGH、LOW、SHORT【功能】在程序運行過程中,修改變量或標號的屬性,包括段屬性、偏移地址屬性、類型屬性等。1.段操作符【格式】段前綴:變量或地址表達式【功能】表示某個變量或地址被修改。
例:MOVAX,ES:[BX]五、修改屬性運算符1/14/202451§4-2MASM中的表達式—修改屬性運算符2.PTR
【格式】類型/距離PTR變量或標號
【功能】將PTR左邊的類型屬性賦給右邊的變量或標號。
注意:PTR本身不分配存儲單元,僅對已分配的存儲單元賦予新的屬性;常與類BYTE、WORD、NEAR、FAR等連用。五、修改屬性運算符1/14/202452§4-2MASM中的表達式—修改屬性運算符
例
N1 DB 15H,36H N2 DW 1122H,3344H LO: MOV AX,WORDPTRN1 ;使N1轉換成AX類型
MOV BL,BYTEPTRN2 ;使N2轉換成BL類型例
MOV[BX],10H分析:將立即數送入BX間址指定的存儲單元,可以通過PTR指明是存入字節單元還是字單元。
MOVBYTEPTR[BX],l0H ;[BX]
10H MOVWORDPTR[BX],10H ;[BX],[BX+1]
0010H也可用PTR來改變距離屬性,
JMPFARPTRLOOP在JMP語句中將標號LOOP改為FAR,使JMP指令在其它代碼段中也可以用,實現段間轉移。1/14/202453§4-2MASM中的表達式—修改屬性運算符
3.THIS【格式】變量/標號EQUTHIS類型/距離【功能】將EQUTHIS右邊的類型/距離屬性,賦給左邊的變量/標號,該變量或標號的段地址和偏移地址與下一個存儲單元的地址相同。【例】 FIRST EQUTHISBYTE TABLEDW200DUP(?)FIRST的偏移地址值與TABLE的偏移地址值相同,區別在于FIRST變量為字節類型,TABLE為字類型。【例】 SP EQUTHISFAR MOV AX,100此時MOVAX,100前有標號SP,并賦予FAR屬性,允許其它段的JMP指令跳到本段SP上。1/14/202454§4-2MASM中的表達式—修改屬性運算符
4.SHOT【格式】SHORT標號【功能】說明轉移類指令中轉向地址的屬性為短轉移:-128~+127之間。例 L1: JMP SHOTL2 ……… L2: MOV AX,0
5.HIGH和LOW【格式】HIGH/LOW
變量或標號【功能】HIGH和LOW稱為字節分離運算符。HIGH從中分離出高位字節,LOW分離出低位字節。例 K1 EQU0ABCDH K2 EQU1234H MOV AH,HIGHK1 MOV BL,LOWK2匯編時,計算表達式形成指令為:
MOV AH,0ABH MOV BL,34H1/14/202455§4-2MASM中的表達式—其它運算符1.圓括號():()中的運算符具有最高優先權。2.方括號[]:方括號主要用來表示地址表達式或多重變量的下標值。3.尖括號<>,及圓點·在結構中專用。4.MASK和WIDTH在記錄中專用。六、其它運算符1/14/202456§4-2MASM中的表達式——優先級
表達式的計算原則:同級運算符從左到右的,圓括號()可改變優先級次序。運算符的優先級別如下表所示。七、優先級運算符優先級次序優先級運算符12345678910(),[],<>,?,LENGTH,WIDTH,SIZE,MASKPTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:HIGH,LOW*,/,MOD,SHL,SHR+,-EQ,NE,LT,LE,GT,GEHOTANDOR,XORSHORT1/14/202457§4-3偽指令語句—概述
概述偽指令語句:在匯編期間進行處理,主要完成變量定義,存儲器分配,指示程序開始和結束,段定義,段分配等。類型:數據定義語句:DB,DW,DD標號賦值語句:EQU,=段定義語句:SEGMENNT…ENDS段分配語句:ASSUME過程定義語句:PROC…ENDP程序開始結束語句:ORG,END,NAME群定義語句:GROUP結構定義語句:STRUC…ENDS記錄定義語句:RECODE1/14/202458§4-3偽指令語句—數據定義語句
【格式1】變量名助記符操作數,操作數… ;注釋【格式2】變量名助記符nDUP(操作數,操作數…) ;注釋【功能】指定的存儲單元,以分配存儲空間或存入操作數。變量名——用符號表示,可以省略,后面不跟冒號。匯編時將變量助記符后的第一個字節的偏移地址作為它的符號地址。助記符——所用偽指令助記符主要有:DB:用來定義字節; DW:用來定義字;DD:用來定義雙字; DQ:用來定義四個字;DT:用來定義十個字節;操作數——操作數可以是常數,字符串,變量,標號,表達式等。多個操作數之間必須用逗號分開;格式2中,n必須是正整數。
注釋——說明偽指令的功能,可以省略,注釋前必須帶分號“;”。一、數據定義語句1/14/202459§4-3偽指令語句——數據定義語句
例操作數是常數或表達式:DA1 DB10H,52H
;變量DA1中裝入10H,52HDA2 DW1122H,34H
;變量DA2中裝入22H,11H,34H,00HDA3 DD5*20H,0FFEEH
;變量DA3中裝入A0H,00H,00H,00H, ;EEH,FFH,00H,00HDA1DA2DA31122H0034H00A0HFFEEH105222113400A0000000EEFF00001/14/202460§4-3偽指令語句
——數據定義語句例操作數是字符串FIRST DB‘HELLO’;字符串‘HELLO’的ASII碼裝入FIRST開始的存儲單元SECONDDW‘OK’;字符串‘OK’的ASII碼裝入SECOND開始的存儲單元
;只能定義兩個字符1/14/202461§4-3偽指令語句
——數據定義語句
例操作數用?定義不確定值的變量,用作保留存儲空間。
M1 DB? ;定義變量M1為不確定字節,保留l字節空間
M2 DW0D55H,? ;定義變量M2第二個字為不確定,保留兩個字節空間1/14/202462§4-3偽指令語句
——數據定義語句
例操作數用DUP來定義重復變量
ONE DB5DUP(0)
;重復5個0存入ONE起始的存儲單元
TWO DW10DUP(?)
;重復10次,保留10個字的存儲單元
THREEDB 4DUP(1,2DUP(20H))
;DUP嵌套1/14/202463§4-3偽指令語句
——數據定義語句
例用地址表達式定義變量。已知變量PAR1,標號ADR2和ADR3,有定義為:
ONEDWPAR1 ;PAK1的偏移地址賦給字變量ONETWODWADR2 ;ADR2的偏移地址賦給字變量TWOTHREEDDADR3 ;ADR3的偏移地址和段基址賦給雙字變量THREE設:PAR1,ADR2,ADR3在同一代碼段CS=2000H中,其偏移地址分別為0100H,0200H,0300H。則匯編后存儲器中變量存放格式如右圖所示。1/14/202464§4-3偽指令語句
——數據定義語句例變量的類型屬性可以通過屬性操作符PTR來指定。
OPE1DB 1,2OPE2DW 2233H,5566H
MOV AX,OPE1+1 MOV AL,OPE2
指令中兩個操作數的類型屬性不匹配,匯編程序提示出錯。正確的格式為:
MOVAX,WORDPTROPE1十1 ;AX=3302H MOVAL,BYTEPTROPE2 ;AL=33H1/14/202465§4-3偽指令語句
——表達式賦值語句共兩種:賦值語句EQU,等號語句=。它們均不占用內存。二、表達式賦值語句1.賦值語句EQU【格式】符號名EQU表達式【功能】給變量、標號、常數、指令、表達式等定義一個符號名,一經定義在同一個程序模塊中不能重新定義。例COUNTEQU100 ;常數值賦給符號名COUNT
DATA EQUCOUNT+2 ;表達式值賦給符號名DATA
A1 EQU[DX+SI];變址尋址存儲單元內容賦給符號名A1
B1 EQUOFFSETA1 ;偏移地址值賦給符號名B1
C1 EQUADD ;加法指令賦給符號名C1注意:在EQU語句右邊表達式中的變量或標號,必須預先定義。
PURGE語句可以解除對某一個標號的賦值。例PURGEC1 ;C1不再代替ADD1/14/202466§4-3偽指令語句
——表達式賦值語句2.等號語句=等號語句“=”與EQU語句具有相同功能,區別僅在于EQU左邊的標號不允許重新定義,用“=”定義的語句允許重復定義。
例
COUNT=100COUNT=COUNT+10A1=BX+SI MOVAX,[A1] ;[BX+SI]單元中的內容
AXB1=ADDA1=BX MOVCX,[A1] ;[BX]單元中的內容
CX1/14/202467§4-3偽指令語句
——段定義語句
段定義語句進行段定義,段分配語句明確段和段寄存器之間的關系。1.段定義語句SEGMENT……ENDS【格式】段名SEGMENT定位類型組合類型‘分類名’
·邏輯段內容段名ENDS【功能】將一個邏輯段定義成一個整體。段名——是邏輯段的標識符,不可省略。它確定了邏輯段在存儲器中的地址,SEGMENT和ENDS前的段名必須相同。SEGMENT…ENDS——是段定義的偽指令助記符,任何一個邏輯段必須以SEGMENT開始,ENDS結束,不可省略,并且必須成對出現,兩者之間是本邏輯段的內容。三、段定義語句1/14/202468§4-3偽指令語句
——段定義語句
⑴定位類型(AlignType)定位該段起始地址。定位類型參數主要有下面4種。①PARA——指定定位段的起始地址必須在節的整數邊界,參數缺省時,就當成PARA。②BYTE——指定該段起始地址定位在存儲單元的任何字節地址。③WORD——指定該段起始地址定位在字的邊界,即段的首地址必須是偶數。④PAGE——指定該段起始地址定位在頁的邊界,即段的首地址必須是256的整數倍。1/14/202469§4-3偽指令語句
——段定義語句
⑵組合類型(CombineType)決定邏輯段之間的組合方式,主要參數有6種。①NONE——該段與其它同名段不連接,各段獨立,可作為缺省參數。②PUBLIC——該段與其它同名段連接時,由低地址到高地址連接,組成一個邏輯段,連接次序由連接命令指定,連接時滿足定位類型要求。③COMMON——該段在連接時與其它模塊中的同名段有相同的起始地址,采用覆蓋的方式在存儲器中存放,連接長度為各分段中最大長度。④AT表達式——定位該段的起始地址在表達式所指定的節(16的整數倍)邊界上。通常各邏輯段在存儲器中的位置由系統自動分配,當要求某邏輯段在指定節的邊界上時,就要用AT參數來實現。AT不能指定代碼段。⑤STACK——指定該段為堆棧段,此參數在堆棧段中不可省略,多個模塊只需設置一個堆錢段,各個模塊中的堆棧段采用覆蓋方式組合。容量為各個模塊中所設置的最大堆棧段容量。1/14/202470§4-3偽指令語句
——段定義語句
⑵組合類型(CombineType)⑥MEMORY——定位該段與其它模塊中的同名段有相同的首地址,采用覆蓋方式在存儲器中組合連接,其功能與COMMON參數類似,區別是第一個帶MEMORY參數的邏輯段復蓋在其它同名段的最上層,其它帶此參數的同名段按照COMMON方式處理。
⑶‘分類名’(C1assName)匯編程序連接時將所有分類名相同的邏輯段組成一個段組。分類名可選擇不超過40個字符的名稱。段定義語句允許嵌套設置,但不允許相互交叉設置。SEGMENT后面帶有的三個參數必須按格式中規定的次序排列,分類名必須用單引號‘’括起來。1/14/202471§4-3偽指令語句
——段定義語句2.段分配語句(ASSUME)將邏輯段定義成代碼段、數據段、堆棧段、附加段。用戶可以設置多個邏輯段,但只允許4個邏輯段同時有效。【格式】ASAUMECS:段名,DS:段名,SS:段名,ES:段名【功能】定義4個邏輯段,指明段和段寄存器的關系。
ASSUME——為偽指令助記符,放在代碼段的開始,不可省略。說明當前代碼段、數據段、堆線段、附加段4個段如何定義。段名必須是用段定義語句SEGMENT…ENDS定義過的名字。ASSUMENOTHING取消前面由ASSUME所指定的段寄存器。例:ASSUMEES:NOTHING
1/14/202472§4-3偽指令語句
——段定義語句注意:代碼段和數據段是必須分配,附加段可以省略。對串指令,必須設置附加段作目標串基址用,附加段也可用來存放數據,增大數據段容量。ASSUME偽指令只將代碼段的段基址自動裝入CS寄存器中,而不能自動把其它段基址裝入相應的段寄存器中,所以在代碼段的開始要有一段初始化程序完成這一工作。堆棧段:將段基址送入SS寄存器外,還要將棧頂偏移地址置入堆棧指示器SP中。1/14/202473§4-3偽指令語句
——段定義語句例
兩個16位無符號二進制數相乘
DDATA SEGMENT ;數據段
D1DW1234H D2DW5678H P1DD? P2DD?DDATA ENDSEDATA SEGMENT ;附加段
E1DB? E2DW4DUP(?)EDATAENDS
SSTACK SEGMENTSTACK‘STACK’ DW100DUP(?)SSTACK ENDS1/14/202474§4-3偽指令語句
——段定義語句CCODE SEGMENTMAIN PROCFAR ASSUMECS:CCODE,DS:DDATA,ES:EDATA,SS:SSTACKSTART: MOVAX,SSTACK ;初始化SS MOVSS,AX PUSHDS SUBAX,AX ;返回DOS用
PUSHAX MOVAX,DDATA ;初始化DS MOVDS,AX MOVAX,EDATA ;初始化ES MOVES,AX1/14/202475§4-3偽指令語句
——段定義語句L1: MOVBX,OFFSETD1 ;D1*D2,積在(DX,AX)
MOVAX,[BX] MOVDX,0 MULWORDPRT[BX+2] MOVBX,OFFSETP1;積→P2和P1所指向的存儲單元 MOV[BX],AX MOV[BX+2],DX RETMAIN ENDPCCODE ENDS ENDSTART1/14/202476§4-3偽指令語句
——過程定義語句過程也稱作子程序。節省內存空間,便于進行模塊化程序設計。【格式】過程名PROC屬性;過程內容
RETN
過程名ENDP【功能】定義一個過程,主程序可以用CALL指令調用它。過程名——過程的名字,不可缺省。子程序入口地址。具有三種屬性:段屬性:該過程所在段的段基址。偏移地址屬性:該過程第一個字節與段首址之間距離字節。距離屬性:為NEAR或FAR。NEAR允許過程在段內調用;FAR允許過程在段間調用,NEAR為缺省使用。
四、過程定義語句1/14/202477§4-3偽指令語句
——過程定義語句PROC…ENDP——過程定義偽指令助記符,成對出現,不可缺省。二者前面有相同的過程名。RETN——為過程內部的返回指令。過程內部至少有一條RET指令,可以在過程的任何位置,使過程返回到主程序。過程內部可以有多個RET,表示此過程具有多個返回出口(在不同條件下,從不同出口返回)。N為彈出值,N必須為正偶數,可以缺省。過程調用允許嵌套和遞歸調用。嵌套與遞歸的深度由堆棧段的容量決定。1/14/202478§4-3偽指令語句
——過程定義語句DATA SEGMENT ONE DB22,33,44,55 TWO DB55,66,77,88 SUM DB20DUP(?)DATA ENDSSTACKSEGMENTSTACK STT DB50DUP(?) TOP EQULENGTHSTTSTACKENDSCODE SEGMENTMAIN PROC FAR ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA例
用過程調用的方法,將內存中N個BCD碼相加。1/14/202479§4-3偽指令語句
——過程定義語句START: MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DX,AX
MOV SI,OFFSETONE ;SI指向第一個加數
MOV BX,OFFSETTWO MOV DI,OFFSETSUM CLD ;清方向標志
CLC ;清進位標志
MOV CX,4LL: CALL ABC LOOP LL RETMAIN ENDP1/14/202480§4-3偽指令語句
——過程定義語句ABC PROC NEAR ;完成單字節數據加法運算
LODSB ;[SI]→AL,SI+1→SIL1: ADC AL,[BX] ;相加
DAA ;十進調整
STOSB ;AL→[DI],DI+1→DI INCBX ;指針改變
RETABC ENDPCODEENDS ENDSTART1/14/202481§4-3偽指令語句
——過程定義語句例遠過程定義及調用格式
MCODE SEGMENTMAIN ……SPD PROC FAR ;過程定義,遠過程屬性
…… RETSPD ENDP ……
CALL SPD ;同一段內調用
……MCODE ENDS
NCODE SEGMENT
;另一段NCODE …… CALL SPD ;遠過程調用
……NCODE ENDS END MAIN1/14/202482§4-3偽指令語句
——過程定義語句例
過程嵌套調用格式MSUB PROC FAR …… CALL SBU1 …… RETSUB1 PROC NEAR …… RETSUB1 ENDPMSUB ENDP1/14/202483§4-3偽指令語句
——程序開始和結束語句1.NAME【格式】NAME程序名【功能】為源程序目標模塊賦名字。NAME——為偽指令助記符,放在程序開始,在輸出匯編語言源程序的列表文件時,將在每一頁的開頭打印出該程序名。若源程序中省略NAME偽指令,匯編程序將源文件名作目標模塊的名字。
2.TITLE【格式】TITLE
文本名【功能】將文本名賦給源程序目標模塊作名字,功能同NAME偽指令。TITLE——是偽指令助記符,文本名可寫60個字符,但匯編程序只將前6個字符作為模塊名,在列表文件中打印出標題來。五、程序開始和結束語句1/14/202484§4-3偽指令語句
——程序開始和結束語句
3.ORG
【格式】ORG表達式
【功能】給匯編程序設置位置指針,指定下面語句的起始偏移地址。
ORG——是偽指令助記符,不可缺省。ORG語句可以放在程序的任何位置。表達式——給定的偏移地址值,表達式的計算結果必須是正整數。例
用ORG指定代碼段地址
CODE SEGMENT ORG 100H ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATASTART: ;指定代碼段起始地址偏移100H MOV AX,DATA ………CODE ENDS1/14/202485§4-3偽指令語句
——程序開始和結束語句
4.END【格式】END標號名【功能】標記匯編源程序結束。END——是偽指令助記符,不可缺省,放在源程序的最后一行,匯編程序到END語句停止匯編。每個模塊只有一個END。標號名——是該程序中第一條可執行語句的標號名,可以缺省,若一個程序包含多個模塊,END后面帶的標號為主程序模塊中的標號名稱。例
CODE SEGMENT START:
……… SUB1 PROC NEAR ……… SUB1 ENDP CODE ENDS END START1/14/202486§4-3偽指令語句
——其它
六、群定義語句
七、結構定義語句
這兩部分內容自學1/14/202487§4-3偽指令語句
——外部指令及對準偽指令
1.外部偽指令八、外部偽指令及對準偽指令
程序中包含多個模塊時,有些程序或數據在各個模塊間要相互共享,可用外部偽指令PUBLIC和EXTRN來實現此功能。其中PUBLIC用來定義共享模塊,EXTRN用來調用共享模塊。【格式】
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力系統運行與自動化控制知識試題
- 2025年物業管理考試題及答案清單
- 2025年護理執業副本綜合考試試題及答案
- 廣東進廠面試題及答案
- java行業面試題及答案
- 和諧勞動面試題及答案
- 軟件設計師考試方法論及試題答案
- 社會服務政策的實施效果試題及答案
- 網絡工程師職場適應能力的提升試題及答案
- 西方國家權力平衡考量試題及答案
- 工業自動化中的人機協同生產與智能制造
- 鱗片防腐操作技術方案
- 消化性潰瘍基層診療指南(2023年)重點內容
- 新員工GMP基礎知識培訓課件
- 員工用餐登記表
- 設備安裝調試記錄表
- 歐松板墻面施工方案
- 聚是一團火散是滿天星增強班級凝聚力主題班會 課件(共27張PPT)
- 小學升初中階段的語文教學銜接
- 勝任力模型-財務
- 陶行知教育名篇讀書分享ppt
評論
0/150
提交評論