




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
匯編語言與接口技術(shù)
主講教師張玉琢學(xué)習(xí)要點(diǎn)正確定義各種符號,熟練使用地址表達(dá)式熟練掌握匯編語言的常用指令掌握符號指令的尋址方式匯編語言的格式第三章匯編語言與匯編程序第三章匯編語言與匯編程序3.23.3符號指令中的表達(dá)式符號指令的尋址方式常用指令3.4
偽指令3.13.5常用系統(tǒng)功能調(diào)用和BIOS以字母開頭的一串字符為了區(qū)別符號和數(shù)據(jù),以字母開頭的十六進(jìn)制數(shù),其前面要加一個(gè)前導(dǎo)0如:0FFH數(shù)據(jù)
FFH符號
符號匯編中的各種符號由偽指令定義,有常量、變量和標(biāo)號三類3.1符號指令中的表達(dá)式常用的有二進(jìn)制、十進(jìn)制、十六進(jìn)制和ASCII碼字符如:10,0AH,1010B,
’A’,’$’,’ABC’1、常量
—在匯編時(shí)已有確定數(shù)值的量ASCII碼字符做數(shù)值常量時(shí),需加單引號3.1.1常量和數(shù)值表達(dá)式(1)數(shù)值常量→程序中為經(jīng)常使用的數(shù)值取的名用EQU或“=”偽指令定義例:AAEQU10CC=66MOVAX,AA;AX=10MOVAX,CC;AX=66注:匯編程序不給符號常量分配存儲單元(2)符號常量2、數(shù)值表達(dá)式—由常量與運(yùn)算符組成的有意義的式子,結(jié)果為數(shù)值在匯編中允許對常量進(jìn)行三種類型的運(yùn)算:(1)算術(shù)運(yùn)算
包括+,-,×,/,MOD(求余)(2)邏輯運(yùn)算包括AND,OR,XOR,NOT(3)關(guān)系運(yùn)算
包括:EQ(=),NE(≠),LT(<),GT(>),LE(≤),GE(≥)代表存儲器的地址
變量是存儲器中的數(shù)據(jù)或數(shù)據(jù)區(qū)的符號表示變量名是數(shù)據(jù)的地址或數(shù)據(jù)區(qū)的首地址地址表達(dá)式由變量、常量、寄存器(SI、DI、BX、BP,寄存器必須位于[]中)和運(yùn)算符組成3.1.2變量和地址表達(dá)式(1)段地址—定義變量所在段的段首地址.由SEG算符指定如:SEGW;取變量W的段地址(2)偏移地址—變量所在段的段首址到該變量的字節(jié)距離.由OFFSET算符指定如:OFFSETW;取變量W的偏移地址1、存儲器分段,變量和地址表達(dá)式有三重屬性(3)類型—存取該變量中數(shù)據(jù)所需的字節(jié)數(shù)變量的類型有:字節(jié)(byte),字(word),雙字(dword),四字(qword),十字節(jié)(tbyte),一個(gè)數(shù)據(jù)分別占1,2,4,8,10個(gè)單元——一般在數(shù)據(jù)段或附加數(shù)據(jù)段中用偽指令定義格式:[變量名]DB
表達(dá)式[,……];定義字節(jié)變量[變量名]DW
表達(dá)式[,……];定義字變量[變量名]DD
表達(dá)式[,……];定義雙字變量2、變量的定義數(shù)據(jù)定義偽指令指明了變量的類型表達(dá)式確定了變量的初值(1)常量或數(shù)值表達(dá)式→存入數(shù)值(2)ASCII字符串(若串長≥2,只能用DB定義)→存入ASCII碼值(3)重復(fù)子句,格式:NDUP(表達(dá)式)→重復(fù)N次(N≥1的正整數(shù)),其值由表達(dá)式確定(4)地址表達(dá)式→可用DW或DD定義,當(dāng)?shù)刂繁磉_(dá)式為變量或標(biāo)號名時(shí),若用DW則取它的偏移地址來初始化變量;若用DD則取其偏移地址和段地址來初始化其變量(5)由以上表達(dá)式組成的序列,之間用‘,’分隔表達(dá)式可以有以下幾種形式:數(shù)據(jù)段DATA1定義的變量W1DWB3B1DB
AB$
W2DW-5,1994HB2DB4DUP(?)DDDEBB3DB2DUP(-1)DB1DUP(10,
E
);重復(fù)因子1不能省DB
13
,1,3在附加數(shù)據(jù)段DATA2中定義的變量如下:EBDB8DUP(0)EWDW
AB
,
CD
;用DW定義變量時(shí),字符串長度不超過2個(gè)字符P44例畫出數(shù)據(jù)的存儲形式9419801、標(biāo)號的三個(gè)屬性(1)段地址—定義該標(biāo)號所在段的段首址(2)偏移地址—標(biāo)號所在段的段首址到該標(biāo)號定義指令的字節(jié)距離(3)類型—兩種:
NEAR—段內(nèi)調(diào)用,F(xiàn)AR—段間調(diào)用標(biāo)號→指令地址的符號表示,也可以是過程名3.1.3
標(biāo)號(1)書寫在指令助記符前,用:定義,只能為NEAR類型
(2)用PROC…ENDP偽指令定義過程名例:CYCLE:MOVAL,[SI];定義近標(biāo)號CYCLE近標(biāo)號只能在段內(nèi)使用!例:ABCPROCFAR;定義過程名ABC為遠(yuǎn)標(biāo)號
ABCENDP2、標(biāo)號的定義
變量、標(biāo)號以及由其組成的地址表達(dá)式均有類型屬性。在編程時(shí)往往需要臨時(shí)改變原定義的變量或標(biāo)號的類型屬性,而仍保持它們原來的段地址和偏移地址屬性不變格式:類型PTR地址表達(dá)式3.1.4變量和標(biāo)號類型的變更例1:B1DB’AB$’
;定義變量B1為字節(jié)類型
WORDPTRB1;臨時(shí)改變B1的類型為字變量例2:BYTEPTR[BX+5]
;明確地址表達(dá)式[BX+5]的類型為字節(jié)例3:ADW1122H,3344H;變量A為字類型MOVAX,AMOVAL,BYTEPTRA第三章匯編語言與匯編程序3.13.3符號指令中的表達(dá)式符號指令的尋址方式常用指令3.4
偽指令3.23.5常用系統(tǒng)功能調(diào)用和BIOS匯編語言的指令格式:
[標(biāo)號:]操作碼[目的操作數(shù)],[源操作數(shù)]
;注釋
1.標(biāo)號:表示一條指令的符號地址2.操作碼規(guī)定操作的性質(zhì),表示指令所要執(zhí)行的操作3.操作數(shù)表示指令執(zhí)行過程中操作的對象(操作數(shù)/地址碼),提供操作數(shù)的地址或操作數(shù)本身,即從何處獲得操作數(shù)以及運(yùn)算結(jié)果存在何處——尋址方式。分為:立即尋址、寄存器尋址、存儲器尋址。4.注釋用于解釋程序使之便于閱讀的任何說明文字。
3.2
符號指令中的尋址方式——操作數(shù)據(jù)在指定的寄存器中
因?yàn)榧拇嫫髟贑PU內(nèi)部,所以采用寄存器尋址可提高運(yùn)行效率,特別是AX,用它存放運(yùn)算結(jié)果,則執(zhí)行指令的時(shí)間短些,所以最常用3.2.1
寄存器尋址
例:AX=2035H,BX=0178HMOVBX,AX;BX=AX=2035HADDAL,BL;AL=ADH,BL=78HAX,BX,CX,DX,SI,DI,BP,SP→16位通用寄存器AH,AL,BH,BL,CH,CL,DH,DL→8位通用寄存器傳送指令助記符目的操作數(shù)源操作數(shù)——操作數(shù)即為操作數(shù)據(jù),直接放在匯編指令中立即尋址方式只能用于源操作數(shù),主要用來給寄存器或存儲器賦初值,也可以與寄存器或存儲器操作數(shù)進(jìn)行算術(shù)邏輯運(yùn)算
例:MOV5,AL╳
3.2.2立即尋址例:MOVAL,5;將字節(jié)05H送AL,AL=05HMOVAX,18;將字0012H送AX,AX=0012HMOVBL,-1;將字節(jié)FFH送BL,BL=0FFH——操作數(shù)據(jù)在存儲器中,其偏移地址由指令直接給出(地址表達(dá)式中只有變量名和常量)3.2.3直接尋址注:段地址默認(rèn)在DS段
例:MOVAX,W該指令的源操作數(shù)地址為DS:OFFSETW直接尋址常用已定義的變量表示
例:W2DW-5,1994HB1DB’AB$’MOVAX,W2;AX=FFFBHMOVBX,W2+2;BX=1994HMOVB1+3,AL;(B1+3)=FBH區(qū)分立即尋址與直接尋址從變量中取數(shù)據(jù)屬于直接尋址方式,注意與符號常量區(qū)別例:AAEQU10MOVAX,AA;立即尋址,AX=000AHMOVAX,W2;直接尋址,AX=FFFBH如:MOVCX,[BX]
如右圖所示,若BX=0124H,則該指令執(zhí)行的操作是將0124H作為操作數(shù)的偏移地址,將當(dāng)前數(shù)據(jù)段中0124H單元中的字取出送CX,即CX=1958H→操作數(shù)為帶方括號的寄存器([SI],[DI],[BX],[BP]),寄存器的內(nèi)容為操作數(shù)據(jù)的偏移地址3.2.4間接尋址012401255819注:寄存器尋址中,寄存器內(nèi)容即為操作數(shù)據(jù);間接尋址屬于存儲器尋址,寄存器內(nèi)容為操作數(shù)據(jù)的偏移地址。只有SI,DI,BX,BP可用于間接尋址
例:MOVAX,[CX]╳
若以SI,DI,BX間址,約定段的段地址為DS寄存器
例:MOVAX,[BX];(DS:[BX])→AX若以BP間址,約定段的段地址為SS寄存器
例:MOVAX,[BP];(SS:[BP])→AL,(SS:[BP+1])→AH
3.2.4間接尋址
→操作數(shù)據(jù)在存儲器中,其偏移地址為基址寄存器BX或BP的內(nèi)容與位移量之和
EA=[BX]/[BP]+位移量
例1:MOV[BX+BUF+2],AL
或MOVBUF[BX+2],AL;AL→(DS:[BX++BUF+2])
例2:MOV6[BP],AX
或MOV[BP+6],AX;AL→SS:[BP+6],
AH
→SS:[BP+7]3.2.5基址尋址3.2.6變址尋址→操作數(shù)據(jù)在存儲器中,其偏移地址為變址寄存器SI或DI的內(nèi)容與位移量之和,與基址尋址類似
EA=[SI]/[DI]+位移量
例:MOVAX,2[SI]
或MOVAX,[SI+2]
;(DS:[SI+2])→AL,(DS:[SI+3])→AH3.2.7基址變址尋址
EA=[BX]/[BP]+[SI]/[DI]+位移量例:MOVAX,4[BX+DI]
或MOVAX,[BX+DI+4];(DS:[BX+DI+4])→AL
;(DS:[BX+DI+5])→AH
段地址由基址寄存器確定:
以BX為基址尋址,操作數(shù)在DS段以BP為基址尋址,操作數(shù)在SS段→操作數(shù)據(jù)在存儲器中,其偏移地址為指令中指定的基址寄存器和變址寄存器的內(nèi)容及位移量3項(xiàng)之和例:W為一字變量,B為一字節(jié)變量,則:
MOVAL,W[BX]╳
MOVAL,BYTEPTRW[BX]√
MOVAX,B[SI+5]╳MOVAX,WORDPTRB[SI+5]√變量名意義是取變量單元中的數(shù)據(jù),所以其類型要與另一操作數(shù)的類型一致在符號指令中的基址,變址,基址變址三種尋址中,其位移量可以是常數(shù)或符號常量,還可以是變量名。若是變量名,它給出變量所在段的偏移地址
例:將立即數(shù)35H存入字節(jié)變量BUF+5單元中
MOVBX,OFFSETBUF+5MOVBYTEPTR[BX],35H;間接尋址或:MOVBX,5MOVBUF[BX],35H;基址尋址
常以間址、基址、變址訪問一片連續(xù)的單元
例:B1DB’AB$’MOVBX,OFFSETB1;BX=0000HMOVAL,[BX];AL=41HMOVAL,[BX+1];AL=42H尋址方式小結(jié)尋址方式可分為三大類:立即尋址、寄存器尋址、存儲器尋址。直接尋址、間接尋址、基址尋址、變址尋址、基址變址尋址都屬于存儲器尋址。立即尋址的操作數(shù)為立即數(shù);寄存器尋址的操作數(shù)為寄存器;存儲器尋址的操作數(shù)為地址表達(dá)式。
地址表達(dá)式通式為:
[變量+寄存器+常量]
也可表示為:變量[寄存器+常量],此種形式理解為,寄存器+常量是變量定義的數(shù)據(jù)區(qū)的位移量。尋址方式小結(jié)如果地址表達(dá)式中只出現(xiàn)寄存器,則一定要加‘[]’;如果地址表達(dá)式中沒有寄存器,則可加‘[]’,也可不加如果地址表達(dá)式中只有寄存器,則為間接尋址;如果地址表達(dá)式中只有變量,則為直接尋址;如果地址表達(dá)式中除有寄存器外還有變量或者常量,則為基址尋址或變址尋址。存儲器存取方式約定段段更換偏移地址1.存儲器尋址時(shí)段寄存器的基本約定和段更換見下表所示:(P50表2-1)取指令CS不允許IP堆棧操作(PUSH,POP,CALL,RET等)SS不允許SP數(shù)據(jù)存取(BP間址、基址除外)DSCSSSESEABP間址,基址數(shù)據(jù)存取SSCS,DS,ESEA字符串處理指令的源串DSCS,SS,ESSI字符串處理指令的目的串ES不允許DI3.2.8存儲器尋址中段地址的確定例:MOVES:[DI],AL;AL→ES:[DI]MOVES:2000H,AL;AL→ES:2000H
其中,ES為前綴字節(jié)當(dāng)要否認(rèn)以上默認(rèn)狀態(tài),到其他段尋找操作數(shù)時(shí),必須用跨段前綴指明操作數(shù)所在段的段寄存器名2.段超越或段更換段更換只是用來臨時(shí)改變變量、標(biāo)號、地址表達(dá)式的段屬性,且只在所出現(xiàn)的語句中有效,不改變偏移地址和類型第三章匯編語言與匯編程序3.1符號指令中的表達(dá)式符號指令的尋址方式常用指令3.2
偽指令3.33.43.5常用系統(tǒng)功能調(diào)用和BIOS
①數(shù)據(jù)傳送指令
②加減運(yùn)算指令
③位操作(邏輯運(yùn)算)指令
注:學(xué)習(xí)時(shí)注意指令格式及功能3.3常用指令
1.數(shù)據(jù)傳送指令格式:MOVdest,source
目的操作數(shù)源操作數(shù)功能:將一個(gè)字節(jié)或一個(gè)字操作數(shù)據(jù)從源傳送至目的地址中,源保持不變3.3.1數(shù)據(jù)傳送類指令指令特點(diǎn):將數(shù)據(jù)從一個(gè)部位傳送到另一部位.不影響數(shù)據(jù)的狀態(tài)標(biāo)志位.MOV指令的9種形式:MOVREG,REGMOVREG,IMMMOVMEM,IMMMOVMEM,REGMOVREG,MEMMOVSEGREG,REG;CS除外MOVREG,SEGREGMOVSEGREG,MEM;CS除外MOVMEM,SEGREG一個(gè)指令中,兩操作數(shù)類型必須一致至少1個(gè)操作數(shù)的類型要明確,不能出現(xiàn)二義性代碼段寄存器CS和立即數(shù)均不能作為目的操作數(shù)源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲器操作數(shù)存儲器類型由地址表達(dá)式的變量名確定立即數(shù)的類型屬性不明確(字、字節(jié)…).在立即數(shù)送存儲器的指令中,若存儲器操作數(shù)的類型不明確,則必需使用算符來明確其中一個(gè)操作數(shù)的屬性注意:
格式:XCHGdest,source
功能:將源地址與目的地址中的內(nèi)容互換
XCHGREG,REGXCHGREG,MEMXCHGMEM,REG2.數(shù)據(jù)交換指令例:數(shù)據(jù)段中有兩個(gè)字變量W1和W2,編寫程序段將兩個(gè)字變量互換
W1DW1234HW2DW5678H①用數(shù)據(jù)交換指令實(shí)現(xiàn):
MOVAX,W1;AX=1234HXCHGAX,W2;AX=5678H,W2=1234HMOVW1,AX;W1=5678H②僅用MOV指令實(shí)現(xiàn):
MOVAX,W1MOVBX,W2MOVW1,BXMOVW2,AX③用堆棧操作指令:PUSHW1PUSHW2POPW1POPW2練習(xí):寫出把首地址為BLOCK的字?jǐn)?shù)組的第6個(gè)字送到DX寄存器的指令。要求使用以下幾種尋址方式:⑴寄存器間接尋址⑵基址尋址⑶基址變址尋址加減運(yùn)算的操作數(shù):注:兩操作數(shù)需類型相同,不能同為存儲器加減法指令執(zhí)行后的結(jié)果將影響狀態(tài)標(biāo)志Flag3.3.2加減運(yùn)算指令
1.加法類指令
(1)加法指令A(yù)DD格式:ADDdest,source操作:source+dest→dest
即將源操作數(shù)據(jù)與目的操作數(shù)據(jù)相加,結(jié)果存入目的地址中,源地址內(nèi)容不變(2)加進(jìn)位的加法指令A(yù)DC格式:ADCdest,source操作:dest+source+CF→dest
;CF為前面指令產(chǎn)生的CF例3個(gè)32位無符號數(shù)12345678H、8765ABCDH和2468FEDCH相加,其和(仍為32位無符號數(shù))放DX和AX中
程序段如下:
MOVDX,1234HMOVAX,5678HADDAX,0ABCDHADCDX,8765HADDAX,0FEDCHADCDX,2468H
格式:INCdest操作:dest+1→dest
例:MOVBX,1INCBX;BX=0002H該指令不影響CF,對其它標(biāo)志位的影響同ADD單操作數(shù)指令,只能為REG,MEM,類型要明確,不能出現(xiàn)二義性例:INCCL√INC[SI]
×→INCBYTEPTR[SI]√INC2000H
×該指令常用于修改偏移地址和計(jì)數(shù)次數(shù)(3)增量指令I(lǐng)NC例:有兩個(gè)無符號字?jǐn)?shù)組,每個(gè)數(shù)組20個(gè)字,分別放在8000H和9000H開始的存儲單元中,要求進(jìn)行數(shù)組對應(yīng)字單元相加運(yùn)算,得到的和放在8000H開始的內(nèi)存單元中,然后將AX清0MOVSI,8000H
MOVDI,9000HMOVCX,20LP1:MOVAX,[SI]ADDAX,[DI]
MOV[SI],AX
INCSIINCSIINCDIINCDIDECCXJNZLP1;轉(zhuǎn)移指令,結(jié)果不為0則轉(zhuǎn)到LP1,否則轉(zhuǎn)到下一條指令MOVAX,0
格式:DECdest
操作:dest-1→dest(1)減法指令SUB
2.減法類指令格式:SUBdest,source操作:dest-source→dest(2)帶借位減指令SBB格式:SBBdest,source操作:dest-source-CF
→dest;CF為前面指令產(chǎn)生的進(jìn)位(借位)(3)減量指令DEC例:2個(gè)32位無符號數(shù)8765ABCDH和2468FEDCH相減,其差送DX和AX。程序段如下:
MOVAX,0ABCDHSUBAX,0FEDCH;CF=18765ABCDMOVDX,8765H-2468FEDCSBBDX,2468H;CF=062FCACF1注:減法類指令對標(biāo)志位的影響,除將進(jìn)位改為借位外,與加法類指令相同DEC不影響CF,其余標(biāo)志均受影響
3.比較指令CMP
格式:CMPdest,source
操作:dest-source執(zhí)行減操作,只影響標(biāo)志,不改變操作數(shù)主要用來判斷兩數(shù)的大小是否相等后面常跟條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果實(shí)現(xiàn)程序的分支例:在自BLOCK開始的內(nèi)存緩沖區(qū)中,有100個(gè)帶符號數(shù),要找出其中的最大值,把它存放到MAX單元中。
MOVBX,OFFSETBLOCKMOVAX,[BX]INCBXINCBXMOVCX,
99AGAIN:CMPAX,[BX]JGNEXTMOVAX,[BX]NEXT:INCBXINCBXDECCXJNZAGAINMOVMAX,AXHLT
格式:NEGdest操作:將操作數(shù)地址中的內(nèi)容求補(bǔ)后再送入操作數(shù)地址中該指令是求補(bǔ)操作,而不是求補(bǔ)碼操作單操作數(shù)指令,操作數(shù)只能是REG,MEM影響標(biāo)志,影響規(guī)律同減法指令3.3.3位操作指令1.邏輯運(yùn)算指令(1)求補(bǔ)指令若將執(zhí)行求補(bǔ)指令前后的數(shù)均視為補(bǔ)碼數(shù),則求補(bǔ)指令將該數(shù)變?yōu)榻^對值相等符號相反的另一個(gè)數(shù)。例:MOVAX,0FFFBH;AX=FFFBH
NEGAX;AX=0005H例:MOVBX,000AH;BX=000AHNEGBX;BX=FFF6H
格式:NOTdest操作:將操作數(shù)地址中的內(nèi)容逐位取反后再送回操作數(shù)地址中注:該指令只是執(zhí)行求反操作,而不是求反碼指令,對符號位也求反
該指令不影響標(biāo)志位(2)求反指令NOT
格式:ANDdest,source操作:dest∧source→dest作用:取出目的操作數(shù)中與源操作數(shù)的“1”對應(yīng)的位例:MOVAX,0F6E5HANDAX,000FH;AX=0005H(3)邏輯與指令A(yù)ND
格式:ORdest,source
操作:dest∨source→dest
作用:將目的操作數(shù)和源操作數(shù)中的所有“1”位拼合在一起例:MOVBX,7B00H
ORBX,0056H;BX=7B56H→對應(yīng)“1”位置1,對應(yīng)“0”位則不變(4)邏輯或指令OR
格式:XORdest,source
操作:dest⊕source→dest,
作用:將REG清0,也可將目的操作數(shù)中的某些位取反
例:MOVCX,35EBH
XORCX,CX;CX=0000H思考:用什么方法可以實(shí)現(xiàn)對通用寄存器清0?
XORAX,AXMOVAX,0SUBAX,AXANDAX,0
(5)邏輯異或指令XOR注:AND、OR、XOR指令均為雙操作數(shù)指令,對源操作數(shù)和目的操作數(shù)的要求同加減指令A(yù)ND、OR、XOR三條邏輯指令均將標(biāo)志位CF和OF清0,對PF、SF、ZF的影響同加操作此類指令常用于拆字、拼字例:將AX的高4位,CX的中間8位,BX的低4位拼合起來,結(jié)果放CX中,程序段如下:如:AX=1234H,BX=5678H,CX=9ABCH→CX=1AB8HANDAH,0F0H;取AX高4位,AH=10HANDBL,0FH;取BX低4位,BL=08HANDCX,0FF0H;取CX中間8位,CX=0AB0HORCH,AH;拼字CH=1AHORCL,BL;CL=0B8HCX=1AB8H目的操作數(shù)可以是8位或16位的REG或MEM源操作數(shù)為移位的次數(shù),只能是CL或1以CL為源操作數(shù)的移位指令執(zhí)行以后,CL的值不變2.移位指令移位指令為雙操作數(shù)指令,用于將目的操作數(shù)中的8位或16位二進(jìn)制數(shù)移位
格式:SHRdest,source操作:;最后移出位移至CF用0填補(bǔ)已空出的位
例:AL=abcdefgh,CL=3SHRAL,1;執(zhí)行后,AL=0abcdefg,CF=h例:AL=abcdefgh,CL=3SHRAL,CL;執(zhí)行后,AL=000abcde,CF=fdestCF0(1)邏輯右移SHR
格式:SARdest,source操作:;最后移出位移至CF,最高位向右移動(dòng)同時(shí)保持不變例:AL=abcdefghSARAL,1;執(zhí)行后,AL=aabcdefg,CF=hdestCF(2)算術(shù)右移SAR注:邏輯右移SHR一位,等于對無符號數(shù)除以2運(yùn)算
例:MOVAL,0CH;AL=12SHRAL,1;AL=6算術(shù)右移SAR一位,等于對符號數(shù)除以2運(yùn)算
例:MOVCH,80H;CH=80H→-128SARCH,1;CH=C0H→-64
格式:RCRdest,source操作:;前面指令產(chǎn)生的CF移至最高位
例:AL=abcdefgh,CF=i,CL=4RCRAL,CL執(zhí)行后,AL=fghiabcd,CF=edestCF⑶帶進(jìn)位循環(huán)右移RCR例1編寫程序段實(shí)現(xiàn)將字變量W中的無符號數(shù)除以8,商和余數(shù)分別放入字變量QUOT和字節(jié)變量REMA中思路:用邏輯右移1位的指令,將被除數(shù)按低位到高位的順序1次移1位.每次移入CF中的余數(shù),用帶進(jìn)位的循環(huán)右移指令移入字節(jié)變量REMA中.3位余數(shù)都移入字節(jié)變量REMA中后再用邏輯右移指令右移5位將3位余數(shù)從D7~D5移至D2~D0.指令應(yīng)用舉例W DW65525QUOT DW0REMA DB0MOVAX,W;AX=1111111111110101BSHRAX,1;AX=0111111111111010B,CF=1RCRREMA,1;REMA=10000000BSHRAX,1;AX=0011111111111101B,CF=0RCRREMA,1;REMA=0100
0000BSHRAX,1;AX=0001111111111110B,CF=1RCRREMA,1;REMA=1010
0000BMOVQUOT,AX;QUOT=0001111111111110BMOVCL,5SHRREMA,CL;REMA=00000101B
格式:SHLdest,sourceSALdest,source操作:;最后移出位移至CF用0填補(bǔ)已空出位
例:AL=abcdefghSHLAL,1;執(zhí)行后,AL=bcdefgh0,CF=adestCF0(4)算術(shù)/邏輯左移SAL/SHL
格式:RCLdest,source操作:;前面指令產(chǎn)生的CF移至最低位
例:AL=abcdefgh,CF=iRCLAL,1執(zhí)行后,AL=bcdefghi,CF=adestCF(5)帶進(jìn)位循環(huán)左移RCL
格式:RORdest,source操作:;右邊移出位移入CF,同時(shí)移入左邊空出位例:AL=abcdefghRORAL,1
執(zhí)行后,AL=habcdefg,CF=hdestCF(6)循環(huán)右移ROR
格式:ROLdest,source操作:;左邊移出位移入CF,同時(shí)移入右邊空出位例:將相鄰字節(jié)變量B1(低地址)和B2中的兩個(gè)8位二進(jìn)制數(shù)交換
MOVCL,8ROLWORDPTRB1,CLdestCF(7)循環(huán)左移ROL思路:(W)×10=(W)×(23+2)=(W)×23+(W)×216位無符號數(shù)乘以2和乘以8分別用左移1位和左移3位實(shí)現(xiàn)16位無符號乘以2有可能大于16位無符號數(shù)的最大值65535,因此要將它擴(kuò)展為32位的無符號數(shù)再乘以2,即用邏輯左移雙字來實(shí)現(xiàn)乘以2的操作
例2編寫程序段將字變量W中的無符號數(shù)乘以10,積放字變量J2中指令應(yīng)用舉例W DW65525J2DW0,0MOVAX,WXORDX,DX ;DX清0,將16位無符號數(shù)擴(kuò)展為32位SHLAX,1 ;乘以2RCLDX,1MOVJ2+2,DX;保存乘以2的結(jié)果MOVJ2,AXSHL,AX,1 ;W中的內(nèi)容乘以4RCLDX,1SHLAX,1 ;W中的內(nèi)容乘以8RCLDX,1ADDJ2,AX ;2(W)+8(W)ADCJ2+2,DX
例3字變量NUMW中有一無符號數(shù),編寫程序,計(jì)算(NUMW)
16+30并將結(jié)果送入NUMW+2和NUMW
NUMWDW1234H,0 MOVCL,4ROLNUMW,CL
;將NUMW字單元中的1234H變成2341H
MOVAX,000FH ANDAX,NUMW;取低位字的最低4位AX=0001H
ANDNUMW,0FFF0H;清低位字的最低4位(NUMW)=2340H
ADDNUMW,30;低位字加30
ADCAX,0;將低位字加30的進(jìn)位(若產(chǎn)生)加入高位字
MOVNUMW+2,AX
例4將AX中小于256大于0的3位BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),存入字節(jié)變量SB中
思路:用(百位
10+十位)
10+個(gè)位的方法將BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)如將BCD數(shù)255H轉(zhuǎn)換為二進(jìn)制數(shù)11111111B,運(yùn)算的過程為:SBDB0MOVCL,2SHLAH,1 ;百位×2MOVSB,AH ;暫存2×百位SHLAH,CL ;百位再乘以4得23×百位ADDAH,SB ;23×百位+2×百位得10×百位MOVSB,AL;暫存十位和個(gè)位SHRAL,CL;取十位SHRAL,CLADDAH,AL;10×百位+十位MOVAL,SB;十位和個(gè)位送ALSHLAH,1;(10百位+十位)
10MOVSB,AHSHLAH,CLADDSB,AH ;23(10百位+十位)+2(10百位+十位)ANDAL,0FH;取個(gè)位ADDSB,AL;加上個(gè)位第三章匯編語言與匯編程序3.13.3符號指令中的表達(dá)式符號指令的尋址方式常用指令3.2
偽指令3.43.5常用系統(tǒng)功能調(diào)用和BIOS參見教材P66
一般程序由三個(gè)段組成.教材中程序的小寫字母部分均為程序結(jié)構(gòu)3.4.7宏匯編源程序的一般格式stacksegmentstack’stack’;定義堆棧段及堆棧長度dw32dup(0)
stackends
datasegment;定義數(shù)據(jù)段
:
dataends
codesegment;定義代碼段
beginprocfar;將匯編源程序視為DOS下的子程序
assumecs:code,ss:stack,ds:data
pushds;PSP的段地址(段地址在DS中)進(jìn)棧
subax,ax
pushax;PSP首地址的偏移地址進(jìn)棧
movax,data;設(shè)置用戶數(shù)據(jù)段movds,ax
……
ret;PSP的首地址出棧送IP和CS
beginendp
codeends
endbegin格式:過程名PROC[NEAR]或FAR
:
過程名ENDP注:PROC和ENDP必須成對出現(xiàn)PROC和ENDP前的過程名必須有且相同過程的類型由PROC的操作數(shù)確定,默認(rèn)為NEAR類型由過程定義偽指令定義的子程序,通過CALL指令調(diào)用PROC和ENDP之間至少有一條子程序返回指令RET,以返回調(diào)用它的程序3.4偽指令3.4.1過程的定義格式:段名SEGMENT[定位方式][組合方式][‘類別名’]……
段名ENDSSEGMENT和ENDS必須成對出現(xiàn),且前面的“段名”相同三個(gè)可選項(xiàng)主要用于多模塊化程序設(shè)計(jì),以告訴LINK程序各模塊間的通信方式和各段間的組合方式,從而把各模塊正確地連接在一起段名用來表示段地址SEGMENT的三個(gè)可選擇操作數(shù)3.4.2段的定義
組合方式提供本段同其他段的組合關(guān)系
(1)[NONE]無組合方式
系統(tǒng)隱含的組合方式.表示本段與其他段邏輯上不發(fā)生關(guān)連(2)
STACK將本段與其他模塊中所有STACK組合方式的同名段組合成一個(gè)堆棧段
一個(gè)程序的所有模塊中至少有一個(gè)STACK段類別名是用單引號括起來的字符串,連接時(shí)將同類別名的所有段(段名可以不同)存放在連續(xù)的存儲區(qū)典型的類別名有:DATA,CODE,STACK
定位方式表明如何將經(jīng)組合后的段定位到存儲器中(1)[PARA](節(jié))隱含的定位方式.規(guī)定段的起始地址總是16的整數(shù)倍,即段首址低四位為零(2)WORD
(字)段從偶地址開始,段間可能留1個(gè)字節(jié)間隙(3)Byte(字節(jié))本段可從任何地址開始,段間不留空隙(4)Page(頁)段的起始地址總是256的整數(shù)倍,即低8位為零用$表示,記錄正在被匯編程序翻譯的指令的地址例:DATASEGMENT;段定義
BUFDB’0123456789ABCDEF’COUNTEQU$-BUF;定義常量COUNT=16
DATAENDS$的值由ORG設(shè)置,格式為:
ORG
數(shù)值表達(dá)式;$=數(shù)值表達(dá)式的值3.4.3匯編地址計(jì)數(shù)器
源程序在代碼段的開始需要對段寄存器與段之間的關(guān)系作假定,以便匯編程序根據(jù)給定的偏移地址和段寄存器計(jì)算出正確的物理地址
格式:
ASSUME段寄存器:段名[,段寄存器:段名,……]
注:ASSUME只是告訴匯編程序段寄存器與段間的對應(yīng)關(guān)系,并沒有將段首址置入對應(yīng)的段寄存器中。程序最后運(yùn)行時(shí),CS和SS的內(nèi)容由系統(tǒng)自動(dòng)設(shè)置,但DS和ES必須由程序?qū)⑵涠问字贩謩e置入
3.4.4段寄存器的假定格式:END[表達(dá)式]功能:源程序的最后一個(gè)語句,標(biāo)志整個(gè)源程序結(jié)束,即告訴匯編程序,匯編到此結(jié)束表達(dá)式為可選項(xiàng),必須是存儲器地址,即程序的啟動(dòng)地址,常為過程名不帶表達(dá)式,則該程序不能單獨(dú)運(yùn)行,只是供其他程序調(diào)用的子模塊3.4.5源程序的結(jié)束第三章匯編語言與匯編程序3.13.3符號指令中的表達(dá)式符號指令的尋址方式常用指令3.2
偽指令3.4常用系統(tǒng)功能調(diào)用和BIOS3.5
IBMPC微機(jī)系統(tǒng)為匯編用戶提供了兩個(gè)程序接口,一個(gè)是DOS系統(tǒng)功能調(diào)用,另一個(gè)是ROM中的BIOS(BasicInput/OutpuTSystem)。它們由一系列中斷服務(wù)子程序構(gòu)成,由軟中斷指令I(lǐng)NTN
來調(diào)用,通過中斷返回指令I(lǐng)RET返回3.5常用系統(tǒng)功能調(diào)用和BIOS
1、調(diào)用的一般過程:置入口參數(shù)功能調(diào)用號→AH執(zhí)行INT21H分析出口參數(shù)視具體情況而定3.5.1系統(tǒng)功能調(diào)用
調(diào)用格式:
MOVAH,1INT21H
入口:無入口參數(shù)出口:鍵入字符ASCII碼值在AL中,回顯2、常用功能調(diào)用
參見P76表示2-3(1)1號功能調(diào)用——鍵入并顯示一個(gè)字符
例1:設(shè)計(jì)一程序段,從鍵盤讀入兩個(gè)1位的十進(jìn)制數(shù),將它們相加后把結(jié)果存入AL中。MOVAH,01INT21h;從鍵盤讀入第一個(gè)數(shù)的ASCII碼,存入AL。
SUBAL,30hMOVBL,AL;將ASCII碼轉(zhuǎn)換為十進(jìn)制數(shù)轉(zhuǎn)存入BL
MOVAH,01INT21H;從鍵盤讀入第二個(gè)數(shù)的ASCII碼,存入AL。
SUBAL,30H;;將第2個(gè)數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),存入ALADDAL,BL
調(diào)用格式:
MOVDL,待顯示字符的ASCIIMOVAH,2INT21H
入口:輸出字符的ASCII送DL
出口:無出口參數(shù)例:顯示字符’B’
MOVAH,2
MOVDL,’B’
INT21H(2)2號功能調(diào)用——顯示器顯示一個(gè)字符
例2:從鍵盤輸入一個(gè)字符,并同時(shí)在顯示屏上輸出,當(dāng)鍵入字符‘$’時(shí),則停止操作。DON1:MOVAH,O1H;置單字符輸入INT21HCMPAL,‘$’;是結(jié)束字符嗎JZDON2;是,轉(zhuǎn)向DON2MOVDL,ALMOVAH,02H ;顯示輸出字符INT21HJMPDON1DON2:INT20H;程序結(jié)束
調(diào)用格式:
MOVDX,待顯示字符串的首偏移地址
MOVAH,9INT21H
入口:DS:DX置字符串首地址,字符串以‘$’結(jié)束出口:無出口參數(shù)(3)9號功能調(diào)用——顯示器顯示字符串例:顯示A…Z26個(gè)字符方法一:用2號功能調(diào)用,單個(gè)字符依次輸出方法二:定義一個(gè)存儲區(qū),存放26個(gè)字符,并以$結(jié)束,用9號功能調(diào)用輸出字符串OBUFDB’ABCD…XYZ$’︰MOVDX,OFFSETOBUFMOVAH,9INT21HOBUF’A’’B’’Z’’$’︰
調(diào)用格式:
MOVDX,數(shù)據(jù)區(qū)的首偏移地址
MOVAH,10INT21H
變量數(shù)據(jù)區(qū)IBUF應(yīng)在DS數(shù)據(jù)段中事先定義,其定義格式為:
IBUFDB數(shù)據(jù)區(qū)大小,0,數(shù)據(jù)區(qū)大小DUP(0)(4)10號功能調(diào)用——鍵入字符串
存放字符串?dāng)?shù)據(jù)區(qū)的首地址在DS:DX中
數(shù)據(jù)區(qū)大小是一無符號數(shù),可以為0~255
第1個(gè)字節(jié)指出數(shù)據(jù)區(qū)能容納的最大字節(jié)數(shù)(1~
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上半年安順市人民政府辦公室招考駕駛員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽馬鞍山市退役軍人事務(wù)局招聘編外聘用人員2人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025北京京能延慶熱力有限責(zé)任公司招聘高校應(yīng)屆畢業(yè)生2人筆試參考題庫附帶答案詳解
- 2025年上半年安徽馬鞍山博望區(qū)政府部門招聘派遣制人員17人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽滁州市鳳陽縣信訪局招聘信訪信息錄入人員10人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽滁州鳳陽縣部分單位第二次招聘編外緊缺專業(yè)技術(shù)人員25人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽安慶懷寧縣事業(yè)單位招考(93人)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽安慶市市直事業(yè)單位招聘工作人員(第二批)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽安慶太湖縣事業(yè)單位招聘工作人員139人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽合肥長豐縣水湖鎮(zhèn)招聘村(社區(qū))后備干部12人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 神經(jīng)外科主要治病
- 農(nóng)資打假監(jiān)管培訓(xùn)
- DB35T 2056-2022 城市軌道交通綜合監(jiān)控系統(tǒng)網(wǎng)絡(luò)安全實(shí)施要求
- 高中化學(xué)合格考重點(diǎn)知識點(diǎn)必背小節(jié)
- 雙梁橋式起重機(jī)小車改造方案
- 新能源發(fā)電技術(shù) 課件 第一章-新能源發(fā)電概述
- 《我的伯父魯迅先生》課件
- 青格達(dá)湖自然保護(hù)區(qū)外來入侵植物調(diào)查
- 中醫(yī)醫(yī)療技術(shù)手冊2013普及版
- 部編版六年級下冊數(shù)學(xué)教學(xué)計(jì)劃(及進(jìn)度表)
- 會計(jì)學(xué)生學(xué)情分析總結(jié)
評論
0/150
提交評論