版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章Pentium指令系統(tǒng)
與匯編語言編程第四章Pentium指令系統(tǒng)與匯編語言編程4.1概述4.2通用整數(shù)指令及應(yīng)用4.3匯編語言程序概述
4.4常用偽指令語句
4.5匯編語言編程入門
4-24.1概述
Pentium的指令系統(tǒng)是在80X86系列指令系統(tǒng)的基礎(chǔ)上逐步發(fā)展而形成的,在代碼級(jí)具有向上兼容性。它增加了指令的種類,增強(qiáng)了一些指令的功能,提供了32位尋址方式和32位操作方式,并且包含全部浮點(diǎn)運(yùn)算指令。Pentium指令的操作數(shù)可以是0~3個(gè),根據(jù)尋址方式不同,可直接包含在指令中,也可存于寄存器或存儲(chǔ)器中。每條指令的長度因指令而異,平均指令長度為3.2字節(jié)。指令的操作數(shù)寬度可以是8位、16位、32位,尋址寬度可以是16位或32位。Pentium指令系統(tǒng)的突出特點(diǎn)是:功能強(qiáng)、靈活性高,給編譯程序和匯編語言程序的設(shè)計(jì)人提供了很寬的選擇余地。4-3Pentium指令格式字段1字段2字段3modr/m字段4s-i-b字段5displ字段6data1字節(jié)1字節(jié)寄存器/存儲(chǔ)器尋址方式說明符字段
主尋址字節(jié),規(guī)定操作數(shù)的尋址方式,包括操作數(shù)的存放位置和存儲(chǔ)器中操作數(shù)EA的計(jì)算方法等比例-變址-基址字節(jié),為第二尋址字節(jié)位移量字段,屬存儲(chǔ)器地址的一部分。位移量足夠小時(shí),通常采用帶符號(hào)的8位整數(shù),CPU自動(dòng)將它擴(kuò)展到16位或32位立即數(shù)字段8位立即數(shù)與16/32位操作數(shù)一起使用時(shí),CPU自動(dòng)將其擴(kuò)展至符號(hào)相同的16/32位數(shù)。同理也可將16位立即數(shù)擴(kuò)展至32位1~4字節(jié)1~2字節(jié)前綴Prefix操作碼OPcode0,1,2,4字節(jié)0,1,2,4字節(jié)規(guī)定指令的操作性質(zhì),包括操作數(shù)類型、操作數(shù)傳送方向、寄存器編碼或符號(hào)擴(kuò)展等用于修改指令操作的某些屬性,有5類前綴:●段超越前綴●操作數(shù)寬度前綴●地址寬度前綴●重復(fù)前綴●總線鎖定前綴4.1概述4-4本節(jié)重點(diǎn)介紹最基本的整數(shù)指令。
Pentium指令分類整數(shù)指令--最常用部分浮點(diǎn)數(shù)指令操作系統(tǒng)型指令Pentium指令系統(tǒng)分為:4.1概述4-5Pentium的整數(shù)指令按功能分為:4.串操作類指令5.控制轉(zhuǎn)移類指令9.高級(jí)語言指令1.數(shù)據(jù)傳送類指令2.算術(shù)運(yùn)算類指令3.邏輯運(yùn)算與移位指令6.處理器控制類指令7.標(biāo)志操作指令8.按條件設(shè)置字節(jié)指令4.2通用整數(shù)指令及應(yīng)用4-64.2通用整數(shù)指令及應(yīng)用4-71.數(shù)據(jù)傳送類指令數(shù)據(jù)傳送是計(jì)算機(jī)中最基本、最常用、最重要的一類操作。如:●各種初始化操作●取操作數(shù)●保存結(jié)果在實(shí)際程序中,它的使用頻率最高。這類指令尋址方式最豐富,除POPF外,均不影響標(biāo)志寄存器的標(biāo)志位。數(shù)據(jù)傳送指令主要包括:
通用數(shù)據(jù)傳送指令。如數(shù)值傳送指令(MOV)、裝入有效地址指令(LEA)、段裝入指令、交換類指令(XCHG和BSWAP)、查表轉(zhuǎn)換指令(XLAT)等。
堆棧指令。如PUSH類/POP類指令等。
數(shù)據(jù)類型變換指令。如數(shù)據(jù)寬度變換指令,帶符號(hào)數(shù)符號(hào)位擴(kuò)展/無符號(hào)數(shù)位擴(kuò)展指令等。
I/O指令。如IN類/OUT類指令等。
標(biāo)志寄存器傳送指令4.2通用整數(shù)指令及應(yīng)用4-8指令操作:(源操作數(shù))→目的操作數(shù)
⑴傳送指令指令格式:MOV目的操作數(shù),源操作數(shù)
尋址規(guī)定: REG/MEM/SREG,REGREG/MEM,SREG REG/SREG,MEMREG/MEM,IMMIMM8/16/32位立即數(shù)REG8/16/32位通用寄存器MEM8/16/32位存儲(chǔ)器SREG段寄存器4.2通用整數(shù)指令及應(yīng)用4-9立即數(shù)通用寄存器(EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI)CS存儲(chǔ)器段寄存器(SS、DS、ES、FS、GS)MOV指令允許的傳送關(guān)系4.2通用整數(shù)指令及應(yīng)用4-104.2通用整數(shù)指令及應(yīng)用4-11使用說明:源操作數(shù)和目的操作數(shù)的類型必須一致。目的操作數(shù)不能為立即數(shù)。CS和(E)IP均不能用作指令的目的寄存器。段寄存器間不能直接傳送,也不能直接將立即數(shù)送給段寄存器。源操作數(shù)為立即數(shù),而目的操作數(shù)類型不確定時(shí),要給目的操作數(shù)加類型說明。源操作數(shù)和目的操作數(shù)不能同為存儲(chǔ)器操作數(shù)。4-12⑴MOVDX,BL⑵MOVDS,0100H錯(cuò)。源、目的操作數(shù)不能同為存儲(chǔ)器尋址。⑶MOV[1200H],[SI]錯(cuò)。源和目的操作數(shù)類型不一致。錯(cuò)。立即數(shù)不能直接賦給段寄存器⑷MOVAX,[BX][BP]在16位基址加變址的尋址方式中,用作基址和變址的寄存器不能同為基址或變址寄存器
例4.1識(shí)別下列指令的正確性,對(duì)錯(cuò)誤的指令,說明錯(cuò)誤的原因。MOVAX,[SI]MOV[1200H],AX4.2通用整數(shù)指令及應(yīng)用4-13
例4.1識(shí)別下列指令的正確性,對(duì)錯(cuò)誤的指令,說明錯(cuò)誤的原因。4.2通用整數(shù)指令及應(yīng)用⑸MOV1020H,DS錯(cuò)。目的操作數(shù)不能為立即數(shù)。⑹MOVCS,AX錯(cuò)。目的操作數(shù)類型不確定錯(cuò)。不能用傳送指令改變代碼段寄存器。(7)MOV[BX][DI],34HMOVWORDPTR
[BX][DI],34H4-14⑵交換指令操作:(目的操作數(shù))(源操作數(shù))格式:XCHG目的操作數(shù),源操作數(shù)
REG/MEM, REG REG,MEM說明:
⑴基本用法同MOV指令;⑵當(dāng)源或目的操作數(shù)為MEM操作數(shù)時(shí),會(huì)自動(dòng)激活LOCK信號(hào),該特性常用于多機(jī)、多任務(wù)或多用戶系統(tǒng)中的臨界段(共享資源)訪問。4.2通用整數(shù)指令及應(yīng)用4-15(3)擴(kuò)展傳送指令操作:MOVSX是將源操作數(shù)中的8位或16位操作數(shù)帶符號(hào)等值擴(kuò)展為16位或32位操作數(shù),存于目的操作數(shù)中。格式:
MOVSX/MOVZX
目的操作數(shù),源操作數(shù)
4.2通用整數(shù)指令及應(yīng)用4-16說明:
XLAT是一條隱含尋址的指令。隱
含兩個(gè)操作數(shù):DS:(E)BX存放表基址,AL
存放查表參數(shù)。使用前要給隱含操作數(shù)賦
初值。⑷查表指令
格式:
XLAT
操作:
((EBX)+(AL))→AL((BX)+(AL))→AL4.2通用整數(shù)指令及應(yīng)用4-17
例4.2內(nèi)存中自TABLE開始的16個(gè)單元連續(xù)存放著自然數(shù)0到15的平方值(構(gòu)成一個(gè)平方表),任給一整數(shù)M在XX單元中(該數(shù)為0≤M≤15),查表求M的平方值,并將結(jié)果存入YY單元中。解: LEABX,TABLE MOVAL,XX
XLAT
MOVYY,ALTABLE0+11+24+39+15225XX54.2通用整數(shù)指令及應(yīng)用4-18⑸壓棧/彈棧指令格式:PUSH 源操作數(shù)
REG16/MEM16/IMM16 REG32/MEM32/IMM32操作:((E)SP)-2/4→(E)SP (源操作數(shù))→(SS:(E)SP)●壓棧指令4.2通用整數(shù)指令及應(yīng)用4-19格式:POP目的操作數(shù)
MEM16/MEM32/REG16/REG32操作:([SS:(E)SP])→目的操作數(shù) ((E)SP)+2/4→(E)SP●彈棧指令4.2通用整數(shù)指令及應(yīng)用4-20堆棧指令的操作數(shù)只能為字或雙字。PUSH和POP要成對(duì)出現(xiàn),以保持堆棧平衡堆棧指令也隱含了一個(gè)目的/源操作數(shù)—堆棧。壓棧順序是先壓高字節(jié)后壓低字節(jié),彈棧則是先彈低字節(jié)后彈高字節(jié)?!袷褂谜f明:4.2通用整數(shù)指令及應(yīng)用
例4.3用堆棧指令實(shí)現(xiàn)將EAX的高16位送BX,低16位送CX。PUSHEAX;將EAX壓棧,先壓高16位,后壓低16位POPCX;彈出EAX的低16位送CXPOPBX;彈出EAX的高16位送BX解:4.2通用整數(shù)指令及應(yīng)用4-214-22設(shè)(EAX)=12345678H,(SP)=0100H,執(zhí)行上列指令時(shí),堆棧變化下圖所示?!璼p(0100H)(a)執(zhí)行之前78H56H34H12H…0100Hsp(00FCH)(b)執(zhí)行PUSHEAX4.2通用整數(shù)指令及應(yīng)用4-2334H12H…0100Hsp(00FEH)(c)執(zhí)行POPCX(CX)=5678H…sp(0100H)(d)執(zhí)行POPBX(BX)=1234H
4.2通用整數(shù)指令及應(yīng)用設(shè)(EAX)=12345678H,(SP)=0100H,執(zhí)行上列指令時(shí),堆棧變化下圖所示。4-24⑸地址傳送指令格式:
LEA目的操作數(shù),源操作數(shù)功能:將源操作數(shù)的有效地址送指定的寄存器。說明:LEA指令的目的操作數(shù)只能是16位或32位通用寄存器,而源操作數(shù)只能是存儲(chǔ)器操作數(shù) ●裝入有效地址指令LEA4.2通用整數(shù)指令及應(yīng)用4-25例4.4在數(shù)據(jù)段中,有一如圖所示存儲(chǔ)形式的字?jǐn)?shù)據(jù)區(qū),若將BUF為偏移地址的存儲(chǔ)區(qū)的內(nèi)容分別送到AX、BX和CX,則下程序段執(zhí)行后各寄存器的內(nèi)容是多少?LEASI,BUFMOVAX,BUFMOVBX,[SI]MOVCX,[SI+4]LEADI,[SI+6]M120010H780011H990012H610013H880014H190015H290016H390017H690018HBUF…4.2通用整數(shù)指令及應(yīng)用4-26程序段執(zhí)行后各寄存器的內(nèi)容是:(SI)=0011H(AX)=9978H(BX)=9978H(CX)=2919H(DI)=0017H注意:通過上面的例子體會(huì)LEA指令和MOV指令功能的區(qū)別LEASI,BUF;
將存儲(chǔ)單元BUF的0011H有效地址送SI
MOVAX,BUF;取存儲(chǔ)單元BUF的內(nèi)容送AX4.2通用整數(shù)指令及應(yīng)用4-27格式:LDSLESLFS目的操作數(shù),源操作數(shù)LGSLSS功能:將源操作數(shù)的有效地址送指定的寄存器。說明:LEA指令的目的操作數(shù)只能是16位或32位通用寄存器,而源操作數(shù)只能是存儲(chǔ)器操作數(shù)
裝入全地址指針指令4.2通用整數(shù)指令及應(yīng)用
例4.580486工作在實(shí)地址方式時(shí),(DS)=091DH,(BX)=0024H,有關(guān)存儲(chǔ)器的內(nèi)容如圖所示。求指令LESDI,32H[BX]執(zhí)行后的結(jié)果。DIES00F6H1E40H09226H段基址…操作碼操作碼32H00H存儲(chǔ)器…指令代碼段偏移量數(shù)據(jù)段位移量F6H00H40H1EH…0032HBX0024H+DS*16091D0H09226HLESDI,32H[BX]4.2通用整數(shù)指令及應(yīng)用4-28?說明:I/O端口有兩種尋址方式
●
直接尋址,尋址范圍為0~255;
●
間接尋址,尋址范圍為0~216-1?!褫斎胫噶?格式:IN累加器,端口AL/AX/EAX,IMM8AL/AX/EAX,DX?操作:AL/AX/EAX←(I/O端口)直接尋址:指令給出的立即數(shù)是I/O端口地址間接尋址:DX寄存器給出的是I/O端口地址4.2通用整數(shù)指令及應(yīng)用4-29⑹輸入/輸出指令4-30●輸出指令格式:OUT端口, 累加器
IMM8,AL/AX/EAXDX,AL/AX/EAX操作:(AL/AX/EAX)→I/O端口4.2通用整數(shù)指令及應(yīng)用4-31例4.6INAL,20H;從20H號(hào)端口輸入8位字節(jié)數(shù)據(jù)送到AL中INEAX,DX;從DX所指16位端口輸入32位雙字?jǐn)?shù)據(jù)送到EAX中OUT80H,AL;把AL中的8位字節(jié)數(shù)據(jù)發(fā)送到80H號(hào)端口OUT0FFH,EAX;把EAX中的32位雙字?jǐn)?shù)據(jù)發(fā)送到0FFH號(hào)端口OUTDX,AX;把AX中的16位字?jǐn)?shù)據(jù)發(fā)送到DX所指端口4.2通用整數(shù)指令及應(yīng)用
這類指令支持加、減、乘、除四種基本算術(shù)運(yùn)算,其操作對(duì)象可以是字節(jié)、字、雙字的無符號(hào)和有符號(hào)的二進(jìn)制整數(shù);也可以是無符號(hào)的壓縮/非壓縮BCD碼數(shù);還支持符號(hào)擴(kuò)展指令和十進(jìn)制調(diào)整指令。
它的操作結(jié)果一般會(huì)影響標(biāo)志寄存器中的狀態(tài)標(biāo)志位,如ZF、CF、SF、OF、AF、PF等。2.算術(shù)運(yùn)算類指令
數(shù)據(jù)傳送類
算術(shù)運(yùn)算類邏輯運(yùn)算與移位類串操作類控制轉(zhuǎn)移類處理器控制4.2通用整數(shù)指令及應(yīng)用4-32算術(shù)運(yùn)算指令有:雙操作數(shù)指令,如加、減、比較等。單操作數(shù)指令,如增/減、整數(shù)變反、乘除法指令等。無操作數(shù)指令,如十進(jìn)制運(yùn)算調(diào)整和符號(hào)位擴(kuò)展等。三操作數(shù)指令,如有符號(hào)整數(shù)乘法指令I(lǐng)MUL等。4.2通用整數(shù)指令及應(yīng)用4-334-34(1)加法/減法類指令
操作:
ADD:(目的)+(源)→目的
SUB:(目的)-(源)→目的
ADC:(目的)+(源)+CF→目的
SBB:(目的)-(源)-CF→目的目的操作數(shù),源操作數(shù)REG,REG/MEM/IMMMEM,REG/IMM
格式:
ADDSUB
ADCSBB加/減法指令4.2通用整數(shù)指令及應(yīng)用4-35使用說明:源操作數(shù)和目的操作數(shù)可以是字節(jié)、字和雙字?jǐn)?shù)據(jù),但兩者的類型必須一致。源操作數(shù)可以為通用寄存器、存儲(chǔ)器或立即數(shù),目的操作數(shù)可以為通用寄存器和存儲(chǔ)器。但兩者不能同為存儲(chǔ)器操作數(shù)。溢出標(biāo)志OF是針對(duì)有符號(hào)數(shù)運(yùn)算設(shè)置的,若是無符號(hào)數(shù)運(yùn)算,結(jié)果是否“溢出”,則要看運(yùn)算是否產(chǎn)生進(jìn)位/借位來判斷,有進(jìn)位/借位產(chǎn)生,則結(jié)果溢出。。4.2通用整數(shù)指令及應(yīng)用4-36
加1/減1指令(INC/DEC)格式:INC/DEC目的操作數(shù)
REG/MEM操作:(目的操作數(shù))+/-1→目的操作數(shù)應(yīng)用:
CPU根據(jù)操作結(jié)果設(shè)置狀態(tài)標(biāo)志OF、SF、ZF、AF和PF,但不影響進(jìn)位/借位標(biāo)志CF。4.2通用整數(shù)指令及應(yīng)用4-37使用說明:操作數(shù)可以是8位、16位或32位的通用寄存器和存儲(chǔ)器。INC/DEC指令常用于調(diào)整地址指針和用作加法/減法計(jì)數(shù)器。INC/DEC指令與“ADD/SUB目的操作數(shù),1”的功能基本相同,兩者區(qū)別在于ADD/SUB指令根據(jù)結(jié)果改變進(jìn)位/借位標(biāo)志CF,但I(xiàn)NC/DEC指令不影響進(jìn)位/借位標(biāo)志CF。4.2通用整數(shù)指令及應(yīng)用4-38例4.7求AX中存放的有符號(hào)數(shù)的絕對(duì)值。
4.2通用整數(shù)指令及應(yīng)用程序如下: TESTAX,8000H;測試符號(hào)位 JZNEXT;SF=0,轉(zhuǎn)NEXT,正數(shù)不求補(bǔ)NEGAX;求補(bǔ),AX值為原值的絕對(duì)值NEXT:HLT4-39整數(shù)變反指令(求補(bǔ))格式:NEG目的操作數(shù)
REG/MEM操作:0-(目的操作數(shù))→目的操作數(shù)應(yīng)用:
常用于求負(fù)數(shù)的絕對(duì)值。
例4.8
兩個(gè)32位雙字?jǐn)?shù)據(jù)X、Y定義如下,DW是匯編語言偽指令,為每個(gè)數(shù)據(jù)項(xiàng)分配兩個(gè)字節(jié)存儲(chǔ)單元(稱為字),請(qǐng)編寫計(jì)算X=X-Y的程序段(低位在前)。4.2通用整數(shù)指令及應(yīng)用XDW9999H,9678H;X=96789999HYDW1111H,1F11H;Y=1F111111H4-40比較指令格式:CMP目的操作數(shù),源操作數(shù)
REG,REG/MEM/IMM MEM,REG/IMMCMP與SUB指令都執(zhí)行減法操作,但前者不因操作結(jié)果改變目標(biāo)操作數(shù)值,而后者改變。操作:(目的操作數(shù))-(源操作數(shù)),根據(jù)操作結(jié)果修改狀態(tài)標(biāo)志,但不改變目標(biāo)操作數(shù)值。4.2通用整數(shù)指令及應(yīng)用乘法指令分為有符號(hào)數(shù)和無符號(hào)數(shù)乘法指令(IMUL/MUL)。
無符號(hào)數(shù)乘法指令只有單操作數(shù)格式一種;
有符號(hào)數(shù)乘法指令則有單操作數(shù)、雙操作數(shù)和三操作數(shù)三種格式。4-41(2)乘法指令4.2通用整數(shù)指令及應(yīng)用4-42◆單操作數(shù)乘法指令格式:MUL/IMUL源操作數(shù)
REG/MEM操作:MUL和IMUL分別為有符號(hào)數(shù)和無符號(hào)數(shù)乘法指令,兩種指令除操作數(shù)類型不同外,操作完全相同:字:(AX)×(源操作數(shù))→DX:AX雙字:(EAX)×(源操作數(shù))→EDX:EAX字節(jié):(AL)×(源操作數(shù))→AX源操作數(shù)4.2通用整數(shù)指令及應(yīng)用4-43單操作數(shù)乘法指令的被乘數(shù)是隱含的(在AL/AX/EAX中),而結(jié)果長度一定是被乘數(shù)/乘數(shù)的二倍(在AX/DX:AX/EDX:EAX中)。源操作數(shù)不能為立即數(shù)。源操作數(shù)為存儲(chǔ)器操作數(shù),且類型不能確定時(shí),要顯式說明操作數(shù)類型。乘法指令使用說明:4.2通用整數(shù)指令及應(yīng)用4-44要根據(jù)是有符號(hào)數(shù)還是無符號(hào)數(shù),分別選用IMUL或MUL指令指令執(zhí)行影響CF和OF標(biāo)志,若指令執(zhí)行后,結(jié)果的高一半是有效數(shù)值位,則CF=OF=1,否則CF=OF=0。乘法指令使用說明:4.2通用整數(shù)指令及應(yīng)用4-45(3)除法指令格式:DIV∕IDIV源操作數(shù) REG/MEM操作:按源操作數(shù)類型:字節(jié):(AX)/(源),商存于AL中,余數(shù)存于AH字:(DX:AX)/(源),商存于AX中,余數(shù)存于DX雙字: (EDX:EAX)/(源),商在EAX中,余數(shù)在EDX4.2通用整數(shù)指令及應(yīng)用例4.9編程實(shí)現(xiàn)無符號(hào)字節(jié)數(shù)NUMX除以無符號(hào)字節(jié)數(shù)NUMY,要求商存入REZULT,將余數(shù)存入地址ADDI。程序如下:MOVAL,NUMX;將地址NUMX內(nèi)的字節(jié)數(shù)據(jù),取出傳送給;AL寄存器MOVAH,0;擴(kuò)展無符號(hào)的被除數(shù)為字?jǐn)?shù)據(jù)DIVNUMY;用寄存器AX中的數(shù)據(jù)除以NUMYMOVREZULT,AL;將商存入REZULTMOVADDI,AH;將余數(shù)存入ADDI4.2通用整數(shù)指令及應(yīng)用4-464-47說明:除法指令的被除數(shù)是隱含的,且長度一定是除數(shù)的二倍(在AX/DX:AX/EDX:EAX中)。所以,使用除法指令常要擴(kuò)展被除數(shù)長度。擴(kuò)展時(shí)無符號(hào)數(shù)一般用:MOVZXAX,ALMOVDX,0MOVEDX,0有符號(hào)數(shù)一般用:CBW/CWD/CDQ4.2通用整數(shù)指令及應(yīng)用(3)數(shù)據(jù)寬度變換指令格式:CBW/CWD/CWDE/CDQ功能:用于將源操作數(shù)的寬度加倍,又稱為符號(hào)位擴(kuò)展指令CBW;AL帶符號(hào)擴(kuò)展→AXCWD;AX帶符號(hào)擴(kuò)展→DX:AXCWDE;AX帶符號(hào)擴(kuò)展→EAXCDQ;EAX帶符號(hào)擴(kuò)展→EDX:EAX4.2通用整數(shù)指令及應(yīng)用4-49使用說明:CBW指令將AL中的8位有符號(hào)數(shù)帶符號(hào)擴(kuò)展為16位放入AX中。AH中各位取與AL中數(shù)的符號(hào)位相同的值,即對(duì)負(fù)數(shù)進(jìn)行1擴(kuò)展,正數(shù)進(jìn)行0擴(kuò)展。CWD指令將AX中的16位有符號(hào)數(shù)帶符號(hào)擴(kuò)展為32位,擴(kuò)展后的高16位存放在DX中,各位值與AX中符號(hào)位相同,AX值不變。CWDE指令將AX中的16位有符號(hào)數(shù)帶符號(hào)擴(kuò)展為32位存放在EAX中,高16位與原符號(hào)位值相同。4.2通用整數(shù)指令及應(yīng)用4-50使用說明:CDQ指令將EAX中的32位有符號(hào)數(shù)帶符號(hào)擴(kuò)展為64位數(shù),擴(kuò)展后的高32位存放在EDX中,且都與原符號(hào)位值相同。數(shù)據(jù)寬度變換指令對(duì)標(biāo)志位無影響。該類指令常在有符號(hào)數(shù)除法運(yùn)算中,用于擴(kuò)展被除數(shù)的位數(shù)。4.2通用整數(shù)指令及應(yīng)用4-51例4.10將例4.9中的被除數(shù)和除數(shù)都看作是有符號(hào)字節(jié)數(shù),則要完成相同的功能,該如何修改程序。4.2通用整數(shù)指令及應(yīng)用改動(dòng)有兩點(diǎn),一個(gè)是使用有符號(hào)數(shù)的除法指令,另一個(gè)是被除數(shù)長度擴(kuò)展應(yīng)用CBW。程序如下:MOVAL,NUMX;將地址NUMX內(nèi)的字節(jié)數(shù)據(jù),取出傳;送給AL寄存器CBW;擴(kuò)展有符號(hào)的被除數(shù)為字?jǐn)?shù)據(jù)IDIVNUMY;用寄存器AX中的數(shù)據(jù)除以NUMYMOVREZULT,AL;將商存入REZULTMOVADDI,AH;將余數(shù)存入ADDI4-52
MOVAX,a①;a×b在CX:BX中②③MOVAX,c④;c在DX:AX中⑤;a×b+c在DX:AX中⑥⑦;(a×b+c)/a,商存入S⑧IMULbMOVCX,DXMOVBX,AXCWDADDAX,BXADCDX,CXIDIVaMOVS,AX
例4.11
下列程序段完成S=(a×b+c)/a的運(yùn)算,其中變量a、b、c和S均為帶符號(hào)的字?jǐn)?shù)據(jù),結(jié)果的商存入S,余數(shù)則不計(jì),填空完成下列程序。4.2通用整數(shù)指令及應(yīng)用4-53(4)BCD調(diào)整指令
格式:AAA∕AAS∕AAM∕AAD∕DAA∕DAS功能:AAA/AAS:
未組合BCD加法/減法調(diào)整指令,隱含操作數(shù)為AL。AAM:
未組合BCD乘法調(diào)整指令,隱含操作數(shù)AX、AH、AL。將AX中乘積調(diào)整為兩個(gè)未組合BCD數(shù)存于AH和AL。DAA/DAS:
組合BCD加法/減法調(diào)整指令,隱含操作數(shù)為AL。AAD:調(diào)整除法運(yùn)算前AX中的被除數(shù)內(nèi)容。操作:(AH)×10+(AL)→AX4.2通用整數(shù)指令及應(yīng)用◆BCD調(diào)整指令說明:DAA/DAS、AAA/AAS隱含的操作寄存器是AL,所以BCD碼加法/減法只能用累加器AL為目的操作數(shù)的加法/減法指令,且加法/減法指令后要跟調(diào)整指令。多字節(jié)、字和雙字BCD加法/減法只能用帶進(jìn)位/借位的字節(jié)加法/減法指令實(shí)現(xiàn)。ASCII碼數(shù)的運(yùn)算與非壓縮BCD碼數(shù)的運(yùn)算基本相同,但要保持結(jié)果仍為ASCII碼,則需轉(zhuǎn)換。4.2通用整數(shù)指令及應(yīng)用4-54◆BCD調(diào)整指令說明:AAM隱含的操作寄存器是AX,要跟在MUL指令之后AAD指令的功能不是將除法后的結(jié)果調(diào)整為BCD碼,而是在除法前將AX保存的兩位非壓縮BCD數(shù)調(diào)整為二進(jìn)制數(shù)。該指令要放在DIV指令之前。4.2通用整數(shù)指令及應(yīng)用4-554-56例4.12解:MOVAL,BYTEPTRXADDAL,BYTEPTRY;低位相加
DAA;BCD碼調(diào)整MOVBYTEPTRX,AL;保存低位結(jié)果MOVAL,BYTEPTRX[1];取字變量的高字節(jié)ADCAL,BYTEPTRY[1];高位相加
DAAMOVBYTEPTRX[1],AL兩個(gè)4位壓縮BCD碼定義如下:
XDW9F11H
YDW19F9H
請(qǐng)編寫計(jì)算X+Y的程序段。4.2通用整數(shù)指令及應(yīng)用功能:分別按位進(jìn)行邏輯“與”、“或”、“異或”、“測試”和“非”?!舾袷剑篈ND
OR
XOR
TEST 目標(biāo)操作數(shù),源操作數(shù)
REG,REG/MEM/IMMMEM,REG/IMM
NOT目標(biāo)操作數(shù)
REG/MEM4-573.邏輯運(yùn)算與移位指令⑴邏輯運(yùn)算指令4.2通用整數(shù)指令及應(yīng)用4-58使用說明:②編程時(shí)要根據(jù)操作合理選用指令,一般:
●對(duì)某些二進(jìn)制位‘清零’用邏輯‘與’指令A(yù)ND;●對(duì)某些二進(jìn)制位‘置位’用邏輯‘或’指令OR;●對(duì)某些二進(jìn)制位‘求反’用邏輯‘異或’指令
XOR,全部位‘求反’用邏輯‘非’指令NOT。①邏輯運(yùn)算指令除NOT指令外,都影響標(biāo)志寄存器的狀態(tài)標(biāo)志位,且邏輯運(yùn)算后進(jìn)位標(biāo)志CF一定為0,所以邏輯運(yùn)算指令常用于清0和清進(jìn)位。4.2通用整數(shù)指令及應(yīng)用③AND指令與TEST指令的相同之處是都執(zhí)行按位“與”操作,兩者執(zhí)行后對(duì)標(biāo)志寄存器中狀態(tài)標(biāo)志位的影響相同,不同之處是前者改變目標(biāo)操作數(shù)的值,而后者并不改變目標(biāo)操作數(shù)的值。所以TEST指令與CMP指令的用法類似,用于產(chǎn)生按位測試的條件碼。4-594.2通用整數(shù)指令及應(yīng)用使用說明:4-60例4.13IBMPC打印機(jī)狀態(tài)口為210H,D7位為打印機(jī)“忙”狀態(tài)標(biāo)志,D0=0表示打印機(jī)忙,CPU要等待,否則允許打印輸出。編寫判斷打印機(jī)狀態(tài)的程序段程序段如下:MOVDX,210H;取打印機(jī)狀態(tài)口BUSY:INAL,DX;讀打印機(jī)狀態(tài)TESTAL,01H;測試忙狀態(tài)D0,產(chǎn)生狀態(tài)標(biāo)志JZBUSY;D0=0,表示打印機(jī)忙,等待;打印4.2通用整數(shù)指令及應(yīng)用4-61⑵移位指令
移位指令包括:算術(shù)移位指令(SAL/SAR)邏輯移位指令(SHL/SHR)循環(huán)移位指令(ROR/ROL/RCR/RCL)雙精度移位指令(SHLD/SHRD)4.2通用整數(shù)指令及應(yīng)用4-62使用說明:移位指令的源操作數(shù)采用立即數(shù)尋址時(shí),8086指令只能為1,80486則為8位,實(shí)際使用低5位。移位指令常用于二進(jìn)制數(shù)的倍乘和倍除,即算術(shù)/邏輯移n位,相當(dāng)于把二進(jìn)制數(shù)乘以或除以2n。4.2通用整數(shù)指令及應(yīng)用4-63要注意算術(shù)右移(SAR)與邏輯右移(SHR)的區(qū)別:
前者在符號(hào)位和數(shù)值位依次右移的同時(shí),用符號(hào)
位充填符號(hào)位,而后者用0充填符號(hào)位。所以,有符號(hào)和無符號(hào)數(shù)倍乘用SHL/SAL均可,但倍除時(shí),有符號(hào)數(shù)用SAR和無符號(hào)數(shù)用SHR。移位指令也常用于循環(huán)控制,如邏輯尺控制循環(huán)。4.2通用整數(shù)指令及應(yīng)用使用說明:
例4.14試編寫用移位和加法指令完成如下計(jì)算的程序段:(EAX)×9/4解:
(EAX)×9/4=[(EAX)×8+(EAX)]/4MOVEBX,EAX;保存EAXSAL/SHLEAX,3;(EAX)×8→EAXADD EAX,EBX;(EAX)×8+(EAX)→EAXSAR/SHR
EAX,2;(EAX)×9/4→EAX4.2通用整數(shù)指令及應(yīng)用4-644.串操作指令串傳送指令MOVSB/MOVSW/MOVSD串裝入指令LODSB/LODSW/LODSD串存儲(chǔ)指令STOSB/STOSW/STOSD串比較指令CMPSB/CMPSW/CMPSD串掃描指令SCASB/SCASW/SCASD串輸入指令I(lǐng)NSB/INSW/INSD串輸出指令OUTSB/OUTSW/OUTSD串操作指令是指用于對(duì)存儲(chǔ)器中字節(jié)串、字串和雙字串進(jìn)行操作的指令,包括:
數(shù)據(jù)傳送類算術(shù)運(yùn)算類邏輯運(yùn)算與移位類串操作類控制轉(zhuǎn)移類處理器控制4.2通用整數(shù)指令及應(yīng)用4-654-66串操作約定:●用DS:(E)SI尋址源串,允許段超越;●用ES:(E)DI尋址目的串,但ES段不能超越;●由DF標(biāo)志位決定(E)SI,(E)DI指針增減:
DF=0,遞增;DF=1,遞減;●由串長度決定指針增/減量大小;●帶重復(fù)前綴時(shí),用(E)CX作重復(fù)計(jì)數(shù)器。4.2通用整數(shù)指令及應(yīng)用⑴串傳送指令
格式:
MOVSB/MOVSW/MOVSDMOVS 目的串,源串
MEM,MEM操作:將DS:[(E)SI]所指的源串中的一個(gè)字節(jié)、字或雙字傳送到ES:[(E)DI]指的目的串中,然后,按DF指示和操作數(shù)長度修改(E)SI,(E)DI指針,即:[ES:(E)DI]←([DS:(E)SI])(E)SI←((E)SI)±1/2/4;修改源指針(E)DI←((E)DI)±1/2/4;修改目的指針4.2通用整數(shù)指令及應(yīng)用4-67說明:應(yīng)用:用于數(shù)據(jù)塊傳送該指令允許加重復(fù)前綴REP。即:
REPMOVSB/MOVSW/MOVSD此時(shí),由(E)CX控制串傳送指令MOVS的執(zhí)行次數(shù)。相當(dāng)于指令序列:AGAIN:MOVSB/MOVSW/MOVSDLOOPAGAIN4.2通用整數(shù)指令及應(yīng)用4-684-69例4.15欲將數(shù)據(jù)段中自FIRST開始的100個(gè)雙字?jǐn)?shù)據(jù)搬移到附加段中以SECOND開始的數(shù)據(jù)區(qū)中,用基本串傳送指令實(shí)現(xiàn),程序如下:LEAESI,F(xiàn)IRSTLEAEDI,SECONDMOVECX,100CLDDONE:MOVSD;或MOVSSECOND,F(xiàn)IRSTLOOPDONE4.2通用整數(shù)指令及應(yīng)用4-70可用帶重復(fù)前綴的串傳送指令實(shí)現(xiàn),程序如下: LEAESI,F(xiàn)IRST LEAEDI,SECOND MOVECX,100 CLD REPMOVSD4.2通用整數(shù)指令及應(yīng)用格式:
LODSB/LODSW/LODSDLODS 源串
MEM說明:
允許加重復(fù)前綴REP。操作:
([DS:(E)SI])→AL/AX/EAX
按DF指示和操作數(shù)長度修改(E)SI指針應(yīng)用:用于取數(shù)據(jù)塊中元素值(2)串裝入指令4.2通用整數(shù)指令及應(yīng)用4-714-72(3)串存儲(chǔ)器指令
格式:
STOSB/STOSW/STOSD STOS 目的串
MEM
說明:允許加重復(fù)前綴REP。操作:
AL/AX/EAX→([ES:(E)DI])
按DF指示和操作數(shù)長度修改(E)DI指針應(yīng)用:用于數(shù)據(jù)塊初始化。LODS和STOS結(jié)合常用于數(shù)據(jù)塊傳送。4.2通用整數(shù)指令及應(yīng)用4-73(4)串掃描指令
格式:
SCASB/SCASW/SCASD SCAS 目的串
MEM 操作:(AL/AX/EAX)-([ES:(E)DI]),影響標(biāo)志,但
不改變目的串內(nèi)容。按DF指示和操作數(shù)長度修改(E)DI指針。4.2通用整數(shù)指令及應(yīng)用說明:允許加重復(fù)前綴REPE或REPNE。掃描次數(shù)由(E)CX指定。重復(fù)條件:
REPE:IF((E)CX)≠0ANDZF=1THEN重復(fù)串掃描
REPNE:IF((E)CX)≠0ANDZF=0THEN重復(fù)串掃描應(yīng)用:用于在串?dāng)?shù)據(jù)中查找關(guān)鍵字。4.2通用整數(shù)指令及應(yīng)用4-744-75(5)串比較指令格式:
CMPSB/CMPSW/CMPSDCMPS 源串,目的串
MEM ,MEM說明:允許加重復(fù)前綴REPE或REPNE。操作:([DS:(E)SI])-([ES:(E)DI]),影響標(biāo)
志,但不改變?cè)创湍康拇畠?nèi)容。按DF指示和
操作數(shù)長度修改(E)DI、(E)SI指針應(yīng)用:常用于比較兩個(gè)串?dāng)?shù)據(jù)是否匹配。4.2通用整數(shù)指令及應(yīng)用包括以下5種指令:無條件轉(zhuǎn)移指令(JMP)過程調(diào)用/返回指令(CALL/RET)條件轉(zhuǎn)移指令(JCC)
循環(huán)控制指令(LOOP)中斷指令(INT)無條件向目標(biāo)地址轉(zhuǎn)移,可分為段內(nèi)、段間轉(zhuǎn)移,段內(nèi)、段間轉(zhuǎn)移又可分別分為直接和間接轉(zhuǎn)移。實(shí)現(xiàn)子程序調(diào)用或返回,也可歸入無條件轉(zhuǎn)移指令中。根據(jù)指令執(zhí)行后標(biāo)志寄存器的狀態(tài)進(jìn)行轉(zhuǎn)移,通常和CMP或TEST指令組合使用??刂蒲h(huán)程序的循環(huán),實(shí)質(zhì)上也是條件轉(zhuǎn)移指令,在CX(ECX)中預(yù)置循環(huán)次數(shù)。產(chǎn)生一個(gè)由8位立即數(shù)指定中斷號(hào)的軟中斷和處理溢出中斷。這類指令的共同特點(diǎn)是可改變程序的正常執(zhí)行順序,使之轉(zhuǎn)移。而改變程序的執(zhí)行順序,本質(zhì)上就是要改變CS:(E)IP的內(nèi)容這類指令對(duì)標(biāo)志位無影響。5.控制轉(zhuǎn)移指令
數(shù)據(jù)傳送類算術(shù)運(yùn)算類邏輯運(yùn)算與移位類串操作類控制轉(zhuǎn)移類處理器控制4.2通用整數(shù)指令及應(yīng)用4-764-77直接轉(zhuǎn)移間接轉(zhuǎn)移控制轉(zhuǎn)移指令使用說明:(1)按目標(biāo)地址的尋址方式,轉(zhuǎn)移可分為:4.2通用整數(shù)指令及應(yīng)用直接轉(zhuǎn)移
此時(shí),指令中直接給出轉(zhuǎn)移的目標(biāo)地址。又分為:
◆直接短(SHORT)轉(zhuǎn)移
◆段內(nèi)(NEAR)直接轉(zhuǎn)移
◆段間(FAR)直接轉(zhuǎn)移
段內(nèi)直接短轉(zhuǎn)移和段內(nèi)直接轉(zhuǎn)移又稱為相對(duì)轉(zhuǎn)移。即轉(zhuǎn)移的目標(biāo)地址為當(dāng)時(shí)的(E)IP地址加上一8位位移量(短轉(zhuǎn)移)、16位位移量(16位尋址)或32位位移量(32位尋址),即: ((E)IP)+DISP→(E)IP4.2通用整數(shù)指令及應(yīng)用4-784-79?間接轉(zhuǎn)移●寄存器間接轉(zhuǎn)移。僅有段內(nèi)轉(zhuǎn)移。●存儲(chǔ)器間接轉(zhuǎn)移。分段內(nèi)和段間轉(zhuǎn)移。
此時(shí),指令中給出的寄存器或存儲(chǔ)單元中間接存放著轉(zhuǎn)移的目標(biāo)地址。又分為:4.2通用整數(shù)指令及應(yīng)用(2)8086/8088的條件轉(zhuǎn)移指令都為短轉(zhuǎn)移,80386/80486則推廣到段內(nèi)轉(zhuǎn)移。
(3)CALL指令與JMP指令的不同之處:CALL指令執(zhí)行時(shí),增加了保存斷點(diǎn)地址進(jìn)棧的操作。(4)循環(huán)指令只能是短轉(zhuǎn)移。
4.2通用整數(shù)指令及應(yīng)用4-804-81
例4.17
指令JMPNEARPTRPROG在程序代碼段中的偏移地址為2013H(這是該指令第一字節(jié)的偏移地址),組成該指令的三字節(jié)機(jī)器碼為E9H、12H、34H(其中E9H為操作碼)。該指令執(zhí)行后,程序?qū)⑥D(zhuǎn)去何處?4.2通用整數(shù)指令及應(yīng)用
解:該指令執(zhí)行過程如下:5428H3412H位移量程序轉(zhuǎn)移到當(dāng)前代碼段中偏移地址為5428H的單元執(zhí)行E9H12H34H存儲(chǔ)器指令代碼段2013HIP5428H+IP2016H2016H4.2通用整數(shù)指令及應(yīng)用4-824.3匯編語言程序概述4.3.2偽指令語句源程序結(jié)構(gòu)4.3.3匯編語言語句格式4.3.1匯編語言程序的特點(diǎn)4-834.3匯編語言程序概述4.3.1匯編語言程序的特點(diǎn)匯編語言是一種介于機(jī)器語言和高級(jí)語言之間的、采用助記符表示的程序設(shè)計(jì)語言,它既不像機(jī)器語言那樣直接使用計(jì)算機(jī)所能理解和識(shí)別的二進(jìn)制代碼,也不像高級(jí)語言那樣直接面對(duì)用戶。實(shí)質(zhì)上仍然是一種面向機(jī)器的語言。匯編語言用助記符來表示指令的功能,用標(biāo)號(hào)或符號(hào)代表地址、常量或變量。用匯編語言編寫的程序要比與其等效的高級(jí)語言生成的目標(biāo)代碼精簡得多,占內(nèi)存少,執(zhí)行速度快。但用匯編語言編寫和調(diào)試程序的周期較長,程序設(shè)計(jì)的技巧性強(qiáng),對(duì)程序員的要求高,既要熟悉計(jì)算機(jī)的指令系統(tǒng)也要熟悉計(jì)算機(jī)的硬件結(jié)構(gòu)。4-84用匯編語言編寫的源程序稱為匯編語言源程序,在提交計(jì)算機(jī)執(zhí)行之前也需要翻譯成機(jī)器指令(目標(biāo)程序),這個(gè)過程叫匯編。完成匯編的程序則稱為匯編程序(Assembler)。匯編程序無法區(qū)分源程序中的符號(hào)是數(shù)據(jù)還是地址,也無法識(shí)別數(shù)據(jù)的類型,還搞不清源程序的分段情況等。匯編語言為了解決這些問題,專門設(shè)置了偽指令和算符。匯編時(shí),偽指令和算符只為匯編程序?qū)⒎?hào)指令翻譯成機(jī)器指令提供輔助說明信息,它們并不生成對(duì)應(yīng)的機(jī)器指令代碼,匯編工作結(jié)束后他們就不存在了。4.3匯編語言程序概述4-854.3.2匯編語言源程序結(jié)構(gòu)80X86/Pentium系列MPU匯編語言都是以邏輯段為基礎(chǔ),按段的概念來組織代碼和數(shù)據(jù)的。因此,源程序結(jié)構(gòu)與邏輯段的定義方法密切相關(guān),而宏匯編語言MASM5.0以上的版本中,邏輯段既可用完整段定義,又可用簡化段定義。4.3匯編語言程序概述4-861.標(biāo)準(zhǔn)的單模塊源程序框架[.586] DATASEGMENT[USE16/USE32] ;定義數(shù)據(jù)段
;數(shù)據(jù)定義偽指令序列 DATAENDS
STACKSEGMENT[USE16/USE32]STACK ;定義堆棧段
;數(shù)據(jù)定義偽指令序列 STACKENDS
CODESEGMENT[USE16/USE32] ;定義代碼段 ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA
START:MOVAX,DATA ;取數(shù)據(jù)段基址 MOVDS,AX ;建立DS的可尋址性 MOVES,AX ;建立ES段的可尋址性
;核心程序段 MOVAH,4CH ;返回DOS操作系統(tǒng) INT21H CODEENDS
ENDSTART⑴一個(gè)源程序由若干邏輯段組成。一般一個(gè)源程序具有數(shù)據(jù)段、附加數(shù)據(jù)段、堆棧段和代碼段;但只有代碼段是必不可少的。
⑵采用完整段定義時(shí),對(duì)程序中定義的邏輯段,要說明邏輯段與段寄存器的尋址關(guān)系。ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA⑶對(duì)數(shù)據(jù)段(有時(shí)還有堆棧段),程序中要包含初始化段寄存器的語句。MOVAX,DATAMOVDS,AXMOVES,AX程序中要包含返回DOS的語句。MOVAH,4CHINT21H⑸源程序(模塊)以END偽指令結(jié)束
ENDSTART4.3匯編語言程序概述4-874.3.3匯編語言語句格式1.語句種類●指令語句是可執(zhí)行語句,由硬件(CPU)完成其功能,匯編時(shí)產(chǎn)生目標(biāo)代碼?!駛沃噶钫Z句
不可執(zhí)行語句,其功能由相應(yīng)軟件完成,不產(chǎn)生目標(biāo)代碼?!窈曛噶钫Z句
用戶定義的新指令,匯編時(shí)產(chǎn)生相應(yīng)的目標(biāo)代碼。
4.3匯編語言程序概述4-88指令語句:[標(biāo)號(hào):]助記符[操作數(shù)][;注釋]偽指令語句:[名字]定義符[操作數(shù)][;注釋]●標(biāo)號(hào)和名字——分別是給指令單元和偽指令起的符號(hào)名稱,統(tǒng)稱為標(biāo)識(shí)符。(注意組成的語法規(guī)則)●助記符和定義符——分別用于規(guī)定指令語句的操作性質(zhì)和偽指令語句的偽操作功能,統(tǒng)稱操作符。2.語句格式4.3匯編語言程序概述4-89●操作數(shù)
操作數(shù)允許有多個(gè),這時(shí)各操作數(shù)之間要用逗號(hào)“,”隔開。偽指令語句中操作數(shù)的格式和含義則隨偽操作命令不同而不同,有時(shí)是常量或數(shù)值表達(dá)式,有時(shí)是一般意義的符號(hào)
(如變量名、標(biāo)號(hào)名、常數(shù)符號(hào)等),有時(shí)是具有特殊意義的符號(hào)(如指令助記符、寄存器名等)。
指令語句中的操作數(shù)提供該指令的操作對(duì)象,并說明要處理的數(shù)據(jù)存放在什么位置以及如何訪問它,它可以是常量操作數(shù)、寄存器操作數(shù)、存儲(chǔ)器操作數(shù)和表達(dá)式。4.3匯編語言程序概述4-904.4.1方式選擇偽指令4.4.2邏輯段定義偽指令4.4.3數(shù)據(jù)定義偽指令4.4.4模塊定義偽指令4.4.5過程與宏定義偽指令4.4常用偽指令語句4.4常用偽指令語句4-914.4.1方式選擇偽指令方式選擇偽指令用于通知匯編程序,當(dāng)前的源程序指令是哪一種CPU指令,經(jīng)過匯編鏈接之后生成的目標(biāo)程序在哪一種CPU機(jī)型上運(yùn)行。不屬于選定CPU的指令均為非法指令。所以,方式選擇偽指令本質(zhì)上也就是指令集選擇偽指令。通常,方式選擇偽指令放在程序的頭部,作為源程序的第一條語句。缺省時(shí)默認(rèn)8086指令集。4.4常用偽指令語句4-924.4.2邏輯段定義偽指令1.完整段定義偽指令80X86/Pentium系列微處理器匯編語言有兩種邏輯段定義方法:完整段和簡化段定義采用完整段定義偽指令可具體控制匯編程序(MASM)和鏈接程序(LINK)在內(nèi)存中組織代碼和數(shù)據(jù)的方式。主要包括段定義語句和段寄存器說明語句。
4.4常用偽指令語句4-934.4常用偽指令語句3.3.2邏輯段定義偽指令格式:段名SEGMENT[定位類型][,組合類型][,字長選擇][,‘類別’]段體 ;由指令、偽指令和宏指令語句組成段名ENDS
⑴段定義語句
說明:
(1)SEGMENT/ENDS是一對(duì)段定義語句,一個(gè)邏輯段從SEGMENT語句開始,到ENDS語句結(jié)束。(2)段名是用戶定義的段的標(biāo)識(shí)符,用于指明段的基址。(3)4個(gè)可選參數(shù)用于為源程序的匯編、連接提供必要的信息,特別是模塊化程序,各個(gè)模塊如何定位,彼此之間如何連接,將較多地涉及到定位類型和組合類型的選擇。指定段起點(diǎn)的邊界類型:BYTE(字節(jié))WORD(字)DWORD(雙字)PARA(節(jié))PAGE(頁)
定位類型告訴鏈接程序本段與其它模塊中同名段的組合連接關(guān)系:PUBLIC連接到同一個(gè)物理段中STACK連接到同一個(gè)物理堆棧段中,并給SS:ESP賦值COMMON產(chǎn)生一個(gè)覆蓋段。MEMORYAT表達(dá)式
組合類型定義段中使用的偏移地址和寄存器的字長USE16──表示該段字長為16位USE32──表示該段字長為32位字長選擇4-94⑵段寄存器說明語句
格式:ASSUME段寄存器:段名[,段寄存器:段名,…]功能:說明源程序中定義的段由那個(gè)段寄存器去尋址。說明:
⑴CS只能用于包含有程序的段,反之含有程序的段也只能以CS作為段寄存器。SS也一樣,只能與堆棧段對(duì)應(yīng)。⑵CS所對(duì)應(yīng)的段名必須在該語句之前有定義。⑶該語句是說明性語句。4.4常用偽指令語句4-95簡化段有利于實(shí)現(xiàn)匯編語言程序模塊與Microsoft高級(jí)語言程序模塊的連接,它可以由操作系統(tǒng)自動(dòng)安排段序,自動(dòng)保證名字定義的一致性。但是命令文件(.COM)的編程不能使用簡化段定義。⑴段次序語句(DOSSEG)⑵內(nèi)存模式語句(.MODEL)⑶段語句
簡化段定義有三種語句:2.簡化段定義偽指令
4.4常用偽指令語句4-964-974.4常用偽指令語句
使用簡化段定義的獨(dú)立匯編語言源程序框架:
DOSSEG .MODELSMALL .STACK[長度] .DATA
…;數(shù)據(jù)語句 .CODE啟動(dòng)標(biāo)號(hào):MOVAX,@DATA;或MOVAX,DGROUP MOVDS,AX
…;可執(zhí)行語句 MOVAH,4CH;返回DOS INT21H END啟動(dòng)標(biāo)號(hào)段語句.CODE.DATA.STACKDOSSEG段次序語句:規(guī)定各邏輯段在內(nèi)存的順序按DOS段次序約定排列。
.MODELSMALL內(nèi)存模式語句:用于指定數(shù)據(jù)和代碼允許使用的長度。4.4.3數(shù)據(jù)定義偽指令格式:賦值語句:符號(hào)名EQU表達(dá)式功能:都是用符號(hào)名代替表達(dá)式的值。但賦值語句定義的符號(hào)名不能重新定義,而等號(hào)語句允許。1.符號(hào)定義偽指令等號(hào)語句:符號(hào)名=表達(dá)式
4.4常用偽指令語句4-98
賦值語句與等號(hào)語句舉例。賦值語句: XEQU50 YEQUX+10 COUNTEQU$-ARRY 等號(hào)語句: CON=5 BASE=200H
BASE=BASE+10H ;重新定義BASE4.4常用偽指令語句4-992.數(shù)據(jù)定義偽指令偽指令格式:DBDWDDDFDQDT數(shù)據(jù)項(xiàng)[,數(shù)據(jù)項(xiàng),…,數(shù)據(jù)項(xiàng)][變量名]功能:是為數(shù)據(jù)項(xiàng)或項(xiàng)表分配存儲(chǔ)空間,給它們賦初值,并用一個(gè)符號(hào)名(稱為變量)與之相聯(lián)系。8位(字節(jié))16位(字)32位(雙字)48位(長字)64位(四字)80位(十字節(jié))
4.4常用偽指令語句4-100使用說明:⑴給變量賦初值可以是賦確定的值,也可以是賦不確定的值(用“?”表示),還可以是用DUP運(yùn)算符建立的多次拷貝。
4.4常用偽指令語句4-101
⑵使用SEG、OFFSET、TYPE、LENGTH和SIZE運(yùn)算符求變量的各種屬性時(shí),特別要注意:對(duì)LENGTH運(yùn)算符,如果變量是用重復(fù)數(shù)據(jù)操作符DUP說明的,則返回外層DUP給定的值;如果沒有DUP說明,則返回值總是1。對(duì)SIZE運(yùn)算符有:SIZE=TYPE×LENGTH⑶操作符“$”是取地址計(jì)數(shù)器的當(dāng)前值,常用于表達(dá)式定義數(shù)組長度。使用說明:4.4常用偽指令語句4-102
⑷使用DB、DW、DD定義串?dāng)?shù)據(jù)(用‘’定義的字符串)時(shí),允許定義的串長度不同,字符的存放順序也不相同:DB是從左至右順序?yàn)槊總€(gè)字符分配一個(gè)字節(jié)單元;DW是從左至右順序?yàn)槊?個(gè)字符分配一個(gè)字單元,且前面的字符在高字節(jié),串長度不能超過2;DD是從左至右順序?yàn)槊?個(gè)字符分配一個(gè)雙字單元,也是按前面的字符在高字節(jié)順序存放,串長度不能超過4。4.4.5過程與宏定義偽指令過程定義偽指令宏定義偽指令宏和過程的比較4.4常用偽指令語句4-103格式:過程名PROC[屬性]
…
;過程體 [RET]
…
RET
過程名ENDP
說明:②過程允許嵌套調(diào)用,還可以遞歸調(diào)用。③過程與邏輯段也可以相互嵌套,但決不允許過程與段交叉覆蓋。過程又稱為子程序。它是一段必須通過CALL指令調(diào)用才能執(zhí)行的程序段,執(zhí)行完后通過一條RET指令返回原調(diào)用處。過程需先定義才能調(diào)用。
①過程體中必須至少包含一條RET指令,這是過程的出口。但也允許過程有多條RET指令,即過程有多個(gè)出口。1.過程定義偽指令4.4常用偽指令語句4-104宏定義格式:宏名MACRO[形式參數(shù)表]
;宏體 ENDM
說明:宏定義的宏名必須唯一,稱為宏指令。宏指令一經(jīng)定義就可以在源程序的任何地方調(diào)用。相當(dāng)于由用戶給匯編程序提供了一個(gè)新的操作碼。
宏調(diào)用格式:宏名[實(shí)際參數(shù)表]宏的概念與過程很相似,也是用一個(gè)宏名字來代替源程序中經(jīng)常要用到的一個(gè)程序模塊。2.宏定義偽指令
4.4常用偽指令語句4-105使用宏定義和宏調(diào)用時(shí)要注意兩個(gè)問題:對(duì)帶參數(shù)的宏指令,宏調(diào)用時(shí)實(shí)際參數(shù)與形式參數(shù)的類型要一致,以免產(chǎn)生無效調(diào)用。宏調(diào)用是用宏體中定義的指令序列替換宏指令,所以宏體內(nèi)的標(biāo)號(hào)要用LOCAL偽指令說明為局部標(biāo)號(hào),以免多次調(diào)用宏時(shí),發(fā)生標(biāo)號(hào)重復(fù)定義錯(cuò)誤。LOCAL偽指令格式:
LOCAL標(biāo)號(hào)1[,標(biāo)號(hào)2,…]4.4常用偽指令語句4-106解:宏定義如下:
MOVEMACROSARY,DARY
LOCALLP MOVSI,0 MOVCX,100LP:MOVAL,SARY[SI] MOVDARY[SI],AL INCSI LOOPLP ENDM例4.18
定義宏MOVE,其功能是將一個(gè)有100個(gè)字節(jié)元素的數(shù)組搬移到另一個(gè)數(shù)據(jù)區(qū)。進(jìn)行宏調(diào)用:MOVEFIRST,SECOND宏展開如下: MOVSI,0MOVCX,100??0000:MOVAL,F(xiàn)IRST[SI] MOVSECOND[SI],AL INCSI LOOP??00004.4常用偽指令語句4-1073.宏和過程的比較
宏和過程都可簡化源程序的書寫,因而也減少了程序出錯(cuò)的可能性。但兩者使用上也有區(qū)別:(1)宏操作可以直接傳遞和接收參數(shù),而過程不能直接帶參數(shù)。當(dāng)過程之間需要傳遞參數(shù)時(shí),必須通過堆棧、寄存器或存儲(chǔ)器來進(jìn)行,編程比宏要復(fù)雜。所以,宏匯編適合于代碼較短,傳送參數(shù)較多的子功能段使用,子程序適合于代碼較長,調(diào)用比較頻繁的子功能段使用。(3)引入宏操作并不會(huì)在執(zhí)行目標(biāo)代碼時(shí)增加額外的時(shí)間開銷,但過程調(diào)用由于要保護(hù)和恢復(fù)現(xiàn)場及斷點(diǎn),因此會(huì)延長目標(biāo)程序的執(zhí)行時(shí)間。(2)子程序不管被調(diào)用多少次它都只被匯編一次,即有唯一的一段目標(biāo)代碼;而宏指令則調(diào)用多少次就匯編多少次,每次調(diào)用都要在程序中展開并保留宏體中的每一行。4.4常用偽指令語句4-1084.5匯編語言編程入門4.5.1匯編語言程序的開發(fā)過程4.5.2基本結(jié)構(gòu)程序設(shè)計(jì)4.5.3子程序設(shè)計(jì)與調(diào)用4.5.4DOS/BIOS功能調(diào)用4-1094.5.1匯編語言程序的開發(fā)過程
與其它程序設(shè)計(jì)語言一樣,匯編語言程序的開發(fā)過程可歸結(jié)為:就需求分析、模塊劃分和算法確定等工作而言,各種程序設(shè)計(jì)語言是類似的,均可按軟件工程的方法進(jìn)行,但編程和調(diào)試則因程序設(shè)計(jì)語言而異。
需求分析根據(jù)需求和規(guī)模等因素劃分模塊確定各功能模塊的求解算法、并定義所需的數(shù)據(jù)結(jié)構(gòu)進(jìn)行編程和調(diào)試4.5匯編語言編程入門4-110對(duì)匯編語言而言,根據(jù)數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行編碼到形成可用程序的過程如下:
需求分析、數(shù)據(jù)結(jié)構(gòu)和算法匯編語言源程序文件*.ASM目標(biāo)代碼程序文件*.OBJ可執(zhí)行程序文件*.EXE可用程序連接編輯匯編調(diào)試4.5匯編語言編程入門4-1114.5.2基本結(jié)構(gòu)程序設(shè)計(jì)程序的基本結(jié)構(gòu)形式有三種:●順序結(jié)構(gòu)●分支結(jié)構(gòu)●循環(huán)結(jié)構(gòu)理論上,三種基本結(jié)構(gòu)是完備的,即任何功能的程序都可由順序、分支和循環(huán)三種結(jié)構(gòu)實(shí)現(xiàn)。4.5匯編語言編程入門4-1121.順序程序設(shè)計(jì)●在實(shí)際應(yīng)用中,純粹用順序結(jié)構(gòu)編寫的完整程序很少見,但是在程序段中它卻是大量的存在。所以掌握它是編寫復(fù)雜應(yīng)用程序的基礎(chǔ)?!樞虺绦蛴址Q直線程序。●其特點(diǎn)是順序執(zhí)行的,無分支,無循環(huán),也無轉(zhuǎn)移,只作直線運(yùn)行。4.5匯編語言編程入門4-1132.分支程序設(shè)計(jì)在許多實(shí)際問題中,往往需要根據(jù)不同的情況和給定的條件做出不同的處理。要設(shè)計(jì)這樣的程序,必須事先把各種可能出現(xiàn)的情況及處理方法都編寫在程序中,以后計(jì)算機(jī)運(yùn)行程序時(shí),可自動(dòng)根據(jù)運(yùn)行的結(jié)果做出判斷,有條件地選擇執(zhí)行不同的程序段,按這種要求編寫的程序稱為分支程序。4.5匯編語言編程入門4-114分支1條件結(jié)束開始YN分支2(b)完全分支結(jié)構(gòu)分支程序條件結(jié)束開始YN(a)不完全分支結(jié)構(gòu)分支1結(jié)束開始條件ii=1i=n分支2分支n…i=2(c)多分支結(jié)構(gòu)分支程序的結(jié)構(gòu)有三種形式:
IF條件THEN分支程序IF條件THEN分支1ELSE分支24.5匯編語言編程入門4-115⑴利用比較與條件轉(zhuǎn)移指令實(shí)現(xiàn)分支
程序如下:
DATA SEGMENT
VAR1DB10HVAR2DB09HABUFDB?BBUFDB?DATA ENDS4.5匯編語言編程入門4-116例19已知兩個(gè)整數(shù)字節(jié)變量VAR1和VAR2,試編寫完成下列操作的程序:(1)若兩個(gè)數(shù)中只有一個(gè)是奇數(shù),則將奇數(shù)存入ABUF單元,偶數(shù)存入BBUF單元。(2)若兩個(gè)數(shù)均為奇數(shù),則兩數(shù)分別加1,并存回原變量處。(3)若兩個(gè)數(shù)均為偶數(shù),則兩變量不變。
CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOVAL,ABUFMOVBL,BBUFXORAL,BLTESTAL,01H;測試是否為同類JZSAME;是同類,轉(zhuǎn)CLASSTESEBL,01H;不是同類,測試B是否為偶數(shù)JZEXIT;B是偶數(shù),滿足要求(1),轉(zhuǎn)EXITXCHGBL,ABUF;B不是偶數(shù),按要求(1),交換兩數(shù)MOVBBUF,BLJMPEXIT;轉(zhuǎn)EXITSAME:TESTBL,01H;同類時(shí),測試B是否為偶數(shù)JZEXIT;B是偶數(shù),滿足要求(3),轉(zhuǎn)EXITINCABUF;B不是偶數(shù),按要求(2),兩數(shù)加1 CODE ENDS END START4.5匯編語言編程入門4-117⑵利用跳轉(zhuǎn)表實(shí)現(xiàn)分支
——適于多分支結(jié)構(gòu)。有三種跳轉(zhuǎn)表:
BASE
關(guān)鍵字0ADR0
M
(c)根據(jù)關(guān)鍵字分支關(guān)鍵字nADRn關(guān)鍵字1ADR1+3+3nBASEJMP
JMPM
(b)根據(jù)表內(nèi)指令分支JMP+3n+3BASEADR0
M
(b)根據(jù)表內(nèi)地址分支ADRnADR1+2n+24.5匯編語言編程入門4-118使用跳轉(zhuǎn)表實(shí)現(xiàn)分支時(shí),要特別注意表內(nèi)地址分支和表內(nèi)指令分支兩種結(jié)構(gòu)跳轉(zhuǎn)表的定義方法和正確的尋址方式。表內(nèi)地址分支在數(shù)據(jù)段定義跳轉(zhuǎn)表,用存儲(chǔ)器間接尋址;表內(nèi)指令分支在代碼段定義跳轉(zhuǎn)表,用寄存器間接尋址。4.5匯編語言編程入門4-119解:這是一個(gè)多分支結(jié)構(gòu)程序,適合于用跳轉(zhuǎn)表實(shí)現(xiàn)。假設(shè)用表內(nèi)地址分支實(shí)現(xiàn),此時(shí),跳轉(zhuǎn)表在數(shù)據(jù)段定義,轉(zhuǎn)移要用存儲(chǔ)器間接尋址的跳轉(zhuǎn)指令。程序如下:
例4.20設(shè)某控制程序可完成8種產(chǎn)品的加工,每種加工程序?qū)?yīng)一個(gè)數(shù)字(1~8)?,F(xiàn)要求根據(jù)輸入的值去加工相應(yīng)產(chǎn)品。假設(shè)8種加工程序段與主程序在同一代碼段中。4.5匯編語言編程入門4-120例4.20表內(nèi)地址分支程序
.486DATASEGMENT‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’
BASEDDSBR1,SBR2,SBR3,SBR4DDSBR5,SBR6,SBR7,SBR8DATAENDSCODESEGMENT‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;輸入數(shù)字序號(hào)INT21HCMPAL,‘1’JBERRCMPAL,‘8’JAERRSUBAL,‘1’
ANDEAX,0000000FH
JMPBASE[EAX*4]SBR1:…
SBR2:…
SBR8:…
ERR:CMPAL,‘E’JZEXITMOVDX,OFFSETDISPMOVAH,09HINT21HJMPINPUTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART此題也可用表內(nèi)指令分支實(shí)現(xiàn)。這時(shí),跳轉(zhuǎn)表要在代碼段定義,轉(zhuǎn)移則要用寄存器間接尋址的跳轉(zhuǎn)指令。程序如下:4.5匯編語言編程入門4-121
.486DATASEGMENTUSE16‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’DATAENDSCODESEGMENTUSE16‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)機(jī)構(gòu)指標(biāo)課件教育大廈
- 壞疽的臨床護(hù)理
- B超檢查的健康宣教
- 班會(huì)課件之班級(jí)建設(shè)系列學(xué)生,我想對(duì)你說
- 《記金華的雙龍洞》課件
- 《教育與人》課件
- 《電工電子技術(shù)》課件-第1章
- 《信號(hào)發(fā)生電路設(shè)計(jì)》課件
- 創(chuàng)傷性骨髓炎的健康宣教
- 兒童分離性焦慮障礙的健康宣教
- 弱電系統(tǒng)施工方案(完整版)
- 設(shè)計(jì)一臥式單面多軸鉆孔組合機(jī)床動(dòng)力滑臺(tái)的液壓系統(tǒng)
- 行政事業(yè)單位管理辦法
- 蓄能器的基本功能
- 《典范英語》(1a)評(píng)價(jià)方案
- 煤礦井下有毒有害氣體管理規(guī)定
- 戶口本日文翻譯樣文(模板)
- 關(guān)于調(diào)整污水處理費(fèi)征收標(biāo)準(zhǔn)的申請(qǐng)
- 倉儲(chǔ)合同案例分析(共6篇)
- 九年級(jí)上冊(cè)數(shù)學(xué)知識(shí)點(diǎn)考點(diǎn)
- 研究開發(fā)費(fèi)用加計(jì)扣除的鑒證報(bào)告記錄要求
評(píng)論
0/150
提交評(píng)論