版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2024年3月19日第1頁匯編語言語句格式及運(yùn)算符1偽指令2匯編語言程序設(shè)計(jì)方法3主要內(nèi)容2024年3月19日第2頁基本概念
1、用指令助記符、符號(hào)地址、標(biāo)號(hào)、偽指令等符號(hào)書寫程序的語言稱為匯編語言。2、用匯編語言編寫的程序稱為源程序或匯編語言源程序。
3、用匯編語言編寫的程序必須翻譯成由機(jī)器代碼組成的目標(biāo)程序,這個(gè)翻譯過程稱為匯編(Assemble)。4、用來完成匯編過程的系統(tǒng)程序稱為匯編程序(Assembler)。小匯編ASM宏匯編MASM2024年3月19日第3頁§4.1匯編語言語句格式及組成匯編語言源程序語句類型指令性語句:主要由CPU指令組成指示性語句:主要由偽操作組成,又稱偽指令匯編語言語句的格式[標(biāo)識(shí)符][:]指令助記符[操作數(shù)][;注解]LOOPER:MOVAL,DATA[SI]DATA1DB0F8H,60H,0ACH指令偽指令P1112024年3月19日第4頁1.標(biāo)識(shí)符給指令、常數(shù)或某一存儲(chǔ)單元地址所起的名字。常用作一段程序或一個(gè)數(shù)據(jù)塊的開頭,以便其它語句訪問。(1)由字母(A~Z、a~z),數(shù)字(0~9)或特殊字符(@、—、?、$)組成;(2)數(shù)字不能作第一個(gè)字符,“?”不能單獨(dú)使用;(3)標(biāo)號(hào)最長為31個(gè)字符,若超過則保留前31個(gè)為有效標(biāo)識(shí)符。組成規(guī)則:(4)標(biāo)號(hào)可以是常量名、標(biāo)號(hào)名、變量名、過程名等;(5)標(biāo)號(hào)不能是保留字。保留字是在匯編語言中有特定意義的標(biāo)記,包括指令、偽指令、寄存器名和運(yùn)算符等。2024年3月19日第5頁當(dāng)標(biāo)識(shí)符后跟冒號(hào)時(shí),表示它代表該行指令的起始地址。若一條指令前有標(biāo)號(hào),則程序中其它地方就可以引用此標(biāo)號(hào)。NEAR段內(nèi)引用FAR段間引用有冒號(hào)無冒號(hào)當(dāng)標(biāo)識(shí)符后不跟冒號(hào)時(shí),可能是標(biāo)號(hào),也可能是變量。BYTE、WORD、DWORD、QWORD、TBYTE等指令性語句中,名字可是標(biāo)號(hào);
指示性語句中,名字可是變量名、段名、過程名等。對(duì)于匯編程序來說,標(biāo)號(hào)與變量是類似的,都是存儲(chǔ)單元的地址,只是標(biāo)號(hào)對(duì)應(yīng)的存儲(chǔ)單元中存放的是指令;而變量所對(duì)應(yīng)的存儲(chǔ)單元中存放的是數(shù)據(jù)。INPUT:INAL,DXINPUTINAL,DXDATA1DB12H2024年3月19日第6頁2.指令助記符表示執(zhí)行的操作的性質(zhì),可以是CPU的指令,也可是偽指令。若指令帶有前綴(REP、REPE…),則指令前綴和操作碼間要用空格分開。3.操作數(shù)是指令操作的對(duì)象??梢允菙?shù)據(jù)本身,也可以是指出如何獲得操作數(shù)的信息。當(dāng)操作數(shù)超過一個(gè)時(shí),互相間應(yīng)用逗號(hào)隔開??勺鳛椴僮鲾?shù)的有:立即數(shù)、寄存器名、存儲(chǔ)單元地址、標(biāo)號(hào)、變量和表達(dá)式等2024年3月19日第7頁⑴常數(shù)十進(jìn)制數(shù)、二進(jìn)制數(shù)B、八進(jìn)制數(shù)O、十六進(jìn)制數(shù)H注:第一個(gè)字符是A~F時(shí),字符前應(yīng)加“0”十進(jìn)制浮點(diǎn)數(shù):23E-2、8.75E-4十六進(jìn)制實(shí)數(shù):后跟RASCII常數(shù):用單引號(hào)括起來?!瓵’、‘CD’、‘179’、‘$’⑵寄存器AH、CL、AX、DX、BP、DI、SS、CS…⑶標(biāo)號(hào)標(biāo)號(hào)代表一條指令的符號(hào)地址,所以可作為轉(zhuǎn)移、過程調(diào)用CALL及循環(huán)控制LOOP等指令的操作數(shù)。2024年3月19日第8頁⑷變量是存儲(chǔ)器中某數(shù)據(jù)區(qū)的名字,在指令中可作為存儲(chǔ)器操作數(shù)。MOVAX,DATA1⑸表達(dá)式數(shù)值表達(dá)式:產(chǎn)生數(shù)值結(jié)果,有大小,無屬性地址表達(dá)式:是一個(gè)表示存儲(chǔ)器地址的變量或標(biāo)號(hào)4.注解可有可無;在注解前要加上分號(hào);注解對(duì)匯編后產(chǎn)生的目標(biāo)程序無影響。MOVAX,DATA1+2ADDAL,VALAND0FH2024年3月19日第9頁§4.2匯編語言的運(yùn)算符TEXT算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符P1172024年3月19日第10頁TEXT算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符算術(shù)運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+42024年3月19日第11頁TEXT算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+4邏輯運(yùn)算符注意:它們同時(shí)也是8088的指令助記符。作為運(yùn)算符是在程序匯編時(shí)計(jì)算的,而作為指令助記符,則是在程序執(zhí)行時(shí)計(jì)算的。ANDDX,0CHOR0FEHAND、OR、NOT、XOR2024年3月19日第12頁算術(shù)運(yùn)算符TEXT邏輯運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+4注意:作為運(yùn)算符是在程序匯編時(shí)計(jì)算的,而作為指令助記符,則是在程序執(zhí)行時(shí)計(jì)算的。ANDDX,0CHOR0FEHAND、OR、NOT、XOR關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符關(guān)系運(yùn)算符EQ、NE、LT、GT、LE、GE關(guān)系運(yùn)算的結(jié)果始終是數(shù)字值。若關(guān)系不成立,則結(jié)果為0;否則為0FFFFH。MOVBX,PORTLT5若PORT的值小于5,則匯編后產(chǎn)生的語句為MOVBX,0FFFFH;反之則為MOVBX,02024年3月19日第13頁算術(shù)運(yùn)算符TEXT邏輯運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+4注意:作為運(yùn)算符是在程序匯編時(shí)計(jì)算的,而作為指令助記符,則是在程序執(zhí)行時(shí)計(jì)算的。ANDDX,0CHOR0FEHAND、OR、NOT、XOR關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符EQ、NE、LT、GT、LE、GE關(guān)系運(yùn)算的結(jié)果始終是數(shù)字值。若關(guān)系不成立,則結(jié)果為0;否則為0FFFFH。MOVBX,PORTLT5屬性運(yùn)算符用來給指令中的操作數(shù)指定一個(gè)臨時(shí)屬性,而暫忽略當(dāng)前的屬性。PTR
用于指定存儲(chǔ)器操作數(shù)的類型。INCBYTEPTR[BX][SI]MOVAL,BYTEPTRBUFJMPFARPTRNEXTSHORT
僅用于無條件轉(zhuǎn)移指令,指出轉(zhuǎn)移的標(biāo)號(hào)在下一條指令的-128~127個(gè)字節(jié)范圍內(nèi)。2024年3月19日第14頁EQ、NE、LT、GT、LE、GE算術(shù)運(yùn)算符TEXT邏輯運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+4注意:它們同時(shí)也是8088的指令助記符。作為運(yùn)算符是在程序匯編時(shí)計(jì)算的,而作為指令助記符,則是在程序執(zhí)行時(shí)計(jì)算的。ANDDX,0CHOR0FEHAND、OR、NOT、XOR關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符關(guān)系運(yùn)算的結(jié)果始終是數(shù)字值。若關(guān)系不成立,則結(jié)果為0;否則為0FFFFH。MOVBX,PORTLT5用來給指令中的操作數(shù)指定一個(gè)臨時(shí)屬性,而暫忽略當(dāng)前的屬性。PTR
用于指定存儲(chǔ)器操作數(shù)的類型。SHORT
指出轉(zhuǎn)移的標(biāo)號(hào)在下一條指令的-128~127個(gè)字節(jié)范圍內(nèi)。取值運(yùn)算符SEG用于取存儲(chǔ)單元地址的段值DATASEGMENTBUF1DB100DUP(0)BUF2DW200DUP(20H)DATAENDSMOVAL,TYPEBUF2;(AL)=2MOVBL,LENGTHBUF2;(BL)=200MOVCX,SIZEBUF2;(CX)=400OFFSET用于取地址的偏移量LENGTH計(jì)算一個(gè)存儲(chǔ)區(qū)單元的個(gè)數(shù)SIZE計(jì)算一個(gè)存儲(chǔ)區(qū)單元的字節(jié)總數(shù)TYPE將變量或標(biāo)號(hào)類型屬性用數(shù)字表示BYTEWORDDWORDNEARFAR124-1-22024年3月19日第15頁EQ、NE、LT、GT、LE、GE算術(shù)運(yùn)算符TEXT邏輯運(yùn)算符+、-、×、/、MOD(取余)19/7結(jié)果是219MOD7結(jié)果是5MOVAX,DX/2LEASI,TABLE+4注意:它們同時(shí)也是8088的指令助記符。作為運(yùn)算符是在程序匯編時(shí)計(jì)算的,而作為指令助記符,則是在程序執(zhí)行時(shí)計(jì)算的。ANDDX,0CHOR0FEHAND、OR、NOT、XOR關(guān)系運(yùn)算符屬性運(yùn)算符取值運(yùn)算符關(guān)系運(yùn)算的結(jié)果始終是數(shù)字值。若關(guān)系不成立,則結(jié)果為0;否則為0FFFFH。MOVBX,PORTLT5用來給指令中的操作數(shù)指定一個(gè)臨時(shí)屬性,而暫忽略當(dāng)前的屬性。PTR
用于指定存儲(chǔ)器操作數(shù)的類型。SHORT
指出轉(zhuǎn)移的標(biāo)號(hào)在下一條指令的-128~127個(gè)字節(jié)范圍內(nèi)。SEG取存儲(chǔ)單元段地址OFFSET取地址的偏移量TYPE將變量或標(biāo)號(hào)類型用數(shù)字表示LENGTH計(jì)算存儲(chǔ)區(qū)單元的個(gè)數(shù)SIZE計(jì)算存儲(chǔ)區(qū)單元的字節(jié)總數(shù)2024年3月19日第16頁偽指令與指令的區(qū)別:指令是給CPU的命令,在程序運(yùn)行時(shí)由CPU執(zhí)行;偽指令是給匯編程序的命令,在匯編過程中由匯編程序MASM進(jìn)行處理。匯編后,每條CPU指令產(chǎn)生一一對(duì)應(yīng)的目標(biāo)代碼;偽指令則不產(chǎn)生與之相對(duì)應(yīng)的目標(biāo)代碼。偽指令用于在匯編時(shí)給匯編程序提供匯編信息如控制轉(zhuǎn)移地址,存儲(chǔ)空間分配等,但不產(chǎn)生目標(biāo)代碼?!?.3偽指令P1132024年3月19日第17頁常用的偽指令:1、定義數(shù)據(jù)DB、DW、DD、DQ、DT;2、定義符號(hào)EQU;3、段定義SEGMENT、ENDS;4、設(shè)定段寄存器ASSUME;5、定義過程PROC、ENDP;6、定位偽指令ORG,地址計(jì)數(shù)器$;7、匯編結(jié)束偽指令END;8、模塊間通信PUBLIC、EXTRN;9、宏命令MACRO、ENDM2024年3月19日第18頁1.定義數(shù)據(jù)偽指令用來定義存儲(chǔ)空間內(nèi)容及長度格式:
[變量名]偽操作操作數(shù)[,操作數(shù)…]DATADB100,0FFHSTRDB‘HELLO’NUMDD00112233H①偽操作DB:定義變量類型為BYTE,每個(gè)操作數(shù)占有1個(gè)字節(jié);DW:WORD在內(nèi)存中存放時(shí),低位字節(jié)在前,高位在后;DD
雙字
DQ
四字
DT
十個(gè)字節(jié)②操作數(shù)可以是常數(shù)、表達(dá)式或字符串,但每項(xiàng)操作數(shù)的值不能超過偽操作所定義的數(shù)據(jù)類型限定的范圍。
字符串必須放在單引號(hào)中,用DB偽操作來定義。P1132024年3月19日第19頁DATADB100,0FFHSTRDB‘HELLO’NUMDD112233H…64HFFH48H45H4CH4CH4FH33H22H11H00H0100:0000H0001H0002H3456789ADATASTRNUM2024年3月19日第20頁
問號(hào)“?”也可作為操作數(shù),此時(shí)僅給變量保留相應(yīng)的存儲(chǔ)單元,而不賦予確定的初值。當(dāng)同樣的操作重復(fù)多次時(shí),可用重復(fù)操作符“DUP”表示,DUP操作可以嵌套。FILLERDB?ZERODW30DUP(0)AADB40DUP(2,(4DUP(?))BBDB5DUP(1,2,4DUP(3),2DUP(1,0));200個(gè)字節(jié);定義1,2,3,3,3,3,1,0,1,0的5次重復(fù)例2024年3月19日第21頁2.符號(hào)定義偽指令EQU
給符號(hào)定義一個(gè)值。CREQU0DHADREQUES:[BP+DI+5];常數(shù);表達(dá)式TIMESEQU50DATADBTIMESDUP(?)DATADB50DUP(?)等號(hào)“=”:EQU不可對(duì)同一符號(hào)重復(fù)定義可對(duì)同一符號(hào)重復(fù)定義P1132024年3月19日第22頁P(yáng)URGE用于釋放由EQU偽指令定義的變量,使這些變量可以被重新定義。TIMESEQU50…PURGETIMESTIMESEQU2;釋放TIMES變量;重新定義2024年3月19日第23頁3.段定義偽指令SEGMENT和ENDS在匯編語言源程序中定義邏輯段,以便生成目的代碼和連接時(shí)將各同名段進(jìn)行組合。段名SEGMENT[定位類型][組合類型][類別]…段名ENDS邏輯段的內(nèi)容SEGMENT和ENDS成對(duì)出現(xiàn),前面的段名必須一致。⑴段名
是給定義的段起的名稱,可以是任意的,但不可省略。DATASEGMENTWORDBUFDW40DUP(0)DATAENDSP1132024年3月19日第24頁⑵定位類型表示邏輯段起始地址可位于何處。字節(jié)型BYTE字型WORD節(jié)型(缺省值)PARA頁型PAGE⑶組合類型規(guī)定在連接定位時(shí)本程序模塊的各個(gè)段和其它程序模塊各段的組合關(guān)系。NONE(缺省值)PUBLICSTACKCOMMONMEMORYAT表達(dá)式⑷類別用單引號(hào)括起來的字符串,以表明該段的類別。連接時(shí)將不同模塊中同類別(可以不同名)的段集中在一起連續(xù)存放。表示一個(gè)獨(dú)立的段,不與其它模塊同名段連接。與其它模塊中用PUBLIC說明的同名段連接成一個(gè)邏輯段,段長度相加在內(nèi)存中連續(xù)存放。堆棧段,連接時(shí)將具有STACK組合類型的同名段連接成一個(gè)大的堆棧,長度相加,各個(gè)模塊共享。與其它模塊中用COMMON說明的同名段連接時(shí),疊放在一起,長度為同名段中最長者。連接方式與COMMON相同,定位在所裝載程序的最后存儲(chǔ)區(qū)(最高地址)。段地址從表達(dá)式指定的節(jié)(PARA)邊界開始。2024年3月19日第25頁4.段寄存器定義偽指令A(yù)SSUMEASSUME段寄存器:段名[,段寄存器:段名,…]放在代碼段的開始,通知匯編程序,在此前定義過的邏輯段使用哪一個(gè)段寄存器存放段地址。當(dāng)匯編程序匯編一個(gè)邏輯段時(shí),即可利用相應(yīng)的段寄存器尋址該邏輯段中的指令或數(shù)據(jù)。CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX…CODEENDSP1142024年3月19日第26頁5.定義過程偽指令可將具有一定功能的程序段看成為一個(gè)過程(子程序)過程名PROC[類型]…RET過程名ENDP過程體調(diào)用過程:CALL過程名KSDINPROCNEARMOVAH,1INT21HMOVIN-BUF,ALRETKSDINENDPCALLKSDIN類型:說明該子程序的調(diào)用屬性。若供段內(nèi)調(diào)用則為NEAR(系統(tǒng)默認(rèn)值),供段間調(diào)用為FAR。P1142024年3月19日第27頁為了簡化匯編語言源程序的書寫,把一些頻繁出現(xiàn)的程序段定義為“宏指令”,當(dāng)程序中遇到這個(gè)程序段時(shí),只需用一條宏調(diào)用語句來代替。宏名MACRO[形式參數(shù)1,形式參數(shù)2,…]…ENDM宏體6.宏命令說明:宏名是宏調(diào)用的依據(jù),是區(qū)別不同宏定義的標(biāo)志,不可缺省。形參用于宏與調(diào)用它的主程序間參數(shù)的傳遞,其個(gè)數(shù)根據(jù)實(shí)際需要設(shè)定,也可以沒有。P1162024年3月19日第28頁MOVCL,4SALAL,CLSHIFTMACROMOVCL,4SALAL,CLENDMSHIFTMACROXMOVCL,XSALAL,CLENDMSHIFTMACROX,YMOVCL,XSALY,CLENDMSHIFT4SHIFT4,BXSHIFT2024年3月19日第29頁“宏”與“過程”的區(qū)別:⑴宏調(diào)用語句由MASM中的宏處理程序來識(shí)別;調(diào)用過程的CALL語句由CPU來執(zhí)行。⑵使用宏調(diào)用不能縮短目標(biāo)代碼長度;“過程”經(jīng)匯編后的機(jī)器代碼獨(dú)立存在,在存儲(chǔ)器中只保留一份,故節(jié)省內(nèi)存空間。⑶過程調(diào)用要有斷點(diǎn)和現(xiàn)場(chǎng)的保護(hù)及恢復(fù),宏調(diào)用則不需要。⑷同一條宏指令在各次調(diào)用過程中可完成不同的操作;任何一個(gè)“過程”在各次調(diào)用中只能完成完全相同的功能。2024年3月19日第30頁7.定位偽指令ORG與地址計(jì)數(shù)器$ORG表達(dá)式將本指令后面語句定義的內(nèi)存數(shù)據(jù)或程序,從表達(dá)式給定的地址單元開始連續(xù)存放。表達(dá)式的值為無符號(hào)常量。地址計(jì)數(shù)器值$匯編程序?qū)υ闯绦騾R編過程中使用地址計(jì)數(shù)器保存當(dāng)前正在匯編的指令地址。用戶可以用“$”來引用該計(jì)數(shù)器的值。BUFDW60DUP(0)TOPEQU$-BUF補(bǔ)充:2024年3月19日第31頁8.模塊定義與連接偽指令當(dāng)多個(gè)目的程序連接時(shí),為使連接程序正確連接,必須互相提供一些信息,即通過標(biāo)識(shí)符的相互使用來交換信息。PUBLIC名稱[,名稱,…]此名稱是在本模塊中定義的,可供其它模塊使用。EXTRN名稱:類型[,名稱:類型…]此名稱在本模塊中并未定義,而是由外部其它模塊定義的名稱,但本模塊要使用它。2024年3月19日第32頁9.匯編結(jié)束偽指令表示源程序的結(jié)束,令匯編程序停止匯編。END[表達(dá)式]表達(dá)式表示該匯編程序的啟動(dòng)地址ENDSTART…
START所代表的地址是當(dāng)程序執(zhí)行時(shí),第一條要執(zhí)行的指令的地址。偽指令END不和其它偽指令成對(duì)使用。它通知匯編程序源程序到此結(jié)束。后面的表達(dá)式通常是源程序第一條指令(不是偽指令)的標(biāo)號(hào),可以省略。P116匯編語言源程序分段結(jié)構(gòu)STACKSEGMENTPARASTACK‘STACK’DB500DUP(0)STACKENDSDATASEGMENT…DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AX…CODEENDSENDSTARTMOVAH,4CHINT21H定義堆棧段,大小視情況而定。定義數(shù)據(jù)段。定義代碼段。這里加入你的程序代碼這里定義數(shù)據(jù)和內(nèi)存空間程序從這里開始執(zhí)行2024年3月19日第34頁順序程序分枝程序循環(huán)程序§4.4匯編語言程序設(shè)計(jì)方法
2024年3月19日第35頁1.匯編語言程序設(shè)計(jì)的步驟:1-根據(jù)實(shí)際問題抽象出數(shù)學(xué)模型,確定算法2-畫出程序框圖(流程圖)
3-分配內(nèi)存工作單元和寄存器4-根據(jù)框圖編寫源程序,保存成.ASM文件
5-對(duì)源程序匯編,生成.OBJ目標(biāo)文件
6-把.OBJ文件連接成.EXE執(zhí)行文件
7-運(yùn)行、調(diào)試2.源程序的基本結(jié)構(gòu):順序、分支、循環(huán)、過程
2024年3月19日第36頁(1)用方框表示工作框,框中用簡明語言標(biāo)明要完成的功能(2)用菱形框表示判斷框
框中標(biāo)明比較、判斷和條件如何繪制程序框圖(流程圖)?NY?2024年3月19日第37頁(6)各框之間用有向線段連起來表示程序走向??蛑袠?biāo)明子程序名字(入口參數(shù)等)(3)用
框表示調(diào)用子程序或過程。(4)用
框表示程序開始或結(jié)束。(5)用
框表示流程圖的連接點(diǎn)。2024年3月19日第38頁38匯編語言上機(jī)過程YYYNNN有錯(cuò)?有錯(cuò)?有錯(cuò)?結(jié)束匯編輸入(修改)源程序連接運(yùn)行查錯(cuò)開始用EDIT,NOTEPAD等任何文本編輯器。源程序存為.ASM文件用MASM宏匯編程序進(jìn)行匯編。匯編后生成.OBJ目標(biāo)文件。命令格式:MASM<源文件名.ASM>;用LINK連接程序進(jìn)行連接。連接后生成.EXE可執(zhí)行文件。命令格式:LINK<目標(biāo)文件名.OBJ>;用DEBUG等調(diào)試程序進(jìn)行調(diào)試。命令格式:DEBUG<可執(zhí)行文件.EXE>2024年3月19日第39頁1.順序結(jié)構(gòu)程序CPU在執(zhí)行時(shí),是以指令的排列順序逐條執(zhí)行的。
M、N、W分別為三個(gè)8位無符號(hào)數(shù),存放在數(shù)據(jù)段中偏移地址為DATA的順序單元中,求Q=M×N-W,Q可放于AX中。LEASI,DATAMOVAL,[SI]MOVBL,[SI+1]MULBLMOVBX,0MOVBL,[SI+2]SUBAX,BXHLT例12024年3月19日第40頁例2將內(nèi)存(10050H)單元的壓縮BCD數(shù)轉(zhuǎn)換為非壓縮的ASCII碼形式,分別存入10051H和10052H單元。MOVAX,1000HMOVDS,AXMOVSI,50HMOVAL,[SI]ANDAL,0FHMOV[SI+1],ALMOVAL,[SI]MOVCL,4SHRAL,CLMOV[SI+2],ALHLTORAL,30HADDAL,30H2024年3月19日第41頁
求AX累加器和BX寄存器中兩個(gè)無符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800H)單元中。例4CMPAX,BXJNCAAAA:SUBAX,BXMOV[2800H],AXXCHGAX,BXHLT出口P1P2入口A成立否YN2.分枝結(jié)構(gòu)程序2024年3月19日第42頁條件1成立?條件2成立?…條件n成立?Pn+1P1YNNNP2YPnY選擇程序分枝程序出口P1P2入口A成立否YN2024年3月19日第43頁例5取接口8000H的數(shù)據(jù),若該數(shù)不小于150時(shí),則向接口8001H傳送80H;若該數(shù)在100到149之間,則向8001H傳送40H;若該數(shù)在50到99之間,則傳送20H;若在50以下,則傳送10H。MOVDX,8000HINAL,DXCMPAL,150JNCP1CMPAL,100JNCP2CMPAL,50JNCP3MOVAL,10HJMPTTP1:MOVAL,80HJMPTTP2:MOVAL,40HJMPTTP3:MOVAL,20HTT:MOVDX,8001HOUTDX,ALHLT2024年3月19日第44頁3.循環(huán)結(jié)構(gòu)程序讓CPU重復(fù)執(zhí)行某一系列的指令,完成重復(fù)的工作。初始化工作部分循環(huán)控制條件?條件?初始化工作部分循環(huán)控制YN2024年3月19日第45頁例6MOVDX,SEGLISTMOVDS,DXMOVSI,OFFSETLISTMOVCX,8000HMOVAL,55HGOON:MOV[SI],ALINCSIDECCXJNZGOONHLTMOVDI,OFFSETLISTMOVCX,8000HMOVAL,55HREPSTOSBHLT2024年3月19日第46頁例7在以DATA為首址的內(nèi)存數(shù)據(jù)段中,存放了100個(gè)帶符號(hào)數(shù),試將其中最大和最小的數(shù)找出來,分別存放到以MAX和MIN為首的內(nèi)存單元中。LEASI,DATAMOVCX,100CLDLODSWMOVMIN,AXDECCXNEXT:LODSWCMPAX,MAXJGGREATERCMPAX,MINJLLESSJMPGOONGREATER:MOVMAX,AXJMPGOONLESS:MOVMIN,AXGOON:LOOPNEXTHLTMOVMAX,AX2024年3月19日第47頁4.子程序設(shè)計(jì)應(yīng)注意的問題子程序是一個(gè)功能相對(duì)獨(dú)立的程序段,可以被其他程序調(diào)用。入口(定義)保護(hù)現(xiàn)場(chǎng)子程序主體返回(RET)恢復(fù)現(xiàn)場(chǎng)說明:1.調(diào)用:子程序的調(diào)用由CALL指令完成。2.現(xiàn)場(chǎng)保護(hù)與恢復(fù):執(zhí)行子程序時(shí),為使其父程序的數(shù)據(jù)(現(xiàn)場(chǎng))不被破壞,應(yīng)在執(zhí)行前將這些有用的數(shù)據(jù)壓入堆棧保護(hù)起來,返回主程序前再將這些數(shù)據(jù)彈出堆棧,以恢復(fù)其原有數(shù)據(jù)。3.參數(shù)傳遞:主程序與子程序間有時(shí)需要傳遞相關(guān)數(shù)據(jù)??梢愿鶕?jù)情況,使用寄存器、內(nèi)存單元或堆棧來完成。子程序結(jié)構(gòu)示意圖2024年3月19日第48頁習(xí)題課常見程序設(shè)計(jì)舉例1、子程序設(shè)計(jì)2、數(shù)制及碼制的轉(zhuǎn)換3、排序程序4、查找程序匯編語言源程序分段結(jié)構(gòu)及舉例STACKSEGMENTPARASTACK‘STACK’DB500DUP(0)STACKENDSDATASEGMENT…DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AX…CODEENDSENDSTARTMOVAH,4CHINT21H定義堆棧段,大小視情況而定。定義數(shù)據(jù)段。定義代碼段。這里加入你的程序代碼這里定義數(shù)據(jù)和內(nèi)存空間程序從這里開始執(zhí)行2024年3月19日第50頁掌握以下幾點(diǎn):調(diào)用子程序用CALL指令,返回調(diào)用程序用RET指令。子程序允許嵌套調(diào)用。進(jìn)入子程序后首先要保護(hù)主程序的運(yùn)行狀態(tài)(標(biāo)志位)和使用的寄存器內(nèi)容(稱為保護(hù)現(xiàn)場(chǎng)),退出子程序前要恢復(fù)現(xiàn)場(chǎng)。調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲(chǔ)單元或堆棧(要用BP尋址)。1.子程序設(shè)計(jì)舉例2024年3月19日第51頁例:
十六進(jìn)制數(shù)(0-F)轉(zhuǎn)換成ASCII(‘0’-‘F’)的子程序。BIN2ASCPROC;要轉(zhuǎn)換的數(shù)在AL的低四位(入口參數(shù));轉(zhuǎn)換結(jié)果仍在AL中(出口參數(shù))PUSHF;保護(hù)現(xiàn)場(chǎng) CMPAL,9JAA2FADDAL,30HJMPDONEA2F:ADDAL,37H POPF;恢復(fù)現(xiàn)場(chǎng)DONE:RETBIN2ASCENDP
調(diào)用方法:(在主程序中)…
MOVAL,0CHCALLBIN2ASC(AL中有0CH的ASCII碼43H,’C’)1.子程序設(shè)計(jì)舉例2024年3月19日第52頁(1)壓縮BCD數(shù)轉(zhuǎn)換為ASCII碼算法:將高四位和低四位分開各占一個(gè)字節(jié),分別加上30H。2.數(shù)制與碼制轉(zhuǎn)換MOVAL,58H;十進(jìn)制數(shù)58放入ALMOVBL,AL;放入BL暫存ANDAL,0FH;AL高四位清零,保留低四位ORAL,30H;加上30HMOVCL,4;移位次數(shù)SHRBL,CL;右移四位,高位補(bǔ)零ADDBL,30H;加上30H2024年3月19日第53頁(2)十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼算法:將高四位和低四位分開各占一個(gè)字節(jié),0-9H加上30H,0AH-0FH加上37H。MOVAL,0A8H;十六進(jìn)制數(shù)放入ALMOVBL,AL;放入BL暫存ANDAL,0FH;AL保留低四位CMPAL,09H;是否大于9JAL1ORAL,30H;0-9加上30HJMPL2;這個(gè)轉(zhuǎn)移很有必要L1:ORAL,37H;A-F加上37HL2:MOVDL,AL;保存結(jié)果MOVCL,4;移位次數(shù)SHRBL,CL;右移四位,高位補(bǔ)零ADDBL,30H;加上30HCMPBL,39H;是否大于‘9’JNCL3;不大于‘9’,保存結(jié)果ADDBL,07H;大于‘9’再加7L3:MOVDH,BL;保存結(jié)果HLT2.數(shù)制與碼制轉(zhuǎn)換2024年3月19日第54頁(3)BCD數(shù)→二進(jìn)制數(shù)
算法:Dn-1*10n-1+……+D0*100
=(…(Dn-1*10+Dn-2)*10+…)*10+D0=(…((0*10+Dn-1)*10+Dn-2)*10+…)*10+D0
即:新的中間結(jié)果=中間結(jié)果*10+本位數(shù)字(中間結(jié)果初值為0)例:從鍵盤送入一個(gè)不大于65535的數(shù),將其轉(zhuǎn)換為二進(jìn)制數(shù),結(jié)果放到DS:1000H單元。2.數(shù)制與碼制轉(zhuǎn)換2024年3月19日第55頁程序流程圖BEGIN:XORBX,BX;和清零L1: MOVAH,1;1號(hào)DOS功能 INT21H;讀鍵盤送AL CMPAL,ODH;是回車嗎? JZSTOR;是回車,保存結(jié)果
ANDAL,0FH;高四位清零 CBW;擴(kuò)展到AX MOVDX,10;乘數(shù) XCHGAX,BX;交換 MULDX;“和”乘以十 ADDBX,AX;求新的“和” JMPL1STOR: MOV[1000H],BX HLT 開始鍵盤送一個(gè)數(shù)X回車?“和”*10+X保存結(jié)果結(jié)束YN2024年3月19日第56頁(4)二進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼算法:除十取余法,即將二進(jìn)制數(shù)除以十,所得余數(shù)從最低位依次上升,當(dāng)商為零時(shí),得到轉(zhuǎn)換結(jié)果的最高位。將得到的余數(shù)分別加上30H,即可得到各數(shù)的ASCII碼。開始取要轉(zhuǎn)換的數(shù)(商)除以十商為零?Y余數(shù)加30H存余數(shù)余數(shù)加30H存余數(shù)結(jié)束2.數(shù)制與碼制轉(zhuǎn)換2024年3月19日第57頁DATASEGMENTNUMDW0E356HBUFDB5DUP(0),‘$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATA MOVDS,AX LEASI,BUF+5 MOVAX,NUM MOVBX,10L1: DECSI XORDX,DX DIVBX CMPAX,0 JZL2 ADDDL,30H MOV[SI],DL JMPL1L2: ADDDL,30H MOV[SI],DL MOVDX,OFFSETBUF MOVAH,9 INT21H MOVAH,4CH INT21HCODEENDSENDBEGIN 2.數(shù)制與碼制轉(zhuǎn)換2024年3月19日第58頁算法:冒泡算法,將若干數(shù)據(jù)兩兩比較,大數(shù)放上面,依次比較完后,最小的數(shù)放到了最后面,再將剩余的數(shù)按照同樣的方法操作,直到最后兩個(gè)數(shù)比較完后,排序完畢。3.排序程序(降序排序)分析:需要雙重循環(huán)來完成此項(xiàng)工作,內(nèi)循環(huán)完成將若干個(gè)數(shù)進(jìn)行兩兩比較,若前面(低地址)的數(shù)大于后面(高地址)的數(shù),則往下進(jìn)行,即再用后面的數(shù)(較小的數(shù))與其在下一個(gè)數(shù)比較。若前面的數(shù)小于后面的數(shù),則將兩數(shù)位置交換,再往下進(jìn)行,直到要比較的數(shù)全部比較完,此時(shí)最小的數(shù)放到了最后,一次內(nèi)循環(huán)結(jié)束。去掉最后一個(gè)最小的數(shù),將剩余的數(shù)再做同樣的操作,即開始第二次內(nèi)循環(huán),此次內(nèi)循環(huán)比較次數(shù)比上一次減少一次。如此反復(fù),直到最后一次內(nèi)循環(huán)只做一次比較,至此排序完成。程序流程開始設(shè)循環(huán)次數(shù)N-1設(shè)數(shù)據(jù)指針修正循環(huán)次數(shù)取一個(gè)數(shù)和下一個(gè)數(shù)比較前面數(shù)大?Y交換兩數(shù)位置外循環(huán)結(jié)束?修正數(shù)據(jù)指針修正循環(huán)值結(jié)束內(nèi)循環(huán)結(jié)束?NNNY
MOVDX,N-1L1: MOVCX,DX LEASI,BUFL2: MOVAL,[SI] CMPAL,[SI+1] JAEL3 XCHGAL,[SI+1] MOV[SI],ALL3: INCSI LOOPL2 DECDX JNZL1SORTPROC PUSHCX PUSHDX PUSHSI PUSHAX
MOVDX,N-1L1: MOVCX,DX LEASI,BUFL2: MOVAL,[SI] CMPAL,[SI+1] JAEL3 XCHGAL,[SI+1] MOV[SI],ALL3: INCSI LOOPL2 DECDX JNZL1 POPAX POPSI POPDX POPCX
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第四章 電磁振蕩與電磁波 訓(xùn)練題(含答案)
- 2026年西安電子科技大學(xué)實(shí)驗(yàn)室與設(shè)備處(電子封裝與檢測(cè)實(shí)驗(yàn)平臺(tái))外聘人員一般崗位招聘?jìng)淇碱}庫及一套參考答案詳解
- 2026年杭州市學(xué)軍小學(xué)教育集團(tuán)誠聘語文、科學(xué)教師(非事業(yè))備考題庫完整參考答案詳解
- 2026年長沙市城市建設(shè)檔案館公開招聘普通雇員備考題庫及完整答案詳解一套
- 2026年濱州醫(yī)學(xué)院煙臺(tái)附屬醫(yī)院高級(jí)專業(yè)技術(shù)崗位公開招聘人員備考題庫參考答案詳解
- 2026年黑龍江省金融控股集團(tuán)有限公司及權(quán)屬企業(yè)招聘?jìng)淇碱}庫及完整答案詳解一套
- 2026年珠江水產(chǎn)研究所觀賞漁業(yè)研究室項(xiàng)目崗招聘?jìng)淇碱}庫及完整答案詳解一套
- 住宿員工安全管理制度
- 唐山高速公路集團(tuán)有限公司為所屬子公司2025年公開招聘專業(yè)人才備考題庫及完整答案詳解一套
- 養(yǎng)老院醫(yī)療保健服務(wù)管理制度
- 2026年春教科版(新教材)小學(xué)科學(xué)三年級(jí)下冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附教材目錄P131)
- 《創(chuàng)新與創(chuàng)業(yè)基礎(chǔ)》課件-項(xiàng)目1 創(chuàng)新認(rèn)知與思維培養(yǎng)
- 廣東省汕頭市金平區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末物理試題(含答案)
- 臨床用血技術(shù)規(guī)范2025年版與2000年版對(duì)照學(xué)習(xí)課件
- 2025-2026學(xué)年冀教版(2024)小學(xué)數(shù)學(xué)三年級(jí)上冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附目錄P175)
- 無人機(jī)駕駛員培訓(xùn)基地項(xiàng)目可行性研究報(bào)告
- 2026-2031年中國一次性使用霧化吸入器行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 語文教學(xué)跨學(xué)科融合案例分享
- 全國自考(市場(chǎng)調(diào)查與預(yù)測(cè))模擬試卷1
- 【語文】上海市小學(xué)六年級(jí)上冊(cè)期末試題(含答案)
- 2025年解碼“出?!保褐兴幬幕钠放平ㄔO(shè)與國際傳播策略研究報(bào)告
評(píng)論
0/150
提交評(píng)論