微機(jī)原理第三章(指令及匯編程序)_第1頁
微機(jī)原理第三章(指令及匯編程序)_第2頁
微機(jī)原理第三章(指令及匯編程序)_第3頁
微機(jī)原理第三章(指令及匯編程序)_第4頁
微機(jī)原理第三章(指令及匯編程序)_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、指令的基本形式尋址方式指令的執(zhí)行時間80X86指令集匯編語言的基本結(jié)構(gòu)匯編語言的常量與變量匯編語言運(yùn)算符與表達(dá)式匯編語言偽指令簡單匯編程序指令的基本形式80X86的尋址方式80X86的主要指令匯編語言的基本結(jié)構(gòu)匯編語言符號常量與變量定義偽指令OFFSET、PTR、SHORT運(yùn)算符段定義、過程定義、ASSUME偽指令$簡單匯編程序編寫指令及指令集計算機(jī)能夠識別和執(zhí)行的基本操作命令指令的作用(3W)告訴CPU干什么?What? 告訴CPU從哪兒取數(shù)據(jù)?Where?告訴CPU下一條指令在哪兒?Where?指令的格式操作碼操作數(shù)或操作數(shù)地址指令總長度或轉(zhuǎn)移目標(biāo)地址10111011 00110100 0

2、0010010操作碼操作數(shù)數(shù)值計算信息處理多媒體指令數(shù)量取決于CPU的功能80X86CPU指令數(shù)量8086:133條整數(shù)運(yùn)算輸入輸出程序控制擴(kuò)充:多媒體指令 浮點運(yùn)算指令Cache處理指令指令系統(tǒng)(CISC復(fù)雜與 RISC精簡)指令數(shù)量影響:程序的執(zhí)行速度CPU的復(fù)雜程度10111011 00110100 00010010MOV BX,1234H指令的通用格式Why?80X86指令在內(nèi)存的存放形式80X86的指令操作碼和操作數(shù)由一或多個字節(jié)(8位)組成二進(jìn)制與助記符(把十六進(jìn)制數(shù)1234送CPU的BX寄存器)v雙操作數(shù):操作碼 目的操作數(shù),源操作數(shù)操作碼操作數(shù)或操作數(shù)地址低字節(jié)在前(34H)高

3、字節(jié)在后(12H)指令長度1到6字節(jié)000100101011101100110100100001000110002譯碼器從內(nèi)存數(shù)據(jù)段1234H取一個十六位數(shù)據(jù)執(zhí)行指令MOV AX,1234H1000010001100022123421235200000001001010100001001101001001001101111100代碼段數(shù)據(jù)段10100001 00110100 00010010 取指令指令隊列BIU負(fù)責(zé)負(fù)責(zé)EU負(fù)責(zé)負(fù)責(zé)并行處理AX7C 93地址加法器DS(2000)機(jī)器語言:用二進(jìn)制編寫匯編語言:行號:操作碼 目的操作數(shù),源操作數(shù) ;注釋高級語言:一條語言對應(yīng)多個機(jī)器語言靜態(tài)連接

4、(.obj+.lib)動態(tài)連接(.obj+.dll)編輯:編寫源程序(用ASCII碼編寫的文本文件)轉(zhuǎn)換成COM格式(.com)編譯:生成目標(biāo)文件(機(jī)器語言.obj)連接:生成EXE文件(.exe).c ;.cpp ;.bas ;.for; .pas; .asm各段在同一64KB內(nèi)Condition?靜態(tài)連接靜態(tài)連接動態(tài)連接動態(tài)連接EXE文件包含連接函數(shù)代碼不含連接函數(shù)代碼內(nèi)存使用重復(fù)使用,浪費(fèi)只有一份,節(jié)約能否獨立運(yùn)行能需要DLL支持應(yīng)用環(huán)境DOSWindowsLink.exeMASM.exe集成開發(fā)環(huán)境IDE(編輯編譯連接調(diào)試)確定本條指令的操作數(shù)據(jù)在指令中在存儲器中在寄存器中確定下一條指

5、令的地址根據(jù)指令長度計算根據(jù)轉(zhuǎn)移指令的目標(biāo)地址對源操作數(shù)和目的操作數(shù)都需要尋址PA:存儲器內(nèi)的絕對地址(20位)EA:某個段內(nèi)的相對地址(16位)執(zhí)行前40H10HAHAL操作數(shù)在指令中,不需從其它地方取操作數(shù)若超過一字節(jié),則低字節(jié)在低地址只能用于源操作數(shù),不能用于目的操作數(shù)MOV 1234H , AX X例:MOV AX , 3100H操作碼操作碼代碼段高地址低地址00H31H執(zhí)行后31H00H10H 40HDS操作數(shù)在CPU內(nèi)部的某個寄存器中,不必通過總線從存儲器取數(shù)據(jù)可以是CPU內(nèi)部任意寄存器(8/16/32位)可以用于源操作數(shù)或目的操作數(shù)CS可用于源操作數(shù),不能用于目的操作數(shù)MOV C

6、S , AX X20H 50HAX源操作數(shù)目的操作數(shù)MOV DS , AX20H 50H操作數(shù)在存儲器存儲器中,其地址偏移量包含在指令中,用括起來 MOV AX,1000H操作數(shù)默認(rèn)在數(shù)據(jù)段內(nèi),可以用段超越改變源和目的操作數(shù)不能同時采用直接尋址MOV AX , ES:1234HMOV 1234H , 5678H X物理地址PA=16 (段地址)偏移量(EA)段前綴DS:6000MOV AX,3100HDS 6 0 0 0 031 0 06 31 0 0物理地址AX42 C3偏移量 3100H60000H63100HC342數(shù)據(jù)段先確定數(shù)據(jù)段地址操作數(shù)在存儲器存儲器中,其地址偏移量保存在BX、B

7、P、SI、DI寄存器中,寄存器名稱用括起來 MOV AX,SIBX/SI/DI默認(rèn)在數(shù)據(jù)段內(nèi),可用段超越改變BP默認(rèn)在堆棧段內(nèi),用于從堆棧段取數(shù)據(jù)源和目的操作數(shù)不能同時采用直接尋址物理地址PA=16 (段地址)BX等寄存器的值(EA)MOV BX , SI XDS 6 0 0 0 0DI 2 0 0 06 2 0 0 0物理地址BX42 C3偏移量在寄存器DI中數(shù)據(jù)段60000H62000HC342偏移量MOV BX , DIDS:6000 DI:2000操作數(shù)在存儲器存儲器中,用變址寄存器SI和DI加偏移值保存地址, SI+1000默認(rèn)在數(shù)據(jù)段內(nèi),可用段超越改變偏移地址可以是8位或16位,用

8、補(bǔ)碼表示源和目的操作數(shù)不能同時采用變址尋址物理地址PA=16 (段地址)(SI,DI)+偏移值MOV DI+1000 , SI+1000 X處理數(shù)組和表格比較方便34 12DS 6 0 0 0 0SI物理地址AX位移量1 0 0 0MOV AX , SI+1000SI:2200 78 56SI:22022 2 0 02 2 0 26 3 2 0 06 3 2 0 278數(shù)據(jù)段60000H63200H1234偏移量5663202H操作數(shù)在存儲器存儲器中,用寄存器BX或BP加偏移值保存地址, BX+1000BX默認(rèn)在數(shù)據(jù)段內(nèi),可用段超越改變BP默認(rèn)在堆棧段內(nèi),用于從堆棧段取數(shù)據(jù)源和目的操作數(shù)不能同

9、時采用基址尋址物理地址PA=16 (段地址)(BX,BP)+偏移值MOV BX+1000 , BX+2000 X處理數(shù)組和表格比較方便與變地尋址一起也稱為寄存器相對尋址34 12SS 2 0 0 0 0BP物理地址AX位移量0 1 0 0MOV AX , BP+100BP:1000 78 56BP:10021 0 0 01 0 0 22 1 1 0 02 1 1 0 278堆棧段20000H21100H1234偏移量5621102H操作數(shù)在存儲器存儲器中,用寄存器BX或BP保存基準(zhǔn)地址,用寄存器DI或SI表示偏移量,BX+DIBX默認(rèn)在數(shù)據(jù)段內(nèi),可用段超越改變BP默認(rèn)在堆棧段內(nèi),用于從堆棧段取

10、數(shù)據(jù)源和目的操作數(shù)不能同時采用基址變址尋址物理地址PA=16 (段地址)(BX,BP)+(DI,SI)MOV BX+SI , BP+DI X處理二維數(shù)組和表格比較方便SI:0基址寄存器MOV AX, BX+SI變址寄存器+BX:1000BX:1008SI:2SI:4SI:0SI:2(1,0)(1,0)(0,2)(0,1)(0,0)21000數(shù)據(jù)段20000訪問4X4數(shù)組元素操作數(shù)在存儲器存儲器中,在基址變址基礎(chǔ)上再加上偏移量組成邏輯地址,BX+DI+1000HBX默認(rèn)在數(shù)據(jù)段內(nèi),可用段前綴改變BP默認(rèn)在堆棧段內(nèi),用于從堆棧段取數(shù)據(jù)兩個操作數(shù)不能同時采用相對基址變址尋址物理地址PA=16 (段地

11、址)(BX,BP)+(DI,SI)+偏移量MOV BX+SI+20H , BP+DI+5H X處理二維數(shù)組和表格比較方便MOV AX, BX+SI+1000H(位移量)(1,1)(1,0)(0,2)(0,1)(0,0)21000數(shù)據(jù)段20000+基址寄存器變址寄存器20010數(shù)據(jù)段2000020030保存一個表格=10=30一維數(shù)組aTable10SI+30SI+TableTableSIa保存一個16位數(shù)1234MOV AX,aMOV AX,10HMOV a, AXMOV 10H,AX操作數(shù)隱含:MUL BLMOV AX,1234H直接尋址寄存器尋址直接尋址: MOV AX,1234H寄存器間

12、接尋址: MOV AX,BX基址或變址尋址: MOV AX,BX+1234H基址變址尋址:MOV AX,BX+SI相對基址變址尋址:MOV AX,BX+SI+1234H操作數(shù)在指令中:立即尋址 MOV AX,1234H操作數(shù)在寄存器中:寄存器尋址 MOV AX,BX操作數(shù)在存儲器中: 對源操作數(shù)和目的操作數(shù)都需要尋址1234H BXBX SI取指令時間指令基本執(zhí)行時間與執(zhí)行指令并行處理,不計入總的執(zhí)行時間內(nèi)指令執(zhí)行時間指令尋址方式尋址方式MOV AX,1234H8基本執(zhí)行時間6計算EA時間讀取數(shù)據(jù)時間n+14+n總線時鐘存儲器速度總線讀寫數(shù)據(jù)時間計算EA時間*數(shù)據(jù)傳送類指令CPU、內(nèi)存、外設(shè)間

13、傳遞數(shù)據(jù)整數(shù)的加、減、乘、除整數(shù)的與、或、異或、非操作一批數(shù)的傳送、比較等(數(shù)組)控制程序的執(zhí)行順序控制CPU的工作方式、狀態(tài)等處理器類指令*算術(shù)類指令 *邏輯運(yùn)算類指令串操作類指令 *控制轉(zhuǎn)移類指令MOV指令: CPU與內(nèi)存之間傳遞數(shù)據(jù)PUSH、POP指令:堆棧操作XCHG指令:數(shù)據(jù)交換XLAT指令:從存儲器取數(shù)據(jù)LEA、LDS、LES指令:獲取地址IN、OUT指令:CPU與外設(shè)交換數(shù)據(jù)LAHF、SAHF/PUSHF、POPF指令標(biāo)志寄存器傳送2 0 0 0 CPU內(nèi)部或與內(nèi)存之間傳遞數(shù)據(jù)內(nèi)存指 數(shù)據(jù)段、堆棧段或附加段DS 2 0 0 0 01 0 0 02 1 0 0 0物理地址AX42

14、C321000H20000HC342數(shù)據(jù)段MOV AX,1000HMOV mem/reg1,mem/reg2data:立即操作數(shù)reg:寄存器sreg:段寄存器mem:存儲器acc:累加器MOV reg,dataMOV mem,dataMOV acc,memMOV mem,accMOV sreg,mem/regMOV mem/reg,sregMOV BX,1234HMOV BX,1234HMOV AX,1234HMOV 1234H,AXMOV DS,1234H MOV DS,AXMOV AX,DS MOV 1234H,DSMOV BX,1234HMOV AX,1000 MOV DS,AX MO

15、V AX,2345H MOV AX,1234H MOV AX, 2345H MOV 1234H, AX 源操作數(shù)和目的操作數(shù)不能同時為內(nèi)存地址寄存器CS和IP不能作為目的操作數(shù)目的操作數(shù)與源操作數(shù)必須位數(shù)相同MOV 1234H,2345H X MOV CS,2345H X MOV AL,1234H X 立即數(shù)不能作為目的操作數(shù)MOV 1234H,2345H X 立即數(shù)不能直接送給段寄存器MOV DS,1000 X 源操作數(shù)和目的操作數(shù)不能同時為段寄存器MOV AX, DS MOV ES, AX MOV ES,DS X 格式2:MOV reg,data MOV BX,1234Hreg000001

16、010011100101110111w=1AXCXDXBXSPBPSIDIw=0ALCLDLBLAHCHDHBHw參數(shù)(0:8位寄存器操作;1:16位寄存器操作)1011w reg data低8位 data高8位1011101100110100 00010010操作碼操作數(shù)格式1 (2到4字節(jié))100010dw r/m reg mod 地址低8位 地址高8位格式2( 2到3字節(jié))1011w reg 數(shù)據(jù)低8位 數(shù)據(jù)高8位格式3 (2到3字節(jié))1010000w 地址低8位 地址高8位格式4(2到3字節(jié))1010001w 地址低8位 地址高8位格式5 (2到4字節(jié))10001110 mod 0 s

17、reg r/m 地址低8位 地址高8位格式6(2到4字節(jié))10001100 mod 0 sreg r/m 地址低8位 地址高8位格式7(2到6字節(jié))1100011w mod 000 r/m 地址低8位 地址高8位 數(shù)據(jù)低8位 數(shù)據(jù)高8位w參數(shù)(0:8位寄存器操作;1:16位寄存器操作)d參數(shù)(1:寄存器用于目的操作數(shù);0:寄存器用于源操作數(shù))sreg參數(shù)(00:ES; 01:CS; 10:SS; 11:DS)mod與r/m參數(shù)(由尋址方式確定) mod r/m00011011W=0W=1000(BX)+(SI)(BX)+(SI)+D8(BX)+(SI)+D16ALAX001(BX)+(DI)(

18、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)+D16BHDI從右向左順序(C)從左向右順序(Pascal)(PUSH入棧和POP出棧,改變SP的值)采用先進(jìn)后出的原則保存臨時數(shù)據(jù)(中斷的保護(hù)現(xiàn)場)函數(shù)調(diào)用時傳遞參數(shù)v參數(shù)傳遞順序v傳值與

19、傳地址操作2個字節(jié)入棧 SP-2出棧 SP+2可以操作寄存器、段寄存器和存儲器存儲器200002000ESP0ESP1020010堆棧段SS2000PUSH AXPUSH BX2000CSP0C785634123023H2001HSS堆棧段存儲器低地址高地址PUSH AXPUSH BXPUSH CXPUSH DX3000H25C3H5231H7201HAX 3000HBX 25C3HCX 5231HDX 7201HSPSPSPSPSP每格16位,相當(dāng)于內(nèi)存2個單元SS堆棧段存儲器3023H2001H低地址高地址25C3H5231H7201H3000HSPAXBXCXDX2234H3536H42

20、A6H5A31H3000H25C3H5231H7201HSPSPSPSPPOP DXPOP CXPOP BXPOP AXPOP DXPOP CXPOP BXPOP AX交換AX、BXPUSH AX 入棧和出棧順序可以不同不允許將數(shù)據(jù)彈出到CS和IP不允許將立即數(shù)入棧POP CS X PUSH 1234H X 不允許操作字節(jié)PUSH AL X PUSH AXPUSH BXPOP AXPOP BXPUSH AXPUSH BXPOP BXPOP AX哪個對?有何區(qū)別?恢復(fù)AX、BX可以使用存儲器尋址PUSH BX+SI+10H int Abc(int a,int *b) int c; c=a+*b;

21、 return c;main() int x=10,y=20,z; z=Abc(x,&y); printf(%dn,z); return 0;BPBP當(dāng)前指向FFD2保留給局部變量保存參數(shù)yy的地址入棧x的值入棧mov word ptr bp-02,0014BP指向FFC4IP入棧調(diào)用前是保存IP還是CS和IP?如果是保存CS和IP,如何取參數(shù)?多參數(shù)時如何???指針類型的參數(shù)與數(shù)值類型參數(shù)區(qū)別?入棧的EBP保留了4C個單元并初始化為CC局部變量x局部變量y 參數(shù)y的地址參數(shù)x的值跨過參數(shù)形參b的地址形參a的值EIP入棧存儲器和CPU間交換數(shù)據(jù),相當(dāng)于三次MOV6A28HAX存儲器25C7HSI

22、+0400H6A28H25C7HXCHG AX,SI+0400H格式: XCHG 目標(biāo)操作數(shù), 源操作數(shù)MOV BX,SI+0400HMOV SI+0400H,AXMOV AX,BX不能在內(nèi)存單元間交換數(shù)據(jù)XCHG 1234H,5678H X 兩個操作數(shù)都不能使用段寄存器XCHG AX,DS X 兩個操作數(shù)都不能使用立即數(shù)XCHG 1234H,1234 X 兩個操作數(shù)必須位數(shù)相同XCHG AX,DL X 存儲器數(shù)據(jù)段20000在存儲器中查找指定索引的數(shù)據(jù)33H31H38H34H36H35H(BX)+(AL)TABLE DB 33H,31H,38H,34H,36H,35H MOV BX, OFF

23、SET TABLE MOV AL, 3 XLAT20010TABLE10BX2001303HAL34H+格式: XLAT 表的起始地址:BX索引:AL結(jié)果:AL可省表格首地址必須用BX寄存器索引必須用AL寄存器表格長度不能超過256個字節(jié)(由AL決定)只能用于字節(jié)數(shù)據(jù)(結(jié)果保存在AL中)指令后面的表名稱不是操作數(shù),只是匯編語言的寫法,一般省略指令后面沒有操作數(shù)XLAT BL X 0011 1111TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHMOV BX, OFFSET TABLE MOV AL, 3 MOV DX,300HOUT DX,ALX

24、LAT abcdefg把內(nèi)存單元的地址偏移量送某個寄存器LEA SI,1000HMOV SI,1000HLEA SI,BX+SIADD SI,BXLEA SI,BX+SI+1000HADD SI,BXADD SI,1000HDATA SEGMENT X DW 20 DUP(?) Y DB AREA1 DB 100 DUP(?)DATA ENDSLEA SI,AREA1XYAREA1數(shù)據(jù)段SIMOV SI, OFFSET AREA1y的地址FFD0入棧(BP)=FFD2mov ax,bpsub ax,2源操作數(shù)必須是內(nèi)存操作數(shù)目的操作數(shù)必須是16位寄存器LEA BX,1234H X LEA BX

25、,1234H LEA BL,1234H X 將內(nèi)存4個單元數(shù)據(jù)送給指定寄存器LES:送寄存器和ESLDS:送寄存器和DSLES DI,BP+4LDS SI,2000H獲取子程序傳遞過來的遠(yuǎn)指針參數(shù)char far *s1=“ab”;f1(s1);a=1;f1(char far *s)(s1段地址)(s1偏移量)(IP)(BP)(ES)(BX)SPSPSPSPSPBP堆棧段低高a=1; 的地址PUSH BPMOV BP,SPPUSH ESPUSH BXLES BX,BP+4ESBXf1(char far * s1) char s220; int i=0; while(s2i+=s1i)!=0);

26、 s2i=0; puts(s2);源操作數(shù)必須是內(nèi)存操作數(shù)目的操作數(shù)是16位寄存器LDS SI,1234H X LDS SI,1234H LES BL,1234H X 目的操作數(shù)不能是段寄存器LES DS,1234H X 作用:硬件端口操作,控制硬件長格式:IN AL,30HOUT 31H,AL短格式:MOV DX,300HIN AL,DXOUT DX,AL0到FFH端口地址所有端口地址端口:外設(shè)的寄存器8086:64K字節(jié)端口由指令長度決定打印數(shù)據(jù)端口AL打印機(jī)378H“A”MOV DX,378HMOV AL,41HOUT DX,ALIN BL,20H X 數(shù)據(jù)只能通過累加器傳輸IN AL,

27、20H 超過255的端口只能用短格式IN AL,200H X MOV DX,200H IN AL,DX 短格式必須用DX存放端口地址IN AL,DL X IN AL,DX IN:AL在前;OUT:AL在后既可操作8位數(shù)據(jù),也可操作16位數(shù)據(jù)IN AX,80H (少用) (80H)送給AL(81H)送給AH操作PSW中的狀態(tài)標(biāo)志LAHF/SAHF:PSW低8位與AH寄存器間進(jìn)行PUSHF/POPF:將PSW進(jìn)行堆棧操作LAHFAND AH,01000000B判斷零標(biāo)志ADD/ADC/INC指令SUB/SBB/DEC、NEG、CMP指令MUL/IMUL指令DIV/IDIV指令CBW/CWD指令CB

28、W:字節(jié)變換成字 (AL)到(AX)CWD:字變換成雙字 (AX)到(DX)(AX)DAA/DAS指令與AAA/AAS/AAM/AAD指令帶符號擴(kuò)展ADD:不帶進(jìn)位加法影響標(biāo)志位ADC:帶進(jìn)位加法(多字節(jié)運(yùn)算)INC:遞增(加1)ADD AX,1000HADD AX,BXADC DX,CXINC CLOF、ZF、PF、CF、SF、AFINC不影響CF標(biāo)志超過表示范圍怎么辦?循環(huán),即FFH10(8位)MOV SI,1000HMOV AX,SIMOV DI,2000HADD AX,DIMOV SI,AXMOV AX,SI+2ADC AX,DI+2MOV SI+2,AX雙精度字加法:1234FEDC

29、H11228765H存儲器數(shù)據(jù)段ADD AX,DIMOV DI,2000H低地址高地址MOV SI,1000HFEHDCHMOV AX,SI1000H2000HSIDI34H12H65H87H22H11H11011100MOV SI,AXMOV AX,SI+2ADC AX,DI+2MOV SI+2,AXALAHSIDISI+2DI+2AX0CF1000H2000HDCFE418641H86H123423565757H23H1CMP:與SUB操作相似,但不保存結(jié)果SUB:不帶借位減法SBB:帶借位減法(多字節(jié)運(yùn)算)DEC:遞減(減1)NEG:各位取反1,求補(bǔ)SUB AX,1000H SUB AX

30、,BXSBB DX,CXDEC BX影響標(biāo)志位OF、ZF、PF、CF、SF、AFDEC不影響CF標(biāo)志NEG AX不保存結(jié)果,只影響標(biāo)志位,用于轉(zhuǎn)移判斷相等:用ZF標(biāo)志,1表示相等判斷大小有符號數(shù):用SF與OF的異或結(jié)果。1表示小于無符號數(shù):用CF標(biāo)志。1表示小于CMP AX,1000HJC xxxCMP AX,BXJL xxx無符號數(shù)有符號數(shù)操作后,CF=1操作數(shù)的值為-128或-32768時,結(jié)果不變操作后,正數(shù)變負(fù)數(shù),負(fù)數(shù)變正數(shù)相當(dāng)于用0減去操作數(shù)0 0 0 1 0 0 1 11 1 1 0 1 1 0 01 1 1 0 1 1 0 113H1 0 1 0 1 1 1 10 1 0 1 0

31、 0 0 00 1 0 1 0 0 0 10AFHADD 1234H,2345H X 采用相同的指令,要求兩個操作數(shù)一致 ADD AX,2345H ADD AX,1234H ADD AX, 2345H SBB 1234H, AX 源操作數(shù)和目的操作數(shù)不能同時為內(nèi)存地址目的操作數(shù)與源操作數(shù)不能用段寄存器目的操作數(shù)與源操作數(shù)必須位數(shù)相同SUB DS,2345H X ADD AL,1234H X 立即數(shù)不能作為目的操作數(shù)ADD 1234H,2345H X 無符號數(shù)與有符號數(shù)加減怎樣表示有符號數(shù)?十進(jìn)制數(shù)前有符號(-1)用NEG產(chǎn)生影響標(biāo)志IMUL:有符號乘法MUL:無符號乘法隱含寄存器MOV AL,

32、20HMOV BL,10HMUL BL結(jié)果默認(rèn)為(DX)(AX)或(AX)乘數(shù)默認(rèn)為AX或ALOF、CF結(jié)果超過16位或32位時,CF(OF)=1IDIV:有符號除法DIV:無符號除法隱含寄存器MOV AX,1234HMOV BL,21HDIV BL商默認(rèn)為(AL)或(AX)被除數(shù)默認(rèn)為(AX)或(DX)(AX)余數(shù)默認(rèn)為(AH)或(DX)被0除停止繼續(xù)執(zhí)行,產(chǎn)生產(chǎn)生0號中斷號中斷顯示“被零除”信息調(diào)整為壓縮4位BCD碼(8421碼)DAA:加法調(diào)整DAS:減法調(diào)整調(diào)整為8位BCD碼(ASCII碼)AAA:加法調(diào)整AAS:減法調(diào)整AAM:乘法調(diào)整AAD:除法調(diào)整ADD AL,BLAAA組合BC

33、D碼非組合BCD碼針對BCD運(yùn)算加/減/乘法運(yùn)算后調(diào)整,除法運(yùn)算前調(diào)整(AH)=0000 0000 (AL)= 0100 1000MOV AL,08MOV BL,09MUL BLAAM(AH)=(AL) /0AH(AL)=(AL) %0AH(AH)=0000 0111 (AL)= 0000 0010(AH)=0011 0111 (AL)= 0011 0010SAR/SHR/ROR/RCR:右移AND/OR/XOR/NOTTEST與AND操作類似但不保存結(jié)果,只影響標(biāo)志位用于轉(zhuǎn)移TEST AH,01H JZ L1SAL/SHL/ROL/RCL:左移AND AH,03H XOR AX,AXNOT

34、AX目的操作數(shù):寄存器或存儲器源操作數(shù):立即數(shù)、寄存器、存儲器影響SF、ZF、PF將CF、OF清零不能同時為存儲器移動位數(shù)算術(shù)左移SAL邏輯左移SHL不帶進(jìn)位循環(huán)左移ROLSAL AX,1MOV CL,3SHL BL,CLRCL BL,1MOV CL,4ROL DL,CL帶進(jìn)位循環(huán)左移RCL移動一位:SHL SI,1移動多位:MOV CL,3SHL SI,CL算術(shù)左移SAL、邏輯左移SHL最低位補(bǔ)0最高位進(jìn)CF1 0 0 1 0 1 0 10 0 1 0 1 0 1 00 1 0 1 0 1 0 0 x 1 00SAL AL,1SAL AL,1CFAL算術(shù)左移與邏輯左移完全相同移出的位進(jìn)入CF

35、移動位數(shù)為1時,若CF和最高位不同,則OF=1;多位移動時,不影響OF影響標(biāo)志位:CF、SF、ZF、PF、OF不帶進(jìn)位循環(huán)左移ROL移出的最高位同時進(jìn)CF和最低位1 0 0 1 0 1 0 10 0 1 0 1 0 1 10 1 0 1 0 1 1 0 x 1 01CFAL0ROL AL,1ROL AL,1移出的位進(jìn)入CF移動位數(shù)為1時,若CF和最高位不同,則OF=1;多位移動時,不影響OF影響標(biāo)志位:CF、OF帶進(jìn)位循環(huán)左移RCL移出的最高位進(jìn)CF原來的CF進(jìn)最低位1 0 0 1 0 1 0 10 0 1 0 1 0 1 00 1 0 1 0 1 1 10 1CFAL10RCL AL,1RC

36、L AL,1移出的位進(jìn)入CF移動位數(shù)為1時,若CF和最高位不同,則OF=1;多位移動時,不影響OF影響標(biāo)志位:CF、OF0移動位數(shù)算術(shù)右移SAR邏輯右移SHR不帶進(jìn)位循環(huán)右移RORSAR AX,1MOV CL,3SHR BL,CLRCR DL,1MOV CL,4ROR DL,CL帶進(jìn)位循環(huán)右移RCR移動一位:SHR SI,1移動多位:MOV CL,3SHR SI,CL最低位移出,進(jìn)CF最高位補(bǔ)0、CF、最低位SAR最高位保持不變MOVSB/MOVSW將DS:SI處的一個字節(jié)或雙字節(jié)送到ES:DI處與REP前綴配合,傳送一批數(shù)據(jù)CMPSB/CMPSW將DS:SI處的一個字節(jié)或雙字節(jié)與ES:DI處

37、的一個字節(jié)或雙字節(jié)進(jìn)行比較與REPE/REPZ前綴配合,以尋找第一個不同數(shù)據(jù)與REPNE/REPNZ前綴配合,以尋找第一個相同數(shù)據(jù) LDS SI,1000H LES DI,1500H MOV CX,4REP MOVSSCASB/SCASW將AL或AX的值與ES:DI處的一個字節(jié)或雙字節(jié)進(jìn)行比較LODSB/LODSW將DS:SI處的一個字節(jié)或雙字節(jié)送入AL或AXSTOSB/STOSW將AL或AX的值送到DS:SI處REP/REPZ/REPE/REPNZ/REPZE與上述串操作指令配合,實現(xiàn)循環(huán)處理次數(shù)由CX指定方向由DF標(biāo)志指定LOOP/LOOPZ/LOOPE/LOOPNZ/LOOPNE不需要條

38、件JMPCALL/RETINT/INTO/IRET需要條件JZ/JE/JC/JL/JA/JB/JS/JO無條件轉(zhuǎn)移調(diào)用子程序及返回調(diào)用系統(tǒng)提供的子程序及返回根據(jù)標(biāo)志位轉(zhuǎn)移循環(huán)次數(shù)由CX寄存器指定改變CS、IPJCXZCX=0轉(zhuǎn)移必須在必須在-128到到127范圍內(nèi)范圍內(nèi)JMP:無條件轉(zhuǎn)移不返回不需要保存當(dāng)前CS、IP直接跳轉(zhuǎn)間接跳轉(zhuǎn)如何確定轉(zhuǎn)移的位置轉(zhuǎn)移的范圍段內(nèi)跳轉(zhuǎn)段間跳轉(zhuǎn)指定跳轉(zhuǎn)的相對值指定跳轉(zhuǎn)目標(biāo)位置,由寄存器或存儲器給出同一段(64K)內(nèi),不需要考慮段地址不同段,需要考慮段地址SHORT NEAR FAR-128到127-32768到32767JMP SHORT R113BA:001B

39、 F313BA:001C A613BA:001D 75 0113BA:001F CB13BA:0020 4113BA:0021 890E060013BA:0025 EB F8REPZCMPSBJNZ 0020RETINC CXMOV 0006,CXJMP 001F REPE CMPSB JNE FOUNDSAME: RETFOUND: INC CX MOV WORD PTR POINT,CX JMP SAME匯編語言機(jī)器語言反匯編F8H=11111000B=-(00001000B)=-827H-1FH=8JMP FAR R1段間間接跳轉(zhuǎn)由DWORD修飾,由存儲器給定段內(nèi)間接跳轉(zhuǎn)的目標(biāo)由寄存器或

40、存儲器給定段間直接跳轉(zhuǎn)用FAR修飾JMP BXJMP WORD PTR BX+SI編譯時自動計算段內(nèi)直接跳轉(zhuǎn)的NEAR和SHORTJMP DWORD PTR BX+SI無符號數(shù)比較轉(zhuǎn)移JL/JNGE、JNL/JGEJLE/JNG、JNLE/JG有符號數(shù)比較轉(zhuǎn)移JZ/JE、 JNZ/JNEJS、JNSJP/JPE、JNP/JPOJO、JNOJB/JC/JNAE、JNB/JNC/JAEJBE/JNA、JNBE/JAZF=1、0SF=1、0PF=1、0OF=1、0CF=1、0CF或ZF=1、0SFOF、SF=OFSFOF或ZF=1、SF=OF且ZF=0JCXZ根據(jù)CX轉(zhuǎn)移CX=0必須在必須在-128

41、到到127范圍內(nèi)范圍內(nèi)13BA:001B F313BA:001C A613BA:001D 75 0113BA:001F CB13BA:0020 4113BA:0021 890E060013BA:0025 EB F8REPZCMPSBJNZ 0020RETINC CXMOV 0006,CXJMP 001F REPE CMPSB JNE FOUNDSAME: RETFOUND: INC CX MOV WORD PTR POINT,CX JMP SAME匯編語言機(jī)器語言反匯編20H-1FH=1段內(nèi)直接調(diào)用段內(nèi)間接調(diào)用調(diào)用方式段間直接調(diào)用段間間接調(diào)用CALL F1CALL BXCALL FAR PTR

42、 F1CALL BXCALL DWORD PTR DICALL NEAR PTR F1調(diào)用的參數(shù)通過寄存器通過堆棧子程序入口需要入棧部分寄存器子程序返回前需要出棧部分寄存器CALLIP(CS)入棧將子程序的內(nèi)存地址送IP(CS)RETIP(CS)出棧CS、IP自動自動入棧和出棧入棧和出棧調(diào)用系統(tǒng)提供的子程序BIOS操作系統(tǒng)BIOS功能調(diào)用DOS功能調(diào)用BIOS功能調(diào)用DOS功能調(diào)用顯示磁盤鍵盤串行通訊打印機(jī)INT 10HINT 13HINT 16HINT 14HINT 17HINT 21H讀磁盤寫磁盤格式化磁盤輸入輸出文件管理調(diào)用前用AH保存子功能號用相應(yīng)寄存器保存入口參數(shù)調(diào)用后從相應(yīng)寄存器取

43、出出口參數(shù)鍵盤字符輸入顯示字符DOS功能01號子功能DOS功能02號子功能顯示字符串DOS功能09號子功能DOS子功能號01H:鍵盤輸入回顯入口參數(shù)無出口參數(shù)其它DOS鍵盤子功能AL:輸入的字符ASCII碼07H:輸入無回顯08H:輸入無回顯,檢測Ctrl+Break0BH:檢測鍵盤是否有輸入 L1: MOV AH,01H INT 21H SUB AL,30H JC L1 CMP AL,0AH JNC L1 從鍵盤輸入0到9BIOS鍵盤輸入功能INT 16H的0號子功能只能輸入字符可檢測功能鍵DOS子功能號0AH:鍵盤輸入到緩沖區(qū)入口參數(shù)DS:DX:緩沖區(qū)首地址出口參數(shù)緩沖區(qū)格式無00H:設(shè)定

44、的最大字符數(shù)01H:實際的字符數(shù)02H以后:字符串DATA SEGMENTSTR1 DB 100 DB ? DB 100 DUP(?) DATA ENDS MOV AX,DATA MOV DS,AX LEA DX, STR1 MOV AH,0AH INT 21H LEA DX,STR1+2 MOV AH,09H INT 21H DOS子功能號02H:入口參數(shù)DL:輸出字符的ASCII碼出口參數(shù)無MOV AH,02HMOV DL,41HINT 21H 屏幕顯示字符“A”BIOS字符輸出功能INT 10H的0E號子功能可以指定字符的顏色I(xiàn)NT 10H的0A號子功能DOS子功能號09H:入口參數(shù)DS

45、:字符串段地址出口參數(shù)無DATA SEGMENT S1 DB Input:$DATA ENDSLEA DX,S1MOV AH,09HINT 21H 屏幕顯示字符串“Input:”BIOS字符串輸出功能可以指定字符的顏色和區(qū)域INT 10H的13號子功能DX:字符串首地址偏移量要求:字符串以$結(jié)束DOS子功能0BH號入口參數(shù):無出口參數(shù):AL=0有輸入;AL=FF無輸入INT 16H 的1號子功能入口參數(shù):無出口參數(shù):ZF=1無按鍵;ZF=0,AL=ASCII碼;AH=掃描碼MOV AH,01HINT 16HJNZ XXXDOS子功能號06H入口參數(shù):DL=FF 輸入;DL=字符ASCII碼 輸

46、出出口參數(shù):AL=輸入字符ASCII碼MOV DL,0FFHMOV AH,06HINT 21HMOV DL,41HMOV AH,06HINT 21H CPU臨時執(zhí)行特定子程序的過程由BIOS功能和DOS功能調(diào)用引起這些程序存放的位置系統(tǒng)啟動時加載到內(nèi)存自己編寫子程序如何修改這些程序由CPU引腳INTR和NMI引起把這些程序的入口地址保存到一個表中修改表中的入口地址,指向自己編寫的程序中斷向量表中斷處理子程序軟件中斷硬件中斷調(diào)用方式不同INT指定中斷號,自動尋找子程序位置入棧保存的內(nèi)容不同CALL只需要把IP(CS)入棧RET只需要把IP(CS)彈出棧CALL直接指定子程序位置INT需要把IP(

47、CS)以及標(biāo)志寄存器入棧出?;謴?fù)的內(nèi)容不同IRET需要把IP(CS)和標(biāo)志寄存器彈出棧Why?需要修改IF和TF禁止單步中斷從中斷程序返回LOOP循環(huán)LOOPZ/LOOPELOOPNZ/LOOPNECX=0,結(jié)束循環(huán)每循環(huán)一次CX自動減1,根據(jù)CX或ZF決定是否結(jié)束循環(huán)CX0,或ZF=0,結(jié)束循環(huán)CX0,或ZF=1,結(jié)束循環(huán) MOV CX,50 MOV BX,0 MOV SI,1L1: ADD BX,SI INC SI LOOP L1HLT:暫停NOP:空WAIT:使CPU進(jìn)入等待狀態(tài)ESC:CPU將控制權(quán)交給其它處理器,如8087LOCK:封鎖總線控制標(biāo)志位控制處理器CLC/STC/CMCC

48、LD/STDCLI/STICF標(biāo)志置0、置1、取反DF標(biāo)志置0、置1IF標(biāo)志置0、置1匯編程序編譯MASM5.0(宏匯編)TASMMASM X.ASMLINK X匯編程序編輯用任意編輯器,保存為文本格式,文件后綴.ASMMASMEDITTcp2003A集成開發(fā)環(huán)境匯編程序運(yùn)行DOS環(huán)境或命令行模式下運(yùn)行指定DS、CS、SS和ES定義各段在代碼段編寫程序的各模塊(包括主模塊)以SEGMENT開始,以ENDS結(jié)束以PROC開始,以ENDP結(jié)束以END結(jié)束程序主模塊確定返回操作系統(tǒng)的方法調(diào)用INT 20H調(diào)用INT 21H的4CH功能簡單程序可以不定義主模塊而是在代碼段直接寫代碼DATA SEGME

49、NT INBUFF DW 100 DUP(?) OUTBUFF DW 100 DUP(?)DATA ENDSSTACK SEGMENT DB 60 DUP(?)STACK ENDSCODE SEGMENTMAIN PROC FAR START: PUSH DS MAIN ENDPCODE ENDS END START 定義數(shù)據(jù)段定義堆棧段定義代碼段程序結(jié)束CODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MO

50、V ES,AX RETMAIN ENDPCODE ENDS END START 給段寄存器賦值確定返回方式確定段寄存器與段關(guān)系必須一致CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AH,4CH INT 21H CODE ENDS END START 給段寄存器賦值返回操作系統(tǒng)不需要主程序不需要保存返回地址不需要調(diào)用RET指令加載程序搜索可加載程序的內(nèi)存段結(jié)束程序釋放內(nèi)存,關(guān)閉文件返回父進(jìn)程在PSP的0AH開

51、始保存父進(jìn)程的下一地址調(diào)用INT 21H的4BH號功能在該內(nèi)存段起始位置建立256字節(jié)的PSP保存所有寄存器內(nèi)容從內(nèi)存100H開始加載數(shù)據(jù)段、代碼段等段地址賦給DS調(diào)用INT 21H的4CH號功能或INT 20H程序開始的PUSH DS即把該地址入棧在PSP的0H安排INT 20H指令操作系統(tǒng)加載程序時建立在加載的程序段之前設(shè)立100H字節(jié)PSPPSP內(nèi)容0001H:INT 20H指令代碼0203H:可使用內(nèi)存大小0A0DH:INT 22H的中斷向量拷貝0E11H:INT 23H的中斷向量拷貝1215H:INT 24H的中斷向量拷貝2C2DH:PATH等環(huán)境變量表的段地址5C7FH:兩個文件控

52、制塊FCB80FFH:命令行參數(shù)5052H:INT 21H指令代碼返回父進(jìn)程(父進(jìn)程下一地址)處理Ctrl+C嚴(yán)重錯誤結(jié)束當(dāng)前進(jìn)程加載時PSP的0地址處安排INT 20H,并把該地址保存到DS中主程序開始把DS和0入棧結(jié)束時調(diào)用RET,0彈給IP,DS彈給CSCPU執(zhí)行PSP的0地址處指令,即INT 20H主程序重新把真正的數(shù)據(jù)段地址送給DSINT 20H釋放內(nèi)存,關(guān)閉文件,把PSP偏移0AH處的地址彈給IP和CS,返回父進(jìn)程INT 20H指令PSP機(jī)器語言反匯編代碼段開始數(shù)據(jù)段開始棧頂位置自動指向正確位置PUSH DS,把初始的DS值5B4C保存到堆棧3AH處DS和ES指向正確位置PSP中I

53、NT 20H的地址堆棧段中實際保存的INT 20H指令的地址準(zhǔn)備執(zhí)行INT 20H,返回父進(jìn)程指令語句:由80X86指令組成,可產(chǎn)生機(jī)器代碼偽指令語句:為編譯和連接提供控制信息,不產(chǎn)生機(jī)器代碼宏指令語句:在編譯時被指令替代變量定義段定義過程定義編譯成機(jī)器語言時替換掉名字 操作符 操作數(shù) ;注釋語句指令。有:偽指令。無:符號地址LA1: MOV AX,1023HV1 DB 10H該行指令在代碼段的地址偏移量該變量在數(shù)據(jù)段的地址偏移量變量、標(biāo)號屬性:段地址偏移地址類型數(shù)值常量二進(jìn)制:xxxxxxxxB八進(jìn)制:xxxO或xxxQ十進(jìn)制:xxxx或xxxxD01000101B721O或721Q1991或1991D十六進(jìn)制:xxxxH字符串:xxx或“xxx”0F1D4HABcdef符

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論