版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
匯編語(yǔ)言程序設(shè)計(jì)用匯編語(yǔ)言編寫(xiě)的程序不能由機(jī)器直接執(zhí)行,而必須經(jīng)匯編程序翻譯成機(jī)器語(yǔ)言程序。匯編程序的功能及匯編過(guò)程Prog.asm文件匯編程序Prog.obj文件連接程序Prog.exe文件編輯程序目標(biāo)文件(.OBJ):機(jī)器碼文件列表文件(.LST):匯編語(yǔ)言源程序和機(jī)器語(yǔ)言目標(biāo)程序的文件。交叉索引文件(.CRF):程序中使用的符號(hào)、變量和標(biāo)號(hào)以及引用情況。.OBJ.LST.CRF可選.EXE.MAP.LIB可選映像文件(.MAP):給出每個(gè)段在存儲(chǔ)器的分配情況。交叉索引文件(.CRF):程序中使用到的庫(kù)文件。缺點(diǎn):1.匯編語(yǔ)言是面向具體計(jì)算機(jī)硬件的語(yǔ)言,和機(jī)器密切相關(guān)。它可讀性差,編程效率低。2.與機(jī)器硬件的具體結(jié)構(gòu)聯(lián)系過(guò)于緊密——在一種結(jié)構(gòu)的機(jī)器上開(kāi)發(fā)的程序極難移植到另一種不同結(jié)構(gòu)的機(jī)器上去。優(yōu)點(diǎn):1.可充分利用機(jī)器的硬件功能和結(jié)構(gòu)特點(diǎn),用匯編語(yǔ)言編寫(xiě)的程序節(jié)省內(nèi)存,執(zhí)行速度快,加快程序的執(zhí)行速度,減少目標(biāo)程序所占用的存儲(chǔ)空間2.為用戶直接控制對(duì)象提供了手段。故實(shí)時(shí)性要求很高的程序多采用匯編語(yǔ)言程序.常用來(lái)編寫(xiě)實(shí)時(shí)控制程序、實(shí)時(shí)通信程序,有時(shí)也用來(lái)編制某些系統(tǒng)軟件程序。4幾個(gè)術(shù)語(yǔ)(1)匯編語(yǔ)言源程序:指按匯編語(yǔ)言語(yǔ)法規(guī)則編寫(xiě)的源程序。(2)匯編(過(guò)程):將匯編語(yǔ)言源程序翻譯成機(jī)器碼的過(guò)程稱為匯編過(guò)程或簡(jiǎn)稱匯編。(3)手工匯編與機(jī)器匯編:(4)小匯編與宏匯編:(5)目標(biāo)程序:匯編后所得的機(jī)器碼程序稱為目標(biāo)程序。第二節(jié)匯編語(yǔ)言程序格式匯編語(yǔ)言源程序用語(yǔ)句書(shū)寫(xiě),可使用的語(yǔ)句分為兩類:指令性語(yǔ)句和偽指令指令性語(yǔ)句——與機(jī)器指令一一對(duì)應(yīng)[標(biāo)號(hào):]指令助記符操作數(shù),操作數(shù);[注釋]一指令性語(yǔ)句標(biāo)識(shí)符,本指令語(yǔ)句的符號(hào)地址指令名稱的代表符號(hào)參與本指令運(yùn)算的數(shù)據(jù)用來(lái)說(shuō)明程序或語(yǔ)句的功能,用分號(hào);作為注釋開(kāi)始。不產(chǎn)生機(jī)器碼,為匯編程序和連接程序提供某些必要的控制的管理性語(yǔ)句。完成數(shù)據(jù)定義、存儲(chǔ)器分配、段定義、段設(shè)定、指示程序結(jié)束等功能。格式:[名字]偽指令指示符操作數(shù);[注釋]
二偽指令語(yǔ)句偽指令的名稱,用符號(hào)地址表示匯編程序規(guī)定的符號(hào)由偽指令具體要求的;常量,字符串和表達(dá)式等用來(lái)說(shuō)明程序或語(yǔ)句的功能,用分號(hào);作為注釋開(kāi)始。[標(biāo)號(hào):]指令助記符操作數(shù),操作數(shù);[注釋]標(biāo)識(shí)符,本指令語(yǔ)句的符號(hào)地址指令名稱的代表符號(hào)參與本指令運(yùn)算的數(shù)據(jù)用來(lái)說(shuō)明程序或語(yǔ)句的功能,用分號(hào);作為注釋開(kāi)始。指令性語(yǔ)句是計(jì)算機(jī)可執(zhí)行的,而偽指令語(yǔ)句不能執(zhí)行,用來(lái)定義變量,分配存儲(chǔ)單元,指示程序開(kāi)始和結(jié)束等。這兩種語(yǔ)句的差別:在形式上:帶不帶冒號(hào),是否可轉(zhuǎn)向它.
在本質(zhì)上:匯編時(shí)能否形成對(duì)應(yīng)的機(jī)器碼.
1.一個(gè)簡(jiǎn)單程序?qū)嵗?/p>
;THEFORMOFANASSEMBLYLANGUAGEPROGRAM
STACK SEGMENT
DB64DUP(?) STACK ENDS ;----------------------------------------
DATA SEGMENT
DATA1 DB36H DATA2 DB4BH SUM DB?
DATA ENDS ;----------------------------------------
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA ;loadthedatasegmentaddress MOV DS,AX ;assignvaluetoDS
MOV AL,DATA1 ;getthefirstoperand MOV BL,DATA2 ;getthesecondoperand ADD AL,BL ;addtheoperands MOV SUM,AL ;storeresultinlocationSUM MOV AH,4CH ;setupto INT 21H ;returntoDOS
MAIN ENDP
CODE ENDS END START ;thisistheprogramexitpoint段定義偽指令SEGMENT/ENDS段指示偽指令A(yù)SSUME段地址的裝入程序結(jié)束偽指令MAINPROCFARASSUME偽指令用來(lái)指示程序中的段與CPU中段寄存器之間的關(guān)系使用ASSUME,僅告訴匯編程序哪個(gè)段寄存器設(shè)定指向哪一個(gè)段,并沒(méi)有給各段寄存器裝入實(shí)際的值.段地址的裝入必須通過(guò)給段寄存器賦值.對(duì)于SS段,除了指定SS的段基址,還要將棧頂偏移地址置入SP中;若不指示不賦值,此時(shí)利用的是系統(tǒng)設(shè)置的堆棧.ASSUME段寄存器名:段名[,段寄存器名:段名,]DATASEGMENTM1DW00FFHM2DW00FFHP1DW?P2DW?
DATAENDSSTACKSEGMENTST1DB100DUP(?)TOPEQULENGTHST1
STACKENDSCODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETM1
DS=DATASS=STACKCS=CODEFF00FF00??????。。?!?P1P2ST100TOPM1M2SS:0(棧頂)CS:0SS:DS:0MOVAX,[BX]MOVDX,00HMOVBX,OFFSETM2MULWORDPTR[BX]MOVBX,OFFSETP1MOV[BX],AXMOVBX,OFFSETP2MOV[BX],DXHLTMOVAH,4CHINT21HCODEENDSENDSTARTDS:0FF00FF00??????。。?!?P1P2ST100TOPM1M2SS:0(棧頂)CS:0DS=DATASS=STACKCS=CODESS:常量變量四數(shù)據(jù)項(xiàng)
變量是內(nèi)存中的數(shù)據(jù),在程序中作為存儲(chǔ)器操作數(shù)來(lái)使用。變量在出現(xiàn)運(yùn)行期間隨時(shí)可以修改;內(nèi)存中的變量的訪問(wèn)是以變量名的形式進(jìn)行的,它是存儲(chǔ)單元的符號(hào)地址.
變量有三種屬性:①段值—變量定義所在段的段地址②偏移量—變量單元地址與段起始地址之間的位移量。③類型—表示變量占用存儲(chǔ)單元的字節(jié)數(shù).由數(shù)據(jù)定義偽指令DB,DW,DD,DQ和DT。①和②構(gòu)成了變量的邏輯地址用引號(hào)引起來(lái)的字符或字符串也代表常數(shù)。
例:’A’,’BCDE’,匯編時(shí)被翻譯成對(duì)應(yīng)的ASCII碼41H和42H,43H,44H,45H。標(biāo)號(hào)是某條指令所存放單元的符號(hào)地址,可作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址。標(biāo)號(hào)也有三種屬性①段值:總是在CS段寄存器中②偏移量:概念與變量同③類型:NEAR和FAR兩種。
標(biāo)號(hào)NEAR:標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令或調(diào)用指令在同一碼段內(nèi),只需改變IP即可。FAR:標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令或調(diào)用指令不在同一碼段內(nèi)。。1.數(shù)據(jù)定義及存儲(chǔ)器的分配是匯編語(yǔ)言能識(shí)別的數(shù)據(jù)項(xiàng),是指令和偽指令語(yǔ)句中操作數(shù)的基本組成部分.數(shù)據(jù)項(xiàng)包括常量、變量、標(biāo)號(hào)及表達(dá)式.變量是內(nèi)存中的數(shù)據(jù),在程序中作為存儲(chǔ)器操作數(shù)來(lái)使用。變量在出現(xiàn)運(yùn)行期間隨時(shí)可以修改;內(nèi)存中的變量的訪問(wèn)是以變量名的形式進(jìn)行的,它是存儲(chǔ)單元的符號(hào)地址.變量的定義與預(yù)置:定義變量就是給變量分配存儲(chǔ)單元,且對(duì)這個(gè)存儲(chǔ)單元賦一個(gè)符號(hào)名,同時(shí)將這些存儲(chǔ)單元預(yù)置初值.1、數(shù)據(jù)定義偽指令:為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元并預(yù)置初值.DB
用來(lái)定義字節(jié)
DW
用來(lái)定義字
DD
用來(lái)定義雙字
DQ用來(lái)定義四字變量DT用來(lái)定義十個(gè)字節(jié)
操作數(shù)可以是常數(shù)或表達(dá)式例:DATA_BYTEDB
10,5,10HDATA_WORD
DW
100H,100,-4DATA_DW
DD
2*30,0FFFBHDATA_BYTEDATA_DWDATA_WORD10510H100H100-4600FFFBH2.?表達(dá)式:?表達(dá)式預(yù)置任何內(nèi)容,只分配存儲(chǔ)單元,無(wú)確切的初值A(chǔ)B1DB?AB2DW?3.Dup表達(dá)式:定義重復(fù)數(shù)據(jù)初值(確定或不確定)初始化n個(gè)存儲(chǔ)單元,n表示要重復(fù)的次數(shù),以是n>0的數(shù)值表達(dá)式或常數(shù);初值必須以圓括號(hào)括起來(lái),表示要重復(fù)的內(nèi)容ARRAY2DW100DUP(?)ARRAY1DB2DUP(0,1,?)ARRAY3DB20DUP(0,1,4DUP(2),5)例:DO-2DB 2DUP(0,1,2,?)與DO-2DB 0,1,2,?,0,1,2,?等價(jià)4.利用DW和DD保存地址到存儲(chǔ)單元地址表達(dá)式為一變量名DW取其偏移地址來(lái)初始化變量DD取其邏輯地址來(lái)初始化變量VAR1DB100HVAR2DWVAR1;取var1的偏移地址來(lái)初始化var2VAR5DDVAR1;取var1的邏輯地址來(lái)初始化var5例2:操作數(shù)可以是字符串
MASTERLI DB
‘HELLO’18MASTERLI‘H’‘E’‘L’‘L’‘O’注意下面的不同
DB’AB’ DW’AB’
‘B’‘A’42H41H‘A’‘B’41H42H例3:ABC DB 0,1,?,?,?LPI DW ?,54,?19ABCLPI01?????54
偽指令ORG規(guī)定了段內(nèi)的起始地址或偏移地址
ORG <表達(dá)式>
表達(dá)式的值即為段內(nèi)的起始地址或偏移地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。20定位偽指令ORG在偽操作的操作數(shù)字段中若使用$,則表示的是地址計(jì)數(shù)器的當(dāng)前值例:BUFFERDW3,4,$+3設(shè)BUFFER的偏移地址為0088HBUFFER0088H0300040000008CH008CH+3=008FH8F當(dāng)前位置計(jì)數(shù)器$例:已知數(shù)據(jù)段定義如下,段的起始地址為02000HDATASEGENTDBYTEDB10,10HARRAYDB20DUP(?)DWORD0DW100,100HDDWORDDD12345678HDQWORDDQ1234567890ABCDEFHDBYTESDB‘AB’DWORDSDW‘AB’DWORD1DWDWORD0DDWORD1DDDDWORDORG10HABCDW$-5DATAENDS例:改錯(cuò)DATASEGENTBL1:DW99BL2DB25*60ZERODB0ONEDBONEDATAEND
第四節(jié)表達(dá)式與運(yùn)算符表達(dá)式由運(yùn)算對(duì)象及運(yùn)算符組成,在匯編時(shí)由匯編程序?qū)λM(jìn)行運(yùn)算,運(yùn)算結(jié)果作為一個(gè)語(yǔ)句中的操作數(shù)去使用.運(yùn)算對(duì)象可以是常數(shù)、寄存器、標(biāo)號(hào)、變量,得到的運(yùn)算結(jié)果可以是一個(gè)常數(shù),也可以是一個(gè)存儲(chǔ)器的地址,在此地址存放了數(shù)據(jù)(稱變量)或指令(標(biāo)號(hào)).數(shù)字表達(dá)式和地址表達(dá)式兩種。匯編時(shí)按一定的優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算后可得到一個(gè)數(shù)值或一個(gè)地址。七種運(yùn)算+、-、*、/,MOD(求余),SHL(左移),SHR(右移)+、-、*、/運(yùn)算都是整數(shù)運(yùn)算,結(jié)果是整數(shù)./運(yùn)算得到的是商的整數(shù)部分.MOD表示除法運(yùn)算后得到的余數(shù)。
19/7的商是2,19MOD7則為5(余數(shù))SHL和SHR表示左移和右移一算術(shù)運(yùn)算符算術(shù)運(yùn)算符用于數(shù)字表達(dá)式
MOV AL,2*7
匯編后為B0,0E算術(shù)運(yùn)算符用于地址表達(dá)式地址運(yùn)算的結(jié)果應(yīng)有明確的物理意義,兩個(gè)地址的乘或除無(wú)意義,而加或減則可以
LEASI,SUM+3
表示變量SUM的地址加上3得到的和作為新存儲(chǔ)器地址(1)邏輯運(yùn)算符對(duì)其操作數(shù)進(jìn)行按位操作.
它與指令系統(tǒng)中的邏輯運(yùn)算是不相同的,運(yùn)算后產(chǎn)生一個(gè)邏輯運(yùn)算值,作為操作數(shù)使用,不影響標(biāo)志位.(2)對(duì)地址不能進(jìn)行邏輯運(yùn)算,只能用于數(shù)字表達(dá)式中.(3)邏輯運(yùn)算符有AND、OR、XOR和NOT,NOT是單操作數(shù)運(yùn)算符,其他是雙操作數(shù)運(yùn)算符二.邏輯運(yùn)算符例:MOV CL,36HAND0FH
經(jīng)匯編后:MOVCL,06H(1)邏輯運(yùn)算是在匯編時(shí)完成的,表達(dá)式的值由匯編程序確定邏輯指令是在程序執(zhí)行時(shí)完成邏輯運(yùn)算的.(2)0FF00H和OOFFH與一個(gè)16位數(shù)相“與”,可以分別提取其高8位和低8位,這種技術(shù)通常稱為“屏蔽”.
AND
DX,BUFFER AND
0FEH
6個(gè)關(guān)系運(yùn)算符關(guān)系運(yùn)算符都是雙操作數(shù)運(yùn)算,運(yùn)算對(duì)象只能是兩個(gè)性質(zhì)相同的項(xiàng)目.關(guān)系運(yùn)算符的兩個(gè)操作數(shù)必須都是數(shù)字或者是同一段內(nèi)的兩個(gè)存儲(chǔ)器地址。對(duì)兩個(gè)性質(zhì)不同的項(xiàng)目進(jìn)行關(guān)系運(yùn)算是無(wú)意義關(guān)系運(yùn)算的結(jié)果只可能是兩種情況:關(guān)系成立或不成立
關(guān)系為真(成立),結(jié)果為0FFFFH
關(guān)系為假(不成立),結(jié)果為0三.關(guān)系運(yùn)算符相等:EQ 不等:NE大于:GT 小于:LT
小于或等于:LE 大于或等于:GE例:MOVDX,VALGE15若VAL的值大于等于15,則匯編后為:
若VAL的值小于15,則匯編后為:
例:ANDAX,((NUMBLT5)AND45)OR(NUMBGE5)AND85)
當(dāng)NUMB<5時(shí),匯編成
NUMB>=5時(shí),匯編成ANDAX,45ANDAX,85MOV DX,0FFFFHMOV DX,0運(yùn)算符是對(duì)存儲(chǔ)器地址進(jìn)行運(yùn)算,它可以將存儲(chǔ)器地址的三個(gè)屬性(段,偏移量和類型)分離出來(lái),返回到所在位置操作數(shù)使用.OFFSET,SEG,TYPE,SIZE及LENGTH四.數(shù)值返回運(yùn)算符(分析運(yùn)算符)例:設(shè)DATA是從存儲(chǔ)器實(shí)際地址0A000H開(kāi)始的一個(gè)數(shù)據(jù)段,定義如下:DATASEGMENTVAR1DB20,30VAR2DW2000H,3000HVAR3DD22002200H,33003300HDATAENDS則:(1)MOVBX,SEGVAR1(2)MOVCX,SEGVAR2(3)MOVDX,SEGVAR3(1)SEG格式:SEG變量名或標(biāo)號(hào)名功能:用來(lái)求取一個(gè)變量或標(biāo)號(hào)的段基址0A00H例:MOVSI,OFFSETVAR2;將變量VAR2的地址偏移量取到SI中.
等同于LEASI,VAR2
區(qū)別MOVSI,VAR2例:
MOV AX,SEGSTRI1
MOV DS,AX (2)OFFSET格式:OFFSET變量名或標(biāo)號(hào)名功能:求取一個(gè)變量或標(biāo)號(hào)的段內(nèi)偏移地址值將變量STRI1所在段值取到DS中存儲(chǔ)器單元類型對(duì)應(yīng)值
DB(字節(jié))1DW(字)2DD(雙字)4DQ(四字)8DT(十個(gè)字節(jié))10NEAR標(biāo)號(hào)-1FAR標(biāo)號(hào)-2(3)TYPE運(yùn)算符格式:TYPE變量名或標(biāo)號(hào)名功能:求取這些取存儲(chǔ)器操作數(shù)的類型值(1)TYPE加在變量前面返回的是這個(gè)變量的字節(jié)數(shù)
TYPEVAR1=TYPEVAR2=TYPEVAR3=(2)TYPE加在標(biāo)號(hào)的前面,返回標(biāo)號(hào)的屬性far(-2)或near(-1)LENGTH的取值,由偽指令后面第一個(gè)表達(dá)式的形式來(lái)確定其后的第一個(gè)表達(dá)式為重復(fù)子句“nDUP()”,則取值為n,否則是其他形式的表達(dá)式返回值為1。(4)LENGTH格式:LENGTH
變量名功能:用來(lái)計(jì)算一個(gè)存儲(chǔ)區(qū)的單元(單元可以是字節(jié),字或雙字)的數(shù)目。例:若FEES被定義為:FEES DW 4,5,6
則MOV CX,LENGTHFEES
匯編后,MOV CX,1
DATADEGMENTN1DW10DUP(0),2367H,3DUP(10)N2DB‘BASIC’,8DUP(0)N3DW20,5DUP(2)DATAENDSMOVAL,LENGTHN1MOVBL,LENGTHN2MOVCL,LENGTHN3AL=10BL=1CL=1(5)SIZE格式:SIZE變量名功能:返回其后的變量所含的字節(jié)存儲(chǔ)單元的總數(shù).SIZE變量=LENGTH變量*TYPE變量例:設(shè)有數(shù)據(jù)段中使用
DATA1DW100DUP(?)定義了100個(gè)字單元,則
MOVAX,TYPEDATA1MOVAX,SIZEDATA1MOVAX,LENGTHDATA1AX=2AX=200AX=100例1:設(shè)有數(shù)據(jù)段中使用
DATA1DB?定義了一個(gè)單元,則
MOVAL,DATA1
MOVAX,SEGDATA1MOVAX,OFFSETDATA1
05A2001085DSCSDATA12000:1500AL=05AX=2000AX=1500例3設(shè)該段的段地址為2000HDATASEGMENTBUF1DBN1,N2,…,N10BUF2DB10DUP(0)
BUF3DW10DUP(?)
DATAENDS……MOVAX,SEGBUF1;MOVDS,AXMOVSI,OFFSET
BUF1MOVCX,LENGTHBUF2MOVBL,SIZEBUF3MOVAL,BUF1MOVAH,BUF1+2五。屬性修改運(yùn)算符
為存儲(chǔ)器操作數(shù)臨時(shí)指定一個(gè)新的屬性,用來(lái)改變或建立符號(hào)名的新類型運(yùn)算符包括PTR、THIS、SHORT、HIGH、LOW(1)PTR格式:PTR存儲(chǔ)器地址表達(dá)式功能:改變存儲(chǔ)器地址操作數(shù)的操作類型,但其段地址和偏移地址不變。重新指定類型指定操作數(shù)的類型重新定義一個(gè)新變量例1:重新指定類型:指定操作數(shù)的類型重新定義一個(gè)新變量
DATA1DW1234H,5678HMOVAL,DATA1MOVAL,BYTEPTRDATA1MOVAX,DATA1例2:指定操作數(shù)的類型
INC[BX]改為:INCBYTEPTR[BX]INCWORDPTR[BX]例3:重新定義一個(gè)新變量
DATA1DW1234H,5678HBDATA1EQUBYTEPTRDATA1√34127856DSDATA1BDATA1×;(AL)=34H;(AX)=1234H;操作數(shù)類型不明確例:已知變量VAR1定義如下:
VAR1DW2030HVAR2EQUBYTEPTRVAR1VAR3EQUBYTEPTRVAR1+1TYPEVAR1=2;VAR1變量是字型TYPEVAR2=1;VAR2變量是字節(jié)型
MOV VAR1,AX 是合法的
MOV AL,VAR1 是非法的
只能用:MOVAL,VAR2
或MOVAL,BYTEPTRVAR1VAR1和VAR2為同一存儲(chǔ)單元,但VAR1和VAR2的類型不同2段超越前綴
格式:段寄存器名:地址表達(dá)式功能:用來(lái)指定一個(gè)存儲(chǔ)器操作數(shù)的段屬性,而不管其原來(lái)隱含的段是什么M0VAX,ES:[DI]
;把ES段中由DI指向的字操作數(shù)送(AX)例:JMPSHORTDISPLAY…DISPLAY:則標(biāo)號(hào)DISPLAY與JMP指令的距離不能大于127個(gè)字節(jié)3SHORT格式:SHORT標(biāo)號(hào)功能:用來(lái)修飾JMP指令中轉(zhuǎn)移地址的屬性,指出轉(zhuǎn)移地址是在下一條指令地址的-128~127字節(jié)的范圍之內(nèi)4THIS格式:THIS類型功能:用來(lái)建立新的存儲(chǔ)器地址操作數(shù),且不分配存儲(chǔ)單元。新的操作數(shù)類型在THIS中指定,而其段地址和偏移量就是匯編時(shí)的當(dāng)前值。DATA1SEGMENTWBUFFEREQUTHISWORDBUFFERDB12H,34H,00H,91H
DATA1ENDS1234009185DSBUFFERWBUFFERAL=12HBX=3412HMOVAL,BUFFERMOVBX,WBUFFER兩語(yǔ)句必須相鄰,且THIS必須在前5HIGH和LOW格式:HIGH和LOW表達(dá)式功能:字節(jié)分離符,將一個(gè)16位的數(shù)和表達(dá)式的高字節(jié)和低字節(jié)分離出來(lái)。六。其它運(yùn)算符(1)圓括號(hào)(2)方括號(hào)(3)尖括號(hào)和圓點(diǎn)(4)MASK和WIDTH
自學(xué)第五節(jié)偽指令及宏指令二符號(hào)定義偽指令EQU和=等值偽指令EQU格式為:符號(hào)名 EQU 表達(dá)式或:新符號(hào)名 EQU 老符號(hào)名為了使程序便于閱讀和修改,使用一個(gè)符號(hào)來(lái)代表一個(gè)值,在程序中使用這個(gè)符號(hào)代表這個(gè)值進(jìn)行操作(1)為常數(shù)定義一個(gè)符號(hào),在程序中使用符號(hào)來(lái)表示常數(shù),便于修改ONEEQU1TWOEQU2SUMEQUONE+TWOBYTESDB4DUP(?)DATA_WEQUWORDPTRBYTESDATA_DWEQUDWORDPTRBYTESXYZEQU[BP+3]AEQUARRAY[BX][SI](3)可以給由地址表達(dá)式指出的任意存儲(chǔ)單元定義一個(gè)名字(2)給變量或標(biāo)號(hào)定義新的類型屬性并取一個(gè)新名字例:DATASEGMENTORG9ARRAYDB10H,24H,5AH,0C7H,98H,’ABCD’COUNTEQU$-ARRAYMAXDB?DATAENDS;$-ARRAY=00013H-0009H=0AH其功能與EQU相似,但打破了EQU不能重新賦值的限制例1:COUNTEQU20COUNTEQU20*2;error但:COUNT=20COUNT=20*2;ok
=偽指令對(duì)符號(hào)的賦值還,它與EQU的區(qū)別是“=”操作可以重復(fù)定義,而EQU則不能重復(fù)定義EQU語(yǔ)句中不允許出現(xiàn)標(biāo)號(hào)X=3Y=6Y=Y*Y-X……MOVAX,Y
通過(guò)上述操作,最后使Y=33,當(dāng)生成目標(biāo)代碼時(shí)將用33取代Y。即
MOVAX,21H(33D)例:BUFBLABELBYTEBUFWDW1234H,5678HMOVAX,BUFW;(AX)=1234HMOVAL,BUFB;(AL)=34HLABEL偽指令格式:標(biāo)號(hào)/變量LABEL類型用來(lái)定義其語(yǔ)句中的變量(標(biāo)號(hào))的類型屬性為語(yǔ)句中設(shè)定的類型,此時(shí)變量(或標(biāo)號(hào))的段屬性和偏移地址屬性由該語(yǔ)句的位置確定。兩語(yǔ)句必須相鄰,且LABEL語(yǔ)句必須在前用LABEL定義標(biāo)號(hào)GO_ONALABELFARGO_ON:MOVAX,0203H…JMPGO_ON指令MOVAX,0203H有兩個(gè)標(biāo)號(hào)GO_ON和GO_ONA.當(dāng)使用GO_ON時(shí),為段內(nèi)轉(zhuǎn)移;當(dāng)使用GO_ONA時(shí),則為段間轉(zhuǎn)移GO_ON為NEAR型GO_ONA為FAR型標(biāo)號(hào)小結(jié)1、在使用或訪問(wèn)變量時(shí),必須指定變量的類型屬性,即源操作數(shù)與目的操作數(shù)的類型屬性一致,操作合法。2、可以有多種方法指定、改變變量的類型屬性:
PTR可在訪問(wèn)時(shí)指定變量屬性
THIS,LABEL在變量定義時(shí),指定變量屬性段定義偽指令分段結(jié)構(gòu)是8086/8088的特點(diǎn),程序和存儲(chǔ)器都是按段來(lái)組織1.段定義語(yǔ)句在段定義中,SEGMENT和ENDS總是成對(duì)使用的,它們將數(shù)據(jù)和程序分為多個(gè)段,如數(shù)據(jù)段、棧段和代碼段。段定義偽指令的格式如下:段名
SEGMENT
┇段名
ENDS
SEGMENT和ENDS
必須成對(duì)出現(xiàn),語(yǔ)句前必須有段名,且段名必須相同。4.程序命名及程序結(jié)束偽指令(1)NAME和TITLE(2)END格式:END[標(biāo)號(hào)名]功能:標(biāo)記匯編源程序結(jié)束。END是偽指令助記符,不可缺省,放在源程序的最后一行,每個(gè)模塊只有一個(gè)END。5.基數(shù)控制偽指令BQDH6.指定地址偽指令ORG和EVEN偽指令60匯編程序?qū)υ闯绦虻亩芜M(jìn)行匯編時(shí),將段名填入段表,同時(shí)為該段配備一個(gè)初值為0的位置計(jì)數(shù)器.ORG指令改變?cè)撐恢糜?jì)數(shù)器的內(nèi)容
ORG表達(dá)式;把位置計(jì)數(shù)器的值設(shè)置為表達(dá)式的值匯編程序以表達(dá)式的值為起始地址,連續(xù)存放程序和數(shù)據(jù),直到出現(xiàn)一個(gè)新的ORG指令.若省略O(shè)RG,則從本段起始地址開(kāi)始連續(xù)存放EVEN偽指令用于將目標(biāo)地址調(diào)整為偶數(shù)第六節(jié)匯編語(yǔ)言程序一、順序程序設(shè)計(jì)例1編程計(jì)算
S=
DATASEGMENTSDW?,?
DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,30HADDAL,20HMOVBL,80HMULBL;結(jié)果在AX中。80H×(30H+20H)185H加法ADD乘法擴(kuò)展除法存結(jié)果結(jié)束
MOVBX,185HSUBDX,DX;擴(kuò)展被除數(shù)為雙字/字
DIVBXMOVS,AX;存商
MOVS+2,DX;存余數(shù)
MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART在編寫(xiě)順序程序時(shí),要考慮以下內(nèi)容。
1、如何組織初始、中間、結(jié)果數(shù)據(jù)。采用的尋址方式,使用的寄存器。
2、計(jì)算的順序,用變量、寄存器、還是堆棧保存中間結(jié)果,有時(shí)需予留、予清除、予設(shè)置一些寄存器。
3、指令與指令之間的銜接。二、分支程序設(shè)計(jì)例2檢查輸入的字符,如果輸入字符為A則顯示,否則循環(huán)等待。
CODESEGMENTASSUMECS:CODESTA:MOVAH,07HINT21H;鍵入Ctr-Break結(jié)束
CMPAL,41HJZDISYJMPSTADISY:MOVAH,02HMOVDL,ALINT21HMOVAH,4CHINT21HCODEENDSENDSTA
輸入字符是否為A?顯示A結(jié)束NYYN條件執(zhí)行A執(zhí)行B101頁(yè)[例2.2.19]三、循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)分為設(shè)置循環(huán)初始狀態(tài)、循環(huán)體、循環(huán)控制條件三部分
1、設(shè)置初始部分:設(shè)置循環(huán)次數(shù),地址指針或其它初始狀態(tài)。
2、循環(huán)體:包括工作部分和修改部分。
3、控制部分:控制循環(huán)次數(shù)。循環(huán)結(jié)構(gòu)分為單循環(huán)和多重循環(huán)。控制方式有多種:計(jì)數(shù)控制:事先已知循環(huán)次數(shù),每次循環(huán)加或減計(jì)數(shù),并判定總次數(shù)以達(dá)到控制循環(huán)。條件控制:事先不知循環(huán)次數(shù),在循環(huán)時(shí)判定某種條件的真假達(dá)到控制循環(huán)。狀態(tài)控制:事先設(shè)定二進(jìn)制位的狀態(tài),或由外界干予,測(cè)試開(kāi)關(guān)狀態(tài),決定循環(huán)。開(kāi)始初始化循環(huán)體修改部分控制結(jié)束YN例3、累加從地址01000H開(kāi)始的5個(gè)字的內(nèi)容,并將和存入SUM
單元(一個(gè)字長(zhǎng))DATASEGMENTORG1000HABDW0123H,2A00H,52EFHDW0700H,7255HSUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,05MOVAX,0LEASI,AB
01000H01002H01004H01006H01008H0100AH0100BH23H01H00H2AHEFH52H00H07H55H72H67HF7H開(kāi)始初始SI、CX相加修改SICX=0?結(jié)束和存SUMNYSUM控制計(jì)數(shù)循環(huán)REG:ADDAX,[SI]INCSI;修改指針若用ADDSI,2INCSI則PUSHFLOOPREG;CX-1,CX=0循環(huán)。ADDSI,2MOVSUM,AXPOPFMOVAH,4CH因?yàn)锳DD影響CFINT21HCODEENDSENDSTART此題,累加和的結(jié)果是一個(gè)字,若和超出一個(gè)字,應(yīng)開(kāi)始SUMDW?,?
MOVDX,0LOOPREG在REG:ADDAX,[SI]后加
MOVSUM,AXADCDX,0MOVSUM+2,DXINCSIMOVAH,4CHINCSIINT21H根據(jù)條件控制循環(huán)(AX為帶符號(hào)數(shù))例4、編程序統(tǒng)計(jì)AX寄存器中1的個(gè)數(shù)。(采用AX=0?做為循環(huán)的條件)
CODESEGMENTASSUMECS:CODESTART:MOVCX,0;存1的個(gè)數(shù)
AGAIN:TESTAX,0FFFFHJZBSALAX,1JNCAINCCXA:JMPAGAINB:MOVAH,4CHINT21HCODEENDSENDSTART初始CX=0AX=0?逐位移到最高位CF=1?CX+1結(jié)束繼續(xù)YNYN根據(jù)狀態(tài)控制循環(huán)
BEGIN:INAL,52H;從狀態(tài)口讀
TESTAL,02;測(cè)試D1=0?
JZBEGIN;D1=0轉(zhuǎn),繼續(xù)查
INAL,50H;D1=0,數(shù)據(jù)口
MOV[DI],AL;存內(nèi)存
INCDI….….輸入狀態(tài)測(cè)試D1D1=0?輸入數(shù)據(jù)存內(nèi)存YN52H是接口中的狀態(tài)口,其中D1位等于1時(shí)表示CPU可從數(shù)據(jù)口讀數(shù)據(jù)。四、子程序結(jié)構(gòu)例5、做十進(jìn)制加法44332211+88776655DATASEGMENTADB11H,22H,33H,44H,00HBDB55H,66H,77H,88H,00HSUMDB20DUP(?)DATAENDSSTACKSEGMENTSTADB20DUP(?)
TOPEQULENGTHSTASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,
SS:STACKSTART:MOVAX,DATAMOVDS,AX初始予置SI、DIBX、CX、CF、DF調(diào)過(guò)程二進(jìn)制加法十進(jìn)制調(diào)整存結(jié)果修改地址返回LOOP處CX=0?結(jié)束NY
MOVES,AXAABPROCNEARMOVAX,STACKLODSBMOVSS,AXADCAL,[BX]MOVSP,TOPDAAMOVSI,OFFSETASTOSBMOVDI,OFFSETSUMINCBXMOVBX,OFFSETBRETMOVCX,05AABENDPCLDCODEENDSCLCENDSTARTADITI:CALLAABLOOPADITIMOVAH,4CHI
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑基礎(chǔ)工程樁基礎(chǔ)
- 2024至2030年中國(guó)工作母機(jī)專用聯(lián)軸器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)實(shí)驗(yàn)室電導(dǎo)率/電阻率計(jì)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)雙面雙花毯數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 經(jīng)管營(yíng)銷(xiāo)企業(yè)資產(chǎn)損失所得稅稅前扣除管理辦法講解
- 探究函數(shù)與方程-深入理解代數(shù)與解題技巧
- 2024年中國(guó)高強(qiáng)度鋼結(jié)構(gòu)樓承板市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)蒙娜麗莎工藝品市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)立式剝皮機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 急診病歷書(shū)寫(xiě)標(biāo)準(zhǔn)化研究計(jì)劃
- 2018年公安機(jī)關(guān)人民警察高級(jí)執(zhí)法資格試題
- 值長(zhǎng)口試試題
- 《橡皮障的應(yīng)用方法》課件
- 鐵路新職人員培訓(xùn)計(jì)劃
- 國(guó)開(kāi)電大績(jī)效與薪酬實(shí)務(wù)(河北)形考任務(wù)三參考答案
- (完整文本版)小學(xué)英語(yǔ)音標(biāo)測(cè)試100題
- 課件培訓(xùn)小鐘琴
- 亨特綜合征學(xué)習(xí)課件
- 心理咨詢技能的職業(yè)倫理與道德規(guī)范
- 2023年黑龍江事業(yè)單位公共基礎(chǔ)知識(shí)真題及答案
- 化學(xué)高二-2022-2023學(xué)年北京市海淀區(qū)高二(上)期末化學(xué)試卷
評(píng)論
0/150
提交評(píng)論