



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第六章 匯編語言及其程序設計主要內容n匯編程序及其開發過程n指令格式及尋址方式n8086匯編語言的基本語法n順序、分支、循環結構程序設計n子程序設計匯編語言程序及開發過程n基本概念n匯編語言:是一種面向機器的程序設計語言,它是機器語言的符號化描述。n特點:代碼短、空間省、效率高n匯編語言源程序:用匯編語言編寫的程序n目標程序:匯編語言經翻譯程序翻譯成的代碼程序(即機器語言的程序)。n匯編程序:把源程序轉變為相應目標程序的翻譯程序n宏匯編:不僅包含一般匯編語言的功能,而且采用了高級語言使用的數據結構,是一種接近高級語言的匯編語言。n匯編語言程序的開發過程n編寫源程序:EDIT(DOS),Text
2、Pad(Windows)n將源程序保存為 XXXX.asm 文件n使用MASM生成目標程序 XXXX.OBJn使用LINK生成可執行程序 XXXX.EXE源程序XXXX.asm目標程序XXXX.obj可執行程序XXXX.exe設計編輯用MASM匯編用LINK連接執行使用匯編語言的過程n基本匯編語言程序實例(1) DATA SEGMENT(2) String DB 程序設計,”$”(3) DATA ENDS(4) CODE SEGMENT(5) ASSUME CS:CODE,DS:DATA,SS:STACK(6) START: MOV AX,DATA(7) MOV DS,AX(8) MOV DX
3、,OFFSET String(9) MOV AH,9(10) INT 21H(11) MOV AX,4C00H (12) INT 21H(13) CODE ENDS(14) STACK SEGMENT STACK(15) DB 256 DUP(?)(16) STACK ENDS(17) END STARTAH = 9功能:顯示字符串DS:DX = 串地址字符串以“$”結尾AH = 4C功能:帶返回碼終止AL = 返回碼n匯編語言程序 的開發過程開 始結 束用編輯工具編輯源程序源程序 XXXX.asm用MASM進行匯編有語法錯誤?YN目標文件 XXXX.obj用LINK連接有錯誤?YN執行可執行
4、文件XXXX.exe正確?NY用DEBUG調試n結構化程序設計n程序設計的基本步驟n分析問題n確定處理方案n確定具體操作步驟,繪制流程圖n編寫程序n調試并運行程序,得到預期結果n整理輸出結果,寫出有關文檔資料n流程圖的畫法起止框執行框流程線條件滿足?條件滿足?YYNN判斷框AA連接點指令格式及尋址方式n指令格式操 作 碼操 作 數OP CODEDW0127形式1OP CODEDW0127形式2OP CODEDW0127形式3DATA/DISPDATA/DISP12個字節12個字節MODREGR / MDATA/DISPDATA/DISP12個字節12個字節方向位,0:REG字段指出的寄存器為源
5、操作數寄存器 1:REG字段指出的寄存器為目的操作數寄存器字位,0:參加運算的操作數為字節操作數 1:參加運算的操作數為字操作數MOD含 義MOD含 義00存儲器方式,無位移量01存儲器方式,有8位位移量10存儲器方式,有16位位移量11寄存器方式,無位移量MOD字段編碼表REGW=1W=0REGW=1W=0000AXAL100SPAH001CXCL101BPCH010DXDL110SIDH011BXBL111DIBHREG字段編碼表存儲器方式寄存器方式有效地址的計算公式W=0W=100011011000(BX)+(SI)(BX)+(SI)+D8(BX)+(SI)+D16ALAX001(BX)
6、+(DI) (BX)+(DI) +D8(BX)+(DI) +D16CLCX010(BP)+(SI)(BP)+(SI) +D8(BP)+(SI) +D16DLDX011(BP)+(DI)(BP)+(DI) +D8(BP)+(DI) +D16BLBX100(SI)(SI) +D8(SI) +D16AHSP101(DI)(DI) +D8(DI) +D16CHBP110D16(BP) +D8(BP) +D16DHSI111(BX)(BX) +D8(BX) +D16BHDIMODR/Mn8086/8088常用指令集n數據傳送指令(14條)傳送MOV堆棧操作PUSH , POP交換XCHG輸入、輸出IN
7、, OUT轉換XLAT地址傳送LEA , LDS , LES標志傳送PUSHF , POPF , LAHF , SAHFn算術運算指令(20條)加法ADD , ADC , AAA , DAA加“1”INC減法SUB , SBB , AAS , DAS減“1”DEC比較CMP求補NEG乘法MUL , IMUL , AAM除法DIV , IDIV, AAD符號擴展CBW , CWDn邏輯運算指令(13條)求反NOT邏輯乘AND邏輯加OR異或XOR測試位TEST左/右移位SHL , SHR , SAL , SAR左/右循環移位ROL , ROR , RCL , RCRn字符串指令(10條)傳送串MO
8、VS , MOVSB/MOVSW串比較CMPS , CMPSB/CMPSW串掃描SCAS , SCASB/SCASW取字符串LODS , LODSB/LODSW存字符串STOS , STOSB/STOSW重復前綴REP , REPZ , REPNZn控制轉移指令(28條)子程序調用CALL子程序返回RET無條件轉移JMP條件轉移JZ,JNZ,JC,JNC,JO,JNO,JS,JNS,JP,JNP,JA,JAE,JB,JBE,JG,JGE,JL,JLE循環LOOP條件循環LOOPNE , LOOPE寄存器CX=0轉移JCXZ中斷INT , INTO中斷返回IRETn處理機控制指令(12條)清除C
9、F標志CLC進位有效位CF求反CMC置CF標志STC置DF標志STD清除DF標志CLD置IF標志STI清除IF標志CLI處理機暫停HLT等待狀態WAIT將數據傳送給協處理器(提供到數據/地址線上)ESC保證總線的控制LOCK無操作NOPn尋址方式(重點)n概述n目的n大多數情況下,指令不直接給出操作數本身,而是給出存放操作數的寄存器或者是內存單元的地址。n大多數情況下,操作數地址也不是直接給出,而是給出計算操作數地址的方法,稱之為尋址方式n尋址方式的種類n與數據有關的尋址方式(7種)n與轉移地址有關的尋址方式(4種)nMOV指令(簡介)n指令格式 mov 目的,源n功能:該指令將源內容送至目的
10、地址內n例: mov ax, bx 將寄存器bx中的內容送到寄存器ax中n與數據有關的尋址方式n立即尋址方式n操作數直接存放在指令中,緊跟在操作碼之后,它作為指令的一部分存放在代碼段里,這種操作數稱為立即數。n立即數可以是8位的或者16位的。(386之后的機器也可以是32位的)n立即數方式用來表示常數,它經常用來給寄存器賦初值。只能用于源操作數字段,不能用于目的操作數字段,且源操作數長度應與目的操作數長度一致。n立即數尋址方式舉例 MOV AL, 5 - 指令執行后(AL)= 05H MOV AX, 3064H - 指令執行后(AX)= 3064H6430OP指令AXn寄存器尋址n操作數在寄存
11、器中,指令中指定寄存器號。n16位的操作數,寄存器可以是 AX,BX,CX,DX,SI,DI,SP,BP。n8位的操作數,寄存器可以是 AH,AL,BH,BL,CH,CL,DH,DL。例: MOV AX , BX 指令執行前: (AX)= 3064H (BX)= 1234H 指令執行后: (AX)= 1234H (BX)= 1234H這種方式中,不需要訪問存儲器來取得操作數,所以這種方式可以得到較高的運算速度立即數尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址不需要計算操作數的地址需要計算操作數的有效地址操作數的地址段地址偏移地址+我們把這個偏移地址稱為我們把這
12、個偏移地址稱為有效地址(有效地址(EA)有效地址(有效地址(EA)= 基址基址 + 變址變址 + 位移量位移量存放在指令中的一個8位、16位的數,但它不是立即數,而是一個地址。存放在變址寄存器(SI,DI)中的內容,它通常用來訪問數組中的某個元素或字符串中的某個字符存放在基址寄存器(BX,BP)中的內容,它是有效地址中的基址部分,通常用來指向數據段中數組或字符串的首地址段偏移CSIPSSSP或BPDSBX、DI、SI或一個16位數ESDI(用于串指令)8086/80888086/8088段寄存器和相應存放偏移地址的寄存器之間的默認組合段寄存器和相應存放偏移地址的寄存器之間的默認組合成分16位尋
13、址位移量0,8,16位基址寄存器BX,BP變址寄存器SI,DI1616位尋址是有效地址的三種成分的組成位尋址是有效地址的三種成分的組成n直接尋址方式n操作數的有效地制只包含位移量一種成分,其值就存放在代碼段中指令的操作碼之后。位移量的值就是操作數的有效地址。例: MOV AX , 2000H 假設(DS)= 3000H物理地址 = 3000H * 16 +2000H = 32000H30000H32000H6430OP代碼段5030數據段AX 假設(32000H)= 3050H 則指令執行后,AX = 3050Hn可以用符號來代替數值地址 MOV AX , VALUE MOV AX , VAL
14、UE 如果在附加段,則應指定段前綴 MOV AX , ES:VALUE MOV AX , ES:VALUE直接尋址方式只適用于處理單個變量。例如某個存放在存儲器中的變量,可以用直接尋址方式先把變量取出送到一個寄存器中,然后再做進一步的處理n寄存器間接尋址方式n操作數的有效地址只包含基址寄存器或變址寄存器的內容。因此有效地址就在某個寄存器中,而操作數在存儲器中。n16位尋址,可用的寄存器是BX,BP,SI,DI。 使用BX、SI、DI,其默認段是數據段DS 使用BP,其默認段是堆棧段SS例:MOV AX , BX如果(DS)= 2000H (BX)= 1000H物理地址 = 2000H * 16
15、 + 1000H = 21000H如果(21000H)= 50A0H指令執行后 AX = 50A0H20000H21000HA050數據段AX寄存器間接尋址方式可以用于表格處理,執行完一條指令后,只需修改寄存器內容就可以取出表格的下一項。n寄存器相對尋址方式n操作數的有效地址為基址寄存器或變址寄存器的內容和指令中指定的位移量之和。例:MOV AX , COUNTSI(也可以表示為 MOV AX , COUNT+SI)如果(DS)= 3000H (SI)= 2000H COUNT = 3000H物理地址 = 3000H * 16 + 2000H + 3000H = 35000H如果(35000H
16、)= 1234H指令執行后 AX = 1234H30000H35000H0030OP代碼段3412數據段AX33000HCOUNTSI寄存器相對尋址方式同樣可以用于表格的處理,表格的首地址可設置為偏移量的地址,利用修改基址或變址寄存器中的內容來取得表格中的值n基址變址尋址方式n操作數的有效地址是一個基址寄存器和一個變址寄存器的內容之和例:MOV AX , BXDI(也可以表示為 MOV AX , BX+DI)如果(DS)= 2100H (BX)= 0158H (DI)= 10A5H物理地址 = 2100H * 16 + 0158H + 10A5H = 221FDH如果(221FDH)= 123
17、4H指令執行后 AX = 1234H21000H221FDH3412數據段AX21158HBXDI基址變址尋址方式同樣可以用于數組或表格的處理,表格的首地址可存放在基址寄存器中,利用變址寄存器來訪問數組或表格中的元素n相對基址變址尋址方式n操作數的有效地址是一個基址寄存器與一個變址寄存器的內容和指令中指定的位移量之和。例:MOV AX , MASKBXSI(也可以表示 為MOV AX , MASK+BX+SI)如果(DS)= 3000H (BX)= 2000H (SI)= 1000H MASK = 0250H物理地址 = 3000H * 16 + 2000H + 1000H + 0250H =
18、 33250H如果(33250H)= 1234H指令執行后 AX = 1234H相對基址變址尋址方式常用于二維數組的尋址,如存儲器中存放著由多個記錄組成的文件,則位移量可以指向文件之首,基址寄存器指向某個記錄,變址寄存器則指向該記錄中的一個元素33250H30000H5002OP代碼段3412數據段AX32000HBXSI32250HMASKn與轉移地址有關的尋址方式n目的n確定轉移指令(條件轉移指令、無條件轉移指令)及轉子指令(CALL)的轉向地址n當轉移發生在段內的時候,給出即將轉移去執行的那條指令的偏移地址,并用該偏移地址取代IP寄存器中的內容n當轉去執行的指令與原來執行的指令不在同一段
19、時,則還需要用新的代碼段基址取代CS寄存器中原有的內容n種類n段內直接尋址n段內間接尋址n段間直接尋址n段間間接尋址n段內直接尋址n轉向的有效地址是當前IP寄存器的內容和指令中指定的8位或16位位移量之和n無條件轉移指令在位移量為8位的時候稱為短跳轉 JMP SHORT QUEST IP IP+8位位移量n無條件轉移指令在位移量為16位的時候稱為近跳轉 JMP NEAR PTR PROGIA IP IP+16位位移量n特點 指令中的位移量是轉向的有效地址與當前IP值之差,所以這一程序段在內存的不同區域運行時,轉移指令本身不會發生變化,符合程序再定位的要求位移量IP+EAn段內間接轉移n轉向的有
20、效地址是一個寄存器或是一個存儲單元的內容。 這個寄存器或者存儲單元中的內容可以用除立即數以外的任何一種尋址方式獲得 (IP)(EA)數據尋址方式根據數據尋址方式計算出有效地址的值轉向的有效地址這種尋址方式和以下的兩種尋址方式都不能用于條件轉移指令。即,條件轉移指令只能使用段內直接尋址,而無條件轉移指令JMP和CALL可以使用四種尋址方式中的任何一種。n假設: (DS)= 2000H,(BX)= 1256H, (SI)= 528FH , 位移量 = 20A1H (232F7)= 3280H,(264E5H)= 2450H JMP BX 執行該指令后,(IP)= 1256H JMP TABLEBX
21、 執行該指令后, (IP)= (DS)* 16 + (BX)+ 位移量) = (20000H + 1256H + 20A1H) = (232F7H)= 3280H JMP BXSI (IP)= (DS)* 16 + (BX)+ (SI) = (20000H + 1256H + 528H) = (264E5H)= 2450H寄存器相對尋址方式基址變址尋址方式n段間直接尋址n指令中直接提供了轉向的段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的內容,用指令中指定的段地址取代CS寄存器中的內容n完成的操作 JMP FAR PTR OPR (IP) OPR的段內偏移地址 (CS) OP
22、R所在的段地址n段間間接尋址n用存儲器中的兩個相繼字的內容來取代IP和CS寄存器中的原始內容,以達到段間轉移的目的。 存儲單元的地址是由指令指定除立即數方式和寄存器方式以外的任何一種數據尋址方式獲得n完成的操作 JMP DWORD PTR OPR (IP) (EA) (CS) (EA+2)n例 JMP DWORD PTRBX+8 (BX)= 3706H,(DS)= 1000H 物理地址 = (DS)* 16 + (BX)+ 8 = 10000H + 3706H + 8 = 1370EH B2H67H05H33H1370EHCSIP指令執行后,(IP)= 67B2H,(CS)= 3305H808
23、6宏匯編語言的基本語法n匯編語句n指令性語句n經匯編之后,有目標程序與之對應,是有實際操作的語句。n一般指令性語句 一條指令性語句對應一條8086/8088機器指令n宏語句 該語句由偽操作符定義,通過宏定義、宏調用、宏擴展的過程來實現宏語句。一個宏語句對應一組目標代碼程序macro name MACRO dummy parameter list 宏定義體 ENDMmacro name actual parameter listn指令性語句格式 標號:前綴指令助記符操作數,操作數;注釋n標號:代表“:”后面語句的存儲地址,供轉移指令(JMP)、轉子指令(CALL)、循環指令(LOOP)使用。 由
24、字母、數字組成串(第一個字符非數字)n前綴:是與串操作運算(MOVS、CMPS、SCAS、LODS、STOS)以及總線封鎖指令(LOCK)配合使用的部分。它們是REP、REPZ、REPE、REPNZ、REPNE等等。 LOOP1: REP MOVS DEST, SOURCEn操作數的數目可以為0,1或2,用“,”隔開n指示性語句n功能:對程序的起止信息、分段情況、變量說明、內存結構等進行說明。n格式: 名字偽操作指令參數,參數;注釋nPC宏匯編的偽指令n段定義偽指令:SEGMENT,ENDS,ASSUME,GROUP,ORGn符號定義偽指令:EQU,=,LABELn數據定義偽指令:DB,DW,
25、DD,DQ,DT,RECORD,STRUCn過程定義偽指令:PROC,ENDPn宏處理偽指令:MACRO,REPT,IRPCn條件匯編偽指令:IF,ENDIF,IFDIF,IFDEFn基本元素n匯編語言字符集n大寫字母:AZn小寫字母:azn數字:09n符號:+,-,*,/,(,),;,,,.,:,_,“,$,&,#,?,! 注:匯編語言源程序中,大小寫字母作用相同n常量與數值表達式n常量n在匯編時已經確定的值。在指令中作為直接操作數,或者給變量賦初值n類型n數值常量:以數值的形式直接寫在語句中n符號常量:預先為它定義一個名字,然后在語句中用名字來表示該常量(提高程序的可讀性) 用 E
26、QU 或 = 來定義 例:PORT EQU 83H ALPHT = 35*21數據形式格 式X取值范圍例子注釋二進制X X X X X X X X B0 , 101110101B八進制X X X X OX X X X Q0 70 7735O421Q十進制X X X XX X X X D0 90 937562358D缺省形式十六進制X X X X H0 F0FB23H最前面的一個字符必須是09ASCIIX X“X X”ASCII字符128個OK“Pass”十進制實數X X . X X E X X0 923.456E-7各種形式常量的格式返 回n標號n標號是為一組機器指令所起的名字,用于程序轉移指
27、令、調用指令和循環指令的操作數(轉向地址),一般在CS段內定義和使用。n標號的屬性:段地址、段內偏移地址和類型 標號所處的代碼段的段基址,稱為該標號的段地址 標號所處的位指向對于段首地址的相對地址,稱為該標號的段內偏移地址n形式一:標號n形式二:OFFSET 標號LC1: MOV AL, 20H JMP LC1MOV BX, OFFSET LB1MOV BX, OFFSET LB1 與 MOV BX, LB1 有什么不同? 標號有FAR(遠標號)和NEAR(近標號)種類型n近標號:該標號的定義在本段 在機器指令助記符之前,加一標號名字,后面緊跟一個冒號 “ :” LC1: MOV AL, 20
28、H JMP LC1n遠標號:該標號的定義不在本段 過程定義時,為過程起的名字也是標號,可作為轉子指令的操作數,這類標號的類型在定義子過程時確定 PROP PROC FAR PROP ENDPn注:標號在使用時 (1)循環指令、條件轉移指令只能引用NEAR型, 并且定義標號語句和使用標號語句的相對 距離只能在 128 +127 字節范圍內 (2)無條件轉移指令、調用(轉子)指令可引 用 NEAR 和 FAR 兩種類型的標號 (3)如果同一段內,無條件轉移指令語句到定 義該標號語句的距離在 128 +127 字節 范圍內,則可在使用的標號前指定為短標 號:記為 SHORT 標號n變量n變量的定義及
29、格式n變量是內存中一個數據區的名字,可以作為指令的存儲器操作數來引用n變量定義的格式: 變量名 變量類型定義符 表達式 , 變量名:由用戶定義(符合標識符定義的規范)變量類型:DB: 1個字節 DW: 2個字節,即1個字DD: 4個字節,即2個字DQ: 8個字節,即4個字DT: 10個字節,即5個字n表達式n算術運算符:+,-,*,/,n邏輯運算符:NOT, AND, OR, XORn關系運算符:nEQ - 相等nNE - 不相等nLT - 小于nGT - 大于nLE - 小于或等于nGE - 大于或等于n分析操作符nTYPE 格式: TYPE 變量或標號 說明:變量:則匯編程序將回送該變量類
30、型包含的 字節數 標號:則匯編程序將回送代表該標號類型的 數值。 NEAR(-1)、FAR(-2)例: ARRAY DW 1, 2, 3 ADD SI, TYPE ARRAY 匯編的結果為 ADD SI, 2nLENGTH 格式: LENGTH 變量 說明:回送分配給該變量的單元數,表達式中帶 DUP 時有效,非 DUP 時,回送1例: FEES DW 100DUP(0) MOV CX, LENGTH FEES則匯編結果為: MOV CX, 100例: ARRAY DW 1, 2 MOV CX, LENGTH ARRAY則匯編結果為: MOV CX, 1nSIZE 格式:SIZE 變量 說明:
31、回送分配給該變量的字節數,此值是 LENGTH 值和 TYPE 值的乘積例: ARRAY DW 1, 2, 3 MOV CX, SIZE ARRAY則匯編結果為: MOV CX, 2nOFFSET 格式:OFFSET 變量或標號 說明:回送該變量或標號的偏移地址值例: MOV BX, OFFSET OPR 則匯編程序將OPR的偏移地址回送給指令,在 執行時,將該偏移地址裝入BX寄存器中nSEG 格式:SEG 變量或標號 說明:回送該變量或標號的段地址例: MOV BX, SEG OPR則匯編程序將OPR所在的段基址送入BX寄存器n屬性操作符 I. PTR 格式:類型 PTR 表達式 類型:BY
32、TE, WORD, DWORD, FAR, NEAR 表達式:是存儲器操作數 說明:用來給已分配的存儲地址賦予另一種屬性,使 該地址具有另一種類型例: MOV BX, 5 非法指令MOV BYTE PTR BX, 5MOV WORD PTR BX, 5 II. 段超越前綴 說明:用來表示一個標號、變量或地址表達式的段屬 性 例:用段前綴來指定某段的地址操作數 MOV AX, ES:BX+SI III.SHORT 說明:表明JMP指令中轉移地址的屬性 128+127n指示性語句(說明性語句)n存儲分配語句n數值表達式如 3*20n? 保留存儲空間但不存入數據例: ABC DB 0, ?, ?,
33、0 DEF DW ?, 52 存儲空間分配如圖所示 nASCII字符串例: MESSAGE DB HELLO 存儲空間分配如圖所示00-00-3400ABCDEF48454C4C4FMESSAGEnnDUP(?) 重復因子n為正整數,表示數據項重復n次例: ARRAY1 DB 2 DUP (0, 1, 2, ?) ARRAY2 DB 100 DUP (?) 內存分配如圖所示nnDUP( 表達式 表達式, )例: ARRAY3 DB 100 DUP ( 0, 2 DUP (1, 2), 0, 3)000102-000102-ARRAY1ARRAY2-100個字節返 回n段定義n段定義語句段名 S
34、EGMENT 邊界類型連接類型類別段名 ENDS邊界類型:用來指明段的起始邊界連接類型:段的連接方式類別:表示段的類別,連接程序只使同類別的段發生關聯n段值設定偽指令語句ASSUMEn格式 ASSUME 段寄存器:段名,段寄存器:段名,SEGA SEGMENTSEGA ENDSSEGB SEGMENTSEGB ENDSCODE SEGMENT ASSUME DS:SEGA, ES:SEGB, CS:CODE, SS:NOTHING MOV AX, SEGA MOV DS, AX MOV AX, SEGB MOV ES, AX CODE ENDSnORG 置匯編單元計數器語句n功能:用來指出其后
35、的程序段或數據塊存放的起 始地址的偏移量n格式: ORG 表達式 匯編程序用語句中表達式之值作為起始地址連續存放程序n例: VECTORS SEGMENT ORG 10 VECT1 DW 47A5H ORG 20 VECT2 DW 0C596H VECTORS ENDSVECT1偏移地址為0AHVECT2偏移地址為14Hn地址計數器$n匯編程序對源程序進行匯編時,使用$保存當前正在匯編的指令的偏移地址。n開始匯編或在每一段開始時,地址計數器初始化為0,以后在匯編過程中,每處理一條指令,地址計數器增加一個值,此值為該指令所需要的字節數n例 JNE $+6 當上一條指令執行的結果不為零時,轉向地址
36、是JNE指令的首地址加上6 注:$+6必須為另一條指令的首地址,否則,匯編 程序將指示出錯信息n例:計算字符串的長度 STRING DB “THIS IS A BOOK”能否用分析操作符SIZE來計算?COUNT EQU $ - STRINGn例:計算數的個數 ARRAY DW 1, 2, 3, 4, 5, 6COUNT EQU ($ - ARRAY)/2010002000300040005000600$ARRAY0000H0001H0002H0003H0004H0005H0006H0007H0008H0009H000AH000BHn過程定義n過程也稱為 “子程序”nCALL指令調用過程,RE
37、T指令結束過程n過程具有“NEAR”屬性和“FAR”屬性,如果不指定屬性,匯編程序認為它是“NEAR”屬性n具有NEAR屬性的過程,只能由屬于該過程的段中的其它程序調用n具有FAR屬性的過程,可以由任意段調用n格式過程名 PROC NEAR 或 FAR RET過程名 ENDPSEGX SEGMENT SUBT PROC FAR RETSUBT ENDP CALL FAR PTR SUBT SEGX ENDSSEGY SENGMENT CALL FAR PTR SUBT SEGY ENDSnDOS下程序正常結束的方式nMOV AH, 4CH INT 21Hn主程序名 PROC FAR PUSH
38、DS MOV AX, 0 PUSH AX RET 主程序名 ENDP順序結構程序設計n數據傳送指令n一般傳送指令n格式:MOV 目的,源n功能:將源內容送至目的地址內n說明:該指令有7種格式nMOV MEM / REG1 , MEM / REG2 MOV AX, BX MOV AX, 2000H MOV 2000H, DSnMOV REG, DATAMOV AL, 5不可兩個內存位置直接傳送數據nMOV AC , MEMnMOV MEM, ACnMOV SEGREG, MEM / REGMOV DS, AXnMOV MEM/REG, SEGREGMOV AX, DSnMOV MEM/REG,
39、DATAMOV AX, 3168H段寄存器之間不能傳送數據MOV指令不能改變CS當前的內容立即數通用寄存器段寄存器內存MOV指令傳送方向圖n交換指令n格式:XCHG OPR1, OPR2n功能:將源操作數OPR2內容和目的操作數OPR1 內容互換 (OPR1)(OPR2)n說明n段寄存器不能作為操作數n無法將兩個內存內容互換n例:XCHG BX, BP+SI (BX)= 6F30H (BP)= 0200H (SI)= 0046H (SS)= 2F00H (2F246H)= 4154H OPR2的物理地址 = 2F00H*16d + 0200H +0046H = 2F246H指令執行后:(BX)
40、= 4154H(BP+SI)= 6F30Hn堆棧操作命令n格式nPUSH SRC 執行的操作(16位指令) (SP) (SP)- 2 (SP)+ 1,(SP) (SRC)nPOP DST 執行的操作(16位指令) (DST) (SP)+ 1,(SP) (SP) (SP)+ 2注意:8086/8088中,不允許立即數進棧 標志寄存器的內容入棧和出棧:PUSHF和POPFn例: PUSH AX 將寄存器AX的內容壓入堆棧 PUSH DS 將寄存器DS的內容壓入堆棧 PUSH WORD PTR BX 將內存單元中的字壓入堆棧 POP CX 將堆棧棧頂16位的字送入寄存器CX中 PUSHF MOV B
41、P, SP AND BP, 0FEFFH POPF 修改標志寄存器中TF的值n地址傳送指令n取偏移地址指令n格式: LEA REG, SRCn執行的操作 (REG) SRCn功能:將內存變量的偏移地址送入16位的通用寄存器中n例 LEA BX, BX+SI+0F62H (BX)= 0400H (SI)= 003CH 執行后 BX = 0400H + 003CH+ 0F62H = 139EHn說明:LEA指令與分析操作符OFFSET功能類似,LEA的 功能更強,指令中的操作數可帶下標n取32位地址指令 LDS, LESn格式: LDS REG, SRC LES REG, SRCn執行的操作 (R
42、EG)(SRC) (SREG)(SRC+2)n功能:內存的一個雙字存儲地址,內容的高十六位為 段地址,低十六位是偏移量地址。將偏移量地 址送入指定的寄存器中,段地址送入DS或ES中n例 ADDR DD 11223344H LDS SI, ADDR 執行后, (DS)= 1122H (SI)= 3344HDATA SEGMENTADDR DD 56781234HBUF DW 5DUP(20)AD-BUF DD BUFSTRING DB abcdAD-STRING DD STRINGOFF-STRING DW STRINGDATA ENDSCODE SEGMENTASSUME CS:CODE, D
43、S:DATASTART: MOV AX, DATAMOV DS, AXLES DI, ADDRLEA BX, ADDRMOV AX, SEG ADDREND STARTMOV CX, BUFLDS SI, AD-BUFMOV AL, STRINGMOV AX, OFF-STRINGLES BX, AD-STRINGMOV AX, 4C00HINT 21HCODE ENS34H12H78H56H14H00H14H00H14H00H14H00H14H00H04H00H8FH1FH61H62H63H64H12H00H8FH1FH12H00H1F8FH:0000HADDRBUFAD-BUFSTRING
44、AD-STRINGOFF-STRING0004H000EH0012H0016H001AH數據段存放段地址和偏移地址存放偏移地址ES:DI = 5678H:1234HBX = 0000HAX = 1F8FHCX = 0014HDS:SI = 1F8FH:0004HAX = 0012HAL =61HES:BX = 1F8FH:0012Hn算術運算指令n二進制加法運算指令ADD, ADC, INCnADD指令n格式: ADD DST, SRCn執行的操作 (DST)(SRC)+(DST)n影響標志位:CF, OF, ZF, SF(只考慮主要的標志位)n例 ADD DX, 0F0F0H 指令執行前 (
45、DX)= 4652H 1111 0000 1111 0000 + 0100 0110 0101 0010 1 0011 0111 0100 0010 指令執行后: (DX)= 3742H ZF = 0, SF = 0, CF = 1, OF = 0n帶進位的加法指令ADCn格式: ADC DST, SRCn執行的操作:(DST)(SRC)+(DST)+CFn例:設目的操作數存放在DX和AX,其中DX存放高位 字。源操作數存放在BX,CX中,其中BX存放高位 字。指令執行前: (DX)= 0002H,(AX)= 0F365H,(BX)= 0005H,(CX)= 0E024H 指令序列為:ADD
46、AX, CX (1) ADC DX, BX (2) 指令1執行后: (AX)= 0D389H, SF =1, ZF = 0, CF = 1, OF = 0 指令2執行后: (DX)= 0008H, SF = 0, ZF = 0, CF = 0, OF = 00002H0F365HDXAX0005H0E024HBXCXnINC指令n格式: INC OPRn執行的操作: (OPR)(OPR)+ 1n例:X = 124, Y = 5, 將X+Y的結果存于RESULT 單元中。DATA SEGMENT X DB 124 Y DB 5 RESULT DB ?DATA ENDSCODE SEGMENT A
47、SSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, X ADD AL, Y MOV RESULT, AL MOV AH, 4CH INT 21HCODE ENDS END STARTn二進制減法指令SUB, SBB, DEC, NEG, CMPnSUB 減法指令n格式: SUB DST, SRCn執行的操作: (DST)(DST)-(SRC)nSBB 帶借位減法指令n格式: SBB DST, SRCn執行的操作: (DST)(DST)-(SRC)- CFnDEC 減1指令n格式: DEC OPRn執行的操作: (OPR)(O
48、PR)-1nNEG 求補指令n格式: NEG OPRn執行的操作: (OPR) -(OPR)n說明:把操作數按位求反后末位加1,因而執行的操作也可以表示為: (OPR) 0FFFFH -(OPR)+1nCMP 比較指令n格式: CMP OPR1, OPR2n執行的操作: (OPR1)-(OPR2)n說明:該指令執行的操作與SUB指令執行的操作一樣, 但不保存結果。 根據該指令執行的結果設置標志位n例:設X, Y, Z均位雙精度數,他們分別存放在地 址為X, X+2, Y, Y+2, Z, Z+2的存儲單元中 中,存放時高位字在高地址中,低位字在低 地址中,在8086中如何實現WX+Y+24-Z
49、DATA SEGMENT X DD 11223344H Y DD 55667788H Z DD 22336699H W DD ?DATA ENDS443322118877665599663322-XX+2YY+2ZZ+2WW+2CODE SEGMENT ASSUME CS: CODE, DS:DATACODE ENDS END STARTSTART: MOV AX, DATA MOV DS, AX MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ADD AX, 24 ADC DX, 0 SUB AX, Z SBB DX, Z+2 MOV W, AX MO
50、V W+2, DX MOV AX, 4C00H INT 21H n二進制乘法指令:MUL,IMULnMUL 無符號數乘法n格式: MUL SRCn執行的操作:字節操作數: (AX)(AL)*(SRC)字操作數 :(DX, AX)(AX)*(SRC)nIMUL 帶符號數乘法n格式: IMUL SRCn執行的操作與MUL相同注:乘法指令只對CF和OF有定義 對于MUL指令:如果乘積的高一半為0,則CF和OF均為0,否則為1。這樣 的條件媽設置可以用來檢查字節乘積的結果是字節還是字 對于IMUL指令:如果乘積的高一半是低一半的符號擴展,則CF和OF均為 0,否則為1n例:如(AL)= 0B4H,(B
51、L)=11H,求指令 IMUL BL 和 MUL BL 的結果 解:(AL)= 0B4H 無符號數為180D,帶符號數為-76D (BL)= 11H 無符號數為17D,帶符號數為17D 執行 IMUL BL 的結果為 (AX)= 0FAF4H = -1292D, CF=OF=1 執行 MUL BL 的結果為 (AX)= 0BF4H = 3060D, CF=OF=1n二進制除法指令:DIV,IDIVn無符號數除法 DIVn格式: DIV SRCn執行的操作:n字節操作:16位的被除數在AX中,8位的除數為源操作數,結果的8位商在AL中,8位余數在AH中 (AL)(AX)/(SRC)的商 (AH)
52、(AX)/(SRC)的余數n字操作:32位的被除數在DX,AX中,DX為高位字;16位的除數為源操作數,結果的16位商在AX中,16位的余數在DX中 (AX)(DX, AX)/(SRC)的商 (DX)(DX, AX)/(SRC)的余數n帶符號數除法 IDIVn格式: IDIV SRCn執行的操作:與DIV執行的操作相同。但操作數必須是帶符號數,商和余數也都是帶符號數n例:如(AX)= 0400H,(BL)=0B4H,求指 令 IDIV BL 和 DIV BL 的結果 解:(AX)= 0400H 無符號數為1024D,帶符號數為+1024D (BL)= 0B4H 無符號數為180D,帶符號數為-
53、76D 執行 DIV BL 的結果為 (AH)= 7CH = 124D 余數 (AL)= 05H = 5D 商 執行 IDIV BL 的結果為 (AH)= 24H = 36D 余數 (AL)= 0F3H = -13D 商n符號位擴充:CBW, CWDnCBW 字節轉換為字n格式: CBWn執行的操作:AL的內容符號為擴展到AH,形成AX中的字。即如果(AL)的最高有效位為0,則(AH)=0;如果(AL)的最高有效位為1,則(AH)=0FFHnCWD 字轉換為雙字n格式: CWDn執行的操作:AX的內容符號擴展到DX,形成DX:AX中的雙字。即如果(AX)的最高有效位為0,則(DX)=0;如果(
54、AX)的最高有效位為1,則(DX)=0FFFFH例:算術綜合運算舉例,計算(V -(X * Y + W - 540)/ X 其中,X, Y, W, V均為16位帶符號數,已分別裝入X, Y, W, V單元 中,要求上式計算的結果的商存入AX寄存器,余數存入DX寄存器DATA SEGMENT X DW 1234H Y DW 2345H W DW 3456H V DW 4567HDATA ENDS MOV AX, X IMUL Y MOV CX, AX MOV BX, DX MOV AX, W CWD ADD CX, AX ADC BX, DX SUB CX, 540 SBB BX, 0 MOV
55、AX, V CWD SUB AX, CX SBB DX, BX IDIV XCODE SEGMENT ASSUME DS:DATA, CS:CODESTART: MOV AX, DATA MOV DS, AX MOV AH, 4CH INT 21HCODE ENDS END STARTn8086/8088位處理運算指令n邏輯運算指令nNOT 指令n格式: NOT OPRn執行的操作:(OPR)(OPR)nAND 指令n格式: AND DST, SRCn執行的操作:(DST)(DST)(SRC)nOR 指令n格式: OR DST, SRCn執行的操作:(DST)(DST)(SRC)nXOR 指令
56、n格式: XOR DST, SRCn執行的操作:(DST)(DST) (SRC)nTEST 指令n格式: TEST DST, SRCn執行的操作:(DST)(SRC)n注:該指令執行完畢,設置相應的標志位,不保存結 果n例1 要求將AL的第5位置1 MOV AL, 43H OR AL, 20H 0100 0011 0010 0000 OR 0110 0011n例2 要測試AL寄存器中第2位是否為1,若為1則 轉移到EXIT去執行 TEST AL, 00000100B JNE EXITn移位指令n算術移位指令n格式: SAL DST, 計數值 SAR DST, 計數值n算術移位指令適用于帶符號數
57、的運算,用SAL來乘以2,用SAR來除以2n計數值可以為1,多于1時,為CL中的內容nCF的內容被改變,SF, PF, ZF也根據目的操作數的新值而改變。當符號位改變時,OF置1CF0SAL移位示意圖CFSAR移位示意圖n例 MOV CL, 5 SAR DI, CL 如果指令執行前: (DS)= 0F800H (DI)= 180AH (0F980A)=0064H 則實際的物理地址為 = 0F800H * 16d + 180AH = 0F980A 指令執行后, (0F980A)= 0003H CF = 0, PF = 1, ZF = 0, SF = 0, OF = 0n邏輯移位指令n格式:SHL
58、 DST, 計數值 SHR DST, 計數值n邏輯移位指令用于實現無符號數的運算。SHL用來乘以2,SHR用來除以2CF0SHL移位示意圖CF0SHR移位示意圖n例: MOV CL, 2 SHL SI, CL 執行前:(SI)= 1450H 5200D 執行后:(SI)= 5140H 20800Dn循環移位指令n格式:ROL DST, 計數值 ROR DST, 計數值 RCL DST, 計數值 RCR DST, 計數值CFROL移位示意圖CFROR移位示意圖CFRCL移位示意圖CFRCR移位示意圖n例:(AX)=0012H,(BX)= 0034H,要求把他們 裝配在一起,形成(AX)= 123
59、4H MOV CL, 8 ROL AX, CL ADD AX, BX分支結構程序設計nCMP 比較指令n格式: CMP OPR1, OPR2n執行的操作: (OPR1)-(OPR2)n說明:該指令執行的操作與SUB指令執行的操作一樣, 但不保存結果。 根據該指令執行的結果設置標志位n轉移指令n無條件轉移指令n格式: JMP 目的地址(標號)n功能:無條件跳轉到目的地址處執行指令n轉移的情形n段內短轉移 0000H B4H 01H NEXT: MOV AH, 01 0018H EBH E6H JMP NEXT 001AH B4H 4CH EXIT: MOV AH, 4CHn段內近轉移 0018H
60、 E9H 0FH 01H JMP NEXT 001BH 8AH D0H MOV DL, AL 012AH B4H 4CH NEXT: MOV AH, 4CHn段間轉移 C1 SEGMENT 0018H FFH 0010H 34C0H JMP NEXTPROG C1 ENDS C2 SEGMENT . 0010H B4H 4CH NEXTPROG: MOV AH, 4CH C2 ENDSn條件轉移指令n格式: JX 目的地址(短標號)n功能:滿足條件則轉移到指定地址處執行n說明:nX 為13個字母n目的地址與JX指令所在的地址相對距離不超過-127 +128個字節范圍n發生跳轉時,CPU需要較長的時鐘周
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java程序員oracle面試題及答案
- 關系模式java面試題及答案
- 2025年高壓電能表項目提案報告
- 久科信息java面試題及答案
- 影視戀愛測試題及答案
- 電梯禮儀考試題及答案
- 券商期權考試題及答案
- 保育員培訓內容
- 工業互聯網平臺軟件定義網絡SDN在智能工廠生產數據采集與分析中的應用優化報告
- 康復醫療器械市場未來趨勢報告:2025年需求與產品創新展望
- 中國狼瘡腎炎診治和管理指南(2025版)解讀
- 安徽省合肥四十五中學2025屆數學七下期末達標檢測試題含解析
- 變電站二次系統介紹(大唐)
- 數智賦能教育新生態:高校教育數字化創新發展路徑
- 2024年山西焦煤集團招聘考試真題
- 對公賬戶提額合同協議
- 鍍鋁技能考試試題及答案
- 塑鋼門窗生產制作工藝定稿
- 車間工藝報警管理制度
- 中建二測2025題庫
- 制造業生產線質量管理措施
評論
0/150
提交評論