版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
匯編語言程序設(shè)計基礎(chǔ)3.1
基本概念1.機器指令和代碼指令
機器指令------是能為計算機所能接受的一組代碼。它指出計算機所要進行的操作及其操作對象。機器指令是由二進制代碼組成的。代碼指令------用“0”或“1”形式表示的機器指令,是機器指令的數(shù)據(jù)表示形式,是能被計算機直接識別和執(zhí)行的二進制代碼串。機器語言程序------用機器語言或代碼語言編寫的程序。指令系統(tǒng)------計算機全部指令的集合。
優(yōu)點:能被計算機直接理解和執(zhí)行;缺點:編程繁瑣,不直觀,難記憶,易出錯,難查錯。
2.匯編指令匯編指令----用來表示機器指令的助記符。每一條機器指令對應一條匯編指令。匯編語言(AssemblyLanguage)----由助記符構(gòu)成的指令系統(tǒng)。匯編語言源程序----用匯編語言編寫的程序?!皡R編”(Assemble)----將匯編語言程序和高級語言程序翻譯成機器語言程序的過程。匯編程序----完成匯編的程序(MASM.EXE)優(yōu)點:編寫的程序生成的目標代碼精簡,占內(nèi)存少,執(zhí)行速 度快;缺點:程序所要解決的問題與數(shù)學模型之間的關(guān)系不直觀, 程序設(shè)計和調(diào)試的時間也比較長,可移植性較差。
適應場合:內(nèi)存容量和速度要求比較高3.編語言程序建立及處理過程A.ASM文件編輯程序EDITA.OBJ文件匯編程序MASMA.EXE文件連接程序LINK計算機上運行匯編語言程序的步驟是:1)用編輯程序建立.ASM源文件;2)用MASM程序把.ASM文件轉(zhuǎn)換成.OBJ文件;3)用LINK程序把.OBJ文件轉(zhuǎn)換成.EXE文件;4)在操作系統(tǒng)環(huán)境下直接鍵入文件名就可執(zhí)行該程序。 3.28086指令系統(tǒng)8086/8088的指令系統(tǒng)按功能可以分為六類:數(shù)據(jù)傳送算術(shù)運算邏輯運算與移位字符串處理控制轉(zhuǎn)移以及處理器控制第一節(jié)數(shù)據(jù)傳送類這類指令用于實現(xiàn)存儲器與寄存器、寄存器與寄存器,AL/AX與I/O端口、立即數(shù)到寄存器或存儲器的字節(jié)或字的傳送,共有14條指令,可分為四組。1、通用數(shù)據(jù)傳送指令
MOV(move)傳送PUSH(pushintothestack)進棧POP(popfromthestack)出棧XCHG(exchange)交換2、累加器專用指令
IN(input)輸入OUT(output)輸出XLAT(translate)換碼
3、地址傳送指令
LEA(loadeffectiveaddress)有效地址送寄存器LDS(loadDSwithpointer)指針送寄存器和DSLES(loadESwithpointer)指針送寄存器和ES
4、標志寄存器傳送指令
LAHF(1oadAHwithflags)標志送AHSAHF(storeAHintoflags)AH送標志寄存器PUSHF(pushtheflags)標志進棧POPF(poptheflags)標志出棧
第二節(jié)算術(shù)運算類1、加法指令
ADD(add)字節(jié)或字相加ADC(addwithcarry)帶進位的字節(jié)或字相加INC(increment)字節(jié)或字加1AAA(ASCIIadjustforaddition)加法的ASCII碼調(diào)整DAA(decimaladjustforaddition)加法的十進制調(diào)整
2、減法指令
SUB(subtract)字節(jié)或字相減SBB(subtractwithborrow)帶借位的字節(jié)或字相減DEC(decrement)字節(jié)或字減1NEG(negate)字節(jié)或字求補CMP(compare)字節(jié)或字的比較AAS(ASCIIadjustforsubtraction)減法的ASCII碼調(diào)整DAS(decimaladjustforsubtraction)減法的十進制調(diào)整4、除法指令
DIV(unsigneddivide)無符號二進制數(shù)相除IDIV(signeddivide)帶符號二進制數(shù)相除AAD(ASCIIadjustfordivision)除法的ASCII碼調(diào)整CBW(convertbytetoword)字節(jié)變換為字CWD(convertwordtodoubleword)字變換為雙字3、乘法指令
MUL(unsignedmultiple)無符號二進制數(shù)相乘IMUL(signedmultiple)帶符號二進制數(shù)相乘AAM(ASCIIadjustformultiplication)乘法的ASCII碼調(diào)整
第三節(jié)邏輯運算和移位類1、邏輯運算指令
NOT(not)字節(jié)或字求反AND(and)字節(jié)或字邏輯與OR(or)字節(jié)或字邏輯或XOR(exclusiveor)字節(jié)或字邏輯異或TEST(test)字節(jié)或字的測試2、移位和循環(huán)移位指令
SHL(shiftlogicalleft)邏輯左移SAL(shiftarithmeticleft)算術(shù)左移SHL(shiftlogicalright)邏輯右移SAR(Shiftarithmeticright)算術(shù)右移ROL(rotateleft)循環(huán)左移ROR(rotateright)循環(huán)右移RCL(rotateleftthroughcarry)帶進位循環(huán)左移RCR(rotaterightthroughcarry)帶進位循環(huán)右移第四節(jié)字符串處理類8086/8088指令系統(tǒng)為文件處理提供了一組強有力的指令(字符處理指令)。文件處理----對一系列含有字母數(shù)字代碼的字節(jié)(也稱字符串)進行處理,例如傳送、比較、查找、插入、刪除等,字符串指令為這些處理提供了很大方便。
MOVS/MOVSB/MOVSW(MoveBytestringormovewordstring)傳送字節(jié)串或字串。CMPS/CMPSB/CMPSW(compareByteorWordString)比較字節(jié)或字串。SCAS/SCASB/SCASW(scanbyteorwordstring)搜索字節(jié)串或字串。STOS/STOSB/STOSW(storebyteorwordstring)存字節(jié)串或字串。LODS/LODSB/LODSW(loadByteorWordString)取字節(jié)串或字串。以上各條指令前均可使用重復前綴指令,與上述基本指令配合使用的前綴有:REP(repeat)重復REPE/REPZ(repeatwhileequal/zero)相等/為零則重復REPNE/REPNZ(repeatwhilenotequal/notzero)不相等/不為零則重復
格式為:重復前綴串操作指令目的串,源串第五節(jié)控制轉(zhuǎn)移指令類8086/8088指令系統(tǒng)中有一組指令用于控制程序的轉(zhuǎn)移,這些指令有的只修改IP的內(nèi)容,有的則同時修改IP和CS的內(nèi)容。這組控制程序轉(zhuǎn)移的指令可再分為三組。
1、無條件轉(zhuǎn)移指令
CALL(CALLaProcedure)調(diào)用一個過程指令(轉(zhuǎn)子指令)。RET(RETurnfromprocedure)從過程返回。(從子程序返回)。JMP(JUMP)轉(zhuǎn)移
2、條件轉(zhuǎn)移指令
其中“高于和低于”適用于操作數(shù)為無符號數(shù)的判別。例如0FFH高于05H。而‘大于和小于”是用于操作數(shù)為帶符號數(shù)的判別。例如0FFH小于05H。因為前者為-1。條件指令常在比較或減法指令之后使用。
1)判斷無符號數(shù)大小的條件轉(zhuǎn)移指令①
JA/JNBE(jumpifnotbloworequal,orabove)
JA指令(高于轉(zhuǎn)移)
JNBE指令(不低于等于轉(zhuǎn)移)②
JBE/JNA(jumpifbloworequal,ornotabove)
JBE指令(低于或等于轉(zhuǎn)移)
JNA指令(不高于轉(zhuǎn)移)③JAE/JNB(jumpifnotblow,oraboveorequal)
JAE指令(高于等于轉(zhuǎn)移)
JNB指令(不低于轉(zhuǎn)移)④JB/JNAE(jumpifblow,ornotaboveorequal)
JB指令(低于轉(zhuǎn)移)
JNAE指令(不高于等于轉(zhuǎn)移)
2)判斷帶符號數(shù)大小的條件轉(zhuǎn)移指令①
JG/JNLE(jumpifgreater,ornotlessorequal)
JG指令(大于轉(zhuǎn)移)
JNLE措令(不小于等于轉(zhuǎn)移)②
JGE/JNL(jumpifgreaterorequal,ornotless)
JGE指令(大于等于轉(zhuǎn)移)
JNL指令(不小于轉(zhuǎn)移)③JL/JNGE(jumpifless,ornotgreaterorequal)
JL指令(小于轉(zhuǎn)移)
JNGE指令(不大于等于轉(zhuǎn)移)④JLE/JNG(jumpiflessorequal,ornotgreater)
JLE指令(小于等于轉(zhuǎn)移)
JNG指令(不大于轉(zhuǎn)移)3、測試某個標志的條件轉(zhuǎn)移指令
①JE/JZ(jumpifzero,orequal)
JE指令(相等則轉(zhuǎn)移)
JZ指令(等于0轉(zhuǎn)移)②JNE/JNZ(jumpifnotzero,ornotequal)
JNE指令(不相等則轉(zhuǎn)移)
JNZ指令(不等于0轉(zhuǎn)移)1)測試ZF①JC(jumpifcarry):當滿足CF=1時,轉(zhuǎn)移到目標地址。
②JNC(jumpifnotcarry):當滿足CF=0時,轉(zhuǎn)移到目標地址。
2)測試CF3、測試某個標志的條件轉(zhuǎn)移指令
①JS(jumpifsign)指令(為負轉(zhuǎn)移)
②JNS(jumpifnotsign)指令(為正轉(zhuǎn)移)
3)測試SF①JP/JPE(jumpifparity,orparityeven)指令(為偶轉(zhuǎn)移)②JNP/JPO(jumpifnotparity,orparityodd)(為奇轉(zhuǎn)移)4)測試PF①JO(jumpifoverflow)指令(溢出轉(zhuǎn)移)
②JNO(jumpifnotoverflow)指令(未溢出轉(zhuǎn)移)
5)測試OF4、迭代控制指令
這些指令用來完成循環(huán)控制的判斷轉(zhuǎn)移操作。其轉(zhuǎn)移的目的地址必須在相對該指令的下一指令所在地址位移-128~+127范圍內(nèi).格式:LOOP循環(huán)標號LOOPE/LOOPZ(LOOPifequal/zero)若相等/為0,則循環(huán)。LOOPNE/LOOPNZ(LOOPifnotequal/notzero)若不相等/不為0,則循環(huán)。JCXZ(JumpifregisterCX=0)若寄存器(CX)=0,則轉(zhuǎn)移。3.3
源程序典型結(jié)構(gòu)本節(jié)的目的在于告訴讀者,如何書寫一個完整的匯編語言源程序。一個標準的單模塊匯編語言源程序
書寫形式示例段寄存器初值的設(shè)置DOS下匯編語言程序的正常結(jié)束
第一節(jié)標準單模塊匯編語言程序書寫形式示例DATASEGMENT;定義數(shù)據(jù)段……;DATAENDSSTACKSEGMENTSTACK;定義堆棧段……;STACKENDSCODESEGMENT;定義代碼段
ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATA;
MOVDS,AXMOVES,AX……MOVAH,4CH;返回操作系統(tǒng)
INT21HCODEENDSENDSTART說明:
一個匯編語言源程序由若干邏輯段組成,一般由數(shù)據(jù)段、堆棧段、代碼段組成。程序中數(shù)據(jù)段、堆棧段根據(jù)實際情況可以有也可以沒有,但是任何一個源程序至少必須有一個邏輯代碼段和一條作為源程序文件結(jié)束的偽指令END。如果沒有堆棧段,那么,連接(LINK)時將產(chǎn)生一個警告性的錯誤:
LINK:warningL4201:nostacksegment
這對于沒有堆棧操作的用戶來說并不是錯誤。但是如果用戶程序用到堆棧的話,則最好設(shè)置自己的邏輯堆棧段。偽指令----源程序中附加的一些指示信息,它們本身不被匯編成代碼指令,只是用來協(xié)助匯編程序(MASM.EXE)完成匯編工作。
源程序格式1、SEGMENT/ENDS
SEGMENT和ENDS用來定義一個邏輯段,作為一段的開頭和結(jié)束,必須成對出現(xiàn)。 格式為:
<段名>SEGMENT[STACK] …… <段名>ENDS
其中,<段名>是由用戶自己給出的,SEGMENT和ENDS前的<段名>必須一致。 功能:為一個邏輯段命名,并指出以<段名>命名的邏輯段從何處起到何處止。如果有可選項STACK,則該邏輯段為用戶定義的邏輯堆棧段。源程序格式2、ASSUME
用來指示定義的各段用哪個段寄存器尋址。但它本身不對段寄存器裝填內(nèi)容,除CS外,DS、SS、ES的值必須由用戶通過MOV指令裝填。 格式為:
ASSUME<段寄存器名>:<邏輯段名>[,…]
例中ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK指明代碼段CODE通過段寄存器CS尋址,數(shù)據(jù)段DATA通過段寄存器DS、ES尋址,堆棧段STACK通過段寄存器SS尋址。源程序格式3、END
表示一個程序模塊的結(jié)束。若為主程序模塊,必須加起始標號。起始標號是程序運行的起始地址。我們在本章編寫的程序都是主程序模塊,END后必須加起始標號。 格式為:
END[<起始標號>]
4、EQU
格式為:
<標識符>EQU<表達式或字符串>
功能:表示該標識符與對應的表達式或字符串等價,即在匯編時以該表達式或字符串替代對應的標識符。例如:AEQU20H
……MOVAL,A;等價于MOVAL,20H例如:MOVEEQUMOV
……MOVEAX,BX;等價于MOVAX,BX源程序格式5、EXTRN
格式:EXTRN外部符號說明 其中外部符號說明是指本程序文件中所用到的外部模塊中的過程名、標號或變量名。 功能:供連接程序遇到相應外部符號時從其它模塊中查找。6、$地址計數(shù)器
功能:用來直接引用地址計數(shù)器的值。在匯編程序?qū)υ闯绦騾R編的過程中,地址計數(shù)器用來存放正在匯編的指令的偏移地址。當它用在數(shù)據(jù)定義當中時,表示的是地址計數(shù)器的當前值。 例如:
D1DB23H,24H,25H COUNTDW$-OFFSETD1
假如匯編時為D1分配的偏移地址是0000,這里$的值為0003,COUNT的值為0003。源程序格式7、ORG
格式為:ORG常數(shù)表達式 功能:把當前地址計數(shù)器的值設(shè)為表達式的值。 例如:
DATASEGMENT ORG10 D1DW1234H … DATAENDS
則D1的偏移地址為0AH。
源程序格式一個較為完整的匯編語言源程序書寫形式如下:
用EQU定義的等價語句(可有可無)用EXTRN定義的外部說明(如果用到外部模塊的話)
代碼段名SEGMENTASSUME定義的尋址關(guān)系過程名PROC……;程序邏輯代碼段過程名ENDS
起始標號:……;程序代碼段名ENDSEND起始標號或過程名
堆棧段名SEGMENTSTACK邏輯堆棧段……;用變量定義預置的堆??臻g堆棧段名ENDS(如果用戶設(shè)置自己的堆棧的話)
(如果用戶設(shè)置自己的堆棧的話)
數(shù)據(jù)段名SEGMENT邏輯數(shù)據(jù)段……;用變量定義預置的數(shù)據(jù)空間數(shù)據(jù)段名ENDS第二節(jié)段寄存器初值的設(shè)置 ASSUME指令僅僅是指定了某邏輯段應通過四個段寄存器中的哪一個進行尋址,但并沒有給段寄存器設(shè)置初值。也就是ASSUME并沒有使段寄存器指向具體的哪個段。要完成對段寄存器的初值設(shè)定,需要通過一定的指令予以實現(xiàn)。這里唯有CS是特殊的,只有它無需用戶專門處理。而DS、ES、SS則必須由用戶在程序代碼段的起始處自己設(shè)定初值。 一般方法是:
MOVAX,<邏輯段名> MOVDS,AX;對SS、ES的初值設(shè)定也一樣
源程序格式例3.1DATA1SEGMENTADB34HDATA1ENDSDATA2SEGMENTBDB56HDATA2ENDSCODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2;指明CODE段通過CS尋址;DATA1段通過DS尋址;DATA2段通過ES尋址START:MOVAX,DATA1;傳送DATA1的基址給AXMOVDS,AX;把AX中的基址送段寄存器DSMOVAX,DATA2;傳送DATA2的基址給AXMOVES,AX;把AX中的基址送段寄存器ESMOVAL,AADDAL,ES:BMOVA,ALMOVAH,4CHINT21HCODEENDSENDSTART源程序格式第三節(jié)DOS下匯編語言程序的正常結(jié)束
每個匯編語言程序在其代碼段中都必須含有返回DOS操作系統(tǒng)的指令語句,以保證程序執(zhí)行完后能自動返回DOS狀態(tài),可繼續(xù)向計算機輸入命令或程序。中止當前程序,使其正確返回DOS狀態(tài)的方法通常有如下方式:
源程序格式1、采用DOS4CH功能調(diào)用
這種方法在代碼段結(jié)束之前加調(diào)用語句:MOVAH,4CH;功能號4CH=>AHINT21H;中斷調(diào)用這是返回DOS最有效且兼容性最好的一種方法。
2、主程序定義為遠過程
這種方法在代碼段按下述方式定義主程序:┇CODESEGMENTASSUME…主過程名PROCFARSTART:PUSHDSMOVAX,0PUSHAX┇RET主過程名ENDP┇CODEENDSENDSTART
3.4
變量、程序中數(shù)據(jù)組織程序中所涉及的數(shù)據(jù)除立即數(shù)、由指令產(chǎn)生的數(shù)、通過鍵盤等讀入的數(shù)據(jù)外,其它大量初始數(shù)據(jù)、中間結(jié)果和結(jié)果要在程序設(shè)計時進行預置和分配。所謂預置和分配就是指在一定的邏輯段中,將這些數(shù)據(jù)一定的形式存放起來,并給出訪問的原則,而對于那些結(jié)果單元則只需給出訪問形式和預留出一定的空間就可以了。1、變量的定義和預置
在一個邏輯段中可以通過DB、DW、DD定義和預置以字節(jié)、字、雙字為存儲單位的變量。格式:<變量名>DB|DW|DD<表達式>|<表達式表>其中<變量名>應是一個非保留字的標識符,<變量名>可有可無,若有則該標識符作為該變量名;否則該變量為無名變量。DB、DW、DD只能任選其一,分別表示按字節(jié)、字、雙字分配存儲。<表達式>可以是以下六種之一:1)常數(shù)項表達式2)保留符號‘?’3)地址表達式(DB不用)4)二個以上的ASCII碼字符串5)預置數(shù)據(jù)表格6)重復值(一個DUP子句)
1、變量的定義和預置
例:DATA
SEGMENT
DATA1
DB
20H,21H
DATA2
DW
0204H,1000H
DATA3
DD
12345H
DATA4
DB-1*3,15/3
DATA5
DB‘0123’
DATA6
DW‘AB’,‘C’、‘D’
DATA7
DB?
DATA8
DD?
DATA9
DB
2
DUP(0)
DATA10
DW
3
DUP(?)
DATA
ENDS這些變量在內(nèi)存中的存儲形式如下圖所示。設(shè)DS值為18DB,則從地址18DB:0000開始依次存放。變量的定義和預置DATA1
DB
20H,21H
DATA2
DW
0204H,1000H
DATA3
DD
12345H
DATA4
DB-1*3,15/3
DATA5
DB‘0123’
DATA6
DW‘AB’,‘C’、‘D’
DATA7
DB?
DATA8
DD?
DATA9
DB
2
DUP(0)
DATA10
DW
3
DUP(?)DATA1
DB
20H,21H
DATA2
DW
0204H,1000H
DATA3
DD
12345H
DATA4
DB-1*3,15/3
DATA5
DB‘0123’
DATA6
DW‘AB’,‘C’、‘D’
DATA7
DB?
DATA8
DD?
DATA9
DB
2
DUP(0)
DATA10
DW
3
DUP(?)說明:
1)變量名是一個標識符,即是以字母開頭的字母、數(shù)字和特殊字符組成的字符串。2)一個變量名的實質(zhì)是一個地址,并不是“DATA1里存放了20H,21H”“DATA5里存放了‘0123’的ASCII碼”而是“從DATA1處依次存放了20H,21H”“從DATA5處依次存放了‘0123’的ASCII碼”。3)DB/DW/DD偽指令是在變量名所對應的地址開始的內(nèi)存區(qū)域依次存入表達式中的各項值。4)變量實際上就是一塊存放數(shù)據(jù)的內(nèi)存區(qū)域,定義在某個段中。
變量的定義和預置2、變量的訪問
1)訪問變量的值 可以用如下方式訪問:
MOVBL,DATA1;把地址為DATA1的字節(jié)20H=>BL MOVCL,DATA1[1];把地址為DATA1+1的字節(jié)21H=>CL,CL的值為21H MOVBX,DATA2[0];把地址為DATA2的字0204H=>BX,BX的值為0204H MOVBX,DATA2;同上
MOVBX,DATA2[1];把地址為DATA2+1的字0002H=>BX,;BX的值為0002H MOVBX,DATA2[2];把地址為DATA2+2的字節(jié)1000H=>BX,;BX的值為1000H
而
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國醫(yī)用氧行業(yè)運營效益分析及投資策略研究報告版
- 2024-2030年中國化妝品終端渠道行業(yè)前景預測及投資營銷策略分析報告
- 2024-2030年中國農(nóng)業(yè)衛(wèi)星數(shù)據(jù)服務(wù)行業(yè)發(fā)展戰(zhàn)略與投資規(guī)劃分析報告
- 2024-2030年中國獸醫(yī)器械行業(yè)創(chuàng)新模式及投資策略研究報告
- 2024年家庭裝修設(shè)計與施工合同
- 2023年重慶醫(yī)科大學附屬大足醫(yī)院招聘考試真題
- 2024年城市核心商務(wù)區(qū)辦公樓購買合同
- 2024年衛(wèi)星發(fā)射與運營合同
- 2023年正安縣城鎮(zhèn)公益性崗位招聘考試真題
- 設(shè)備管理的總結(jié)與反思
- 撳針操作規(guī)程
- 給排水實習報告篇
- 《貨幣金融學》蔣先玲版期末復習知識點總結(jié)
- 設(shè)立供應鏈管理公司組建方案
- 2023汽車4s店承包合同
- 2023年少兒書法美術(shù)培訓行業(yè)趨勢報告
- 全國優(yōu)質(zhì)課一等獎人教版八年級生物上冊《人類對細菌和真菌的利用》公開課課件(內(nèi)嵌視頻)
- 中建住宅給排水工程專項施工方案
- 中班健康課件《生氣和快樂》
- 年度人力資源預算編制
評論
0/150
提交評論