版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
匯編語言源程序編制完成后,在計算機上的操作過程分為四個階段:編輯、匯編、連接、運行調試2.3匯編語言2.3.1匯編語言程序的開發(fā)過程1.程序的編輯編輯階段的主要任務是:
輸入源程序;對源程序進行修改。2.3匯編語言2.3.1匯編語言程序的開發(fā)過程大多數(shù)的文字編輯軟件都可以用來輸入和修改匯編語言源程序,如記事本(Notepad)、寫字板(Writer)、Word以及命令行方式下的Edit(推薦使用)。一定要用“純文本”格式來儲存源程序文件,否則無法匯編。產(chǎn)生的源程序文件應該以“.ASM”或“.TXT”為擴展名,最好使用“.ASM”擴展名。2.程序的匯編
匯編階段的任務是把匯編語言源程序“翻譯”成為機器代碼(稱為“目標”),產(chǎn)生二進制的“目標文件”。
2.3匯編語言2.3.1匯編語言程序的開發(fā)過程常用的匯編工具Microsoft公司的MASM(MacroAssembler,宏匯編)
Borland公司的TASM(TurboAssembler)
假設已經(jīng)產(chǎn)生了一個匯編語言源程序文件“MYPRG1.ASM”,可以用如下命令進行匯編:TASM MYPRG1↙該命令正確執(zhí)行后,將產(chǎn)生一個同名的目標文件MYPRG1.OBJ。3.如果匯編語言源程序文件以“.TXT”為擴展名,匯編時要使用這個文件的“全稱”:TASM MYPRG1.TXT↙Errormessages:NoneWarningmessage:NoneTASM命令執(zhí)行后,在屏幕上顯示相關信息。說明這個程序已經(jīng)順利地通過了“匯編”,沒有發(fā)現(xiàn)錯誤。**Error**EX2.ASM(14)Valueoutofrange……Errormessages:1表示匯編源程序EX2.ASM第14行有“數(shù)值超出范圍”的錯誤,程序的錯誤總數(shù)為1。2.3匯編語言2.3.1匯編語言程序的開發(fā)過程4.程序的連接連接階段主要完成的操作
把幾個程序模塊產(chǎn)生的目標文件連接成一個完整的可執(zhí)行程序;把“子程序庫”中的子程序連接到程序中去。連接命令行C:>LINKMYPRG1.OBJ ;生成MYPRG1.exe2.3匯編語言2.3.1匯編語言程序的開發(fā)過程5.程序的執(zhí)行DOS中直接輸入程序名稱:MYPRG1.exe或MYPRG1一、發(fā)生以下兩種情況之一的,需要對程序進行“調試”。
1、匯編語言程序不包含輸出結果的相關指令,操作者無法看到程序的運行結果。2、程序能夠運行,但是不能得到預想的結果。二、調試(Debug):在操作者的控制下執(zhí)行這個程序,觀察程序每個階段的執(zhí)行結果,或者修改參數(shù)反復運行程序,查找出程序中還存在的不正確的地方,或者驗證程序的正確性。TASM5.0軟件包中,用于程序調試的軟件稱為“TD”
(TurboDebugger):2.3匯編語言2.3.1匯編語言程序的開發(fā)過程6.程序的執(zhí)行調試程序“TD”的運行界面2.3匯編語言2.3.1匯編語言程序的開發(fā)過程7.匯編語言的語句格式分類語句一般由分隔符分成的四個部分組成,它們有兩種格式:執(zhí)行性語句——由處理器指令構成的語句,它通常對應一條機器指令,出現(xiàn)在程序的代碼段中,其結構如下:2.3匯編語言2.3.2匯編語言語句的格式標號:(label)操作符(operator)操作數(shù)n(operand);注解(comment)8.匯編語言的語句格式分類
2.3匯編語言2.3.2匯編語言語句的格式每一條指令語句,使匯編程序產(chǎn)生一條8086/8088指令。大部分指令語句都由操作符(操作碼)、操作數(shù)組成;部分要有標號、操作符、操作數(shù)、注解;個別指令語句只有操作符。AGAIN:CALLDELAY;延遲1豪秒MOVAL,DLADDAL,1DAA………JMPAGAIN
9.說明性語句——由偽指令構成的語句,它通常指示匯編程序如何匯編源程序,其結構如下:2.3匯編語言2.3.2匯編語言語句的格式名字(Name)偽操作符(Pseudo)參數(shù)列表(Parameter);注解(comment)
匯編語言程序的語句中的偽指令,不象機器語言指令那樣是在程序運行期間由計算機來執(zhí)行的,它是在匯編程序對源程序匯編期間由匯編程序來處理的一類操作,它可以完成如數(shù)據(jù)定義、分配存儲器、指示程序開始和結束等功能。10.標號和名字是一種符號地址類型:1、標號:指令符號地址2、變量:數(shù)據(jù)符號地址操作符和偽操作符操作符可以是任何一條處理器指令,也可以是一條宏指令。偽操作符主要完成一些不產(chǎn)生CPU動作的說明性工作,在程序執(zhí)行前由匯編程序完成處理。操作數(shù)和參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲單元。是指定參與操作的數(shù)據(jù)。偽指令的參數(shù)可以是常數(shù)、變量名、表達式等,可以有多個,參數(shù)之間用逗號隔開。2.3匯編語言2.3.2匯編語言語句的格式11.注解注釋項用來說明一段程序或一條或幾條指令的功能,是可有可無的。通常在編寫程序時,為了增強程序的可讀性。通常一般注解是以一個英文分號(;)為開頭,而且不管你在何處打入此符號,匯編程序都會假設其右邊的所有字符均是注解。(注解可包含任何字符,包括空白字符)。2.3匯編語言2.3.2匯編語言語句的格式12.變量和標號屬性類偽指令地址操作符:地址操作符取得名字或標號的段地址和偏移地址兩個屬性:中括號[]:表示將括起來的表達式作為存儲器地址指針;符號$:表示當前偏移地址;段前綴的冒號:也是一種地址操作符,表示采用指定段的段地址寄存器。2.3匯編語言2.3.3常用的偽操作指令13.2.2指令系統(tǒng)
$:為地址計數(shù)器.在匯編語言程序中經(jīng)常使用地址計數(shù)器的值$來保存當前正在匯編的地址.記載下一個變量或指令在當前段中的偏移量.每處理一條指令$增加一個值.此值為該指令所需的字節(jié)數(shù).例:ORG0100HAYDW7,$+4,8,9CNTEQU$-AYDB3,8,CNT,9,1,2…..執(zhí)行:MOVAX,AY+2;AX=?MOVBX,AY+10;BX=?
2.3.3常用的偽操作指令14.2.2指令系統(tǒng)例:ORG0100HAYDW7,$+4,8,9CNTEQU$-AYDB3,8,CNT,9,1,2…..執(zhí)行:MOVAX,AY+2;AX=?MOVBX,AY+10;BX=?
2.3.3常用的偽操作指令15.變量和標號屬性類偽指令地址操作符:另外還有如下兩個:SEG 變量/標號 ;返回變量或標號的段地址例:MOVAX,SEGM1MOVDS,AXM1是段名為DATA的數(shù)據(jù)段中的一個變量名。OFFSET 變量/標號 ;返回變量或標號的偏移地址例:若DA1為數(shù)據(jù)段中一個變量名MOVBX,OFFSETDA1;匯編程序將變量DA1的偏移地址送到BX中,相當于指令LEABXDA1。2.3匯編語言2.3.3常用的偽操作指令16.類型操作符類型操作符對變量或標號的類型屬性進行相關的設置1、PTR格式:類型/距離PTR變量/標號對變量或標號的類型屬性進行臨時指定或修改存儲器操作數(shù)的類型屬性(保持原有的屬性)功能:是將PTR左邊的類型屬性賦給右邊的變量或標號。PTR本身并不分配存儲單元,僅給已分配的存儲單元臨時賦予新的屬性,這樣可以保證運算時操作數(shù)類型的匹配,常與類型BYTE、WORD、NEAR、FAR等連用。 2.3匯編語言2.3.3常用的偽操作指令17.類型操作符1、PTR例:N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1;使N1類型轉換成字與AX類型匹配。MOVBL,BYTEPTRN2;使N2類型轉換成字節(jié)與BL類型匹配。例:MOVBYTEPTR[BX],10H;[BX]←10HMOVWORDPTR[BX],10H;[BX],[BX+1]←0010H例:JMPFARPTRLO;這是用PTR改變距離屬性,在JMP語句中將標號LO改為FAR,使JMP指令安排在其它代碼段中也可以使用,以實現(xiàn)段間轉移。2.3匯編語言2.3.3常用的偽操作指令18.2、THIS 格式:變量/標號EQUTHIS 類型/距離功能:THIS指定的變量或標號本身并不分配存儲單元。它與緊跟其后的變量或標號只有類型不同,而段地址和偏移地址均相同。THIS的功能是將EQUTHIS右邊的類型/距離屬性,賦左邊的變量/標號,該變量或標號的段地址和偏移地址與下一個存儲單元的地址相同。例:DATA1EQUTHISBYTEDATA2DW1234H;DATA1、DAT2有相同段地址和偏移地址,但類型值不同。MOVAX,DATA2;AX=1234HMOVBL,DATA1;BL=34H2.3匯編語言2.3.3常用的偽操作指令19.3、SHORT
格式:SHORT標號;設定標號為短轉移標號SHORT指定標號作為-128~+127字節(jié)范圍內的短轉移。2.3匯編語言2.3.3常用的偽操作指令20.
4、TYPE變量/標號
TYPE加在變量前,返回變量的類型屬性,如表所示:
2.3匯編語言2.3.3常用的偽操作指令A1DB20H,30HA2DW0438HA3DD?L1:MOVAH,TYPEA1MOVBH,TYPEA2ADDAL,TYPEA3MOVBL,TYPEL1匯編時形成指令:MOVAH,1MOVBH,2ADDAL,4MOVBL,0FFH(-1)21.5、LENGTH、SIZELENGTH:用來計算一個存儲區(qū)中的單元(單元可以是字節(jié)、字或雙字)的數(shù)目。SIZE:用來計算一個存儲區(qū)的字節(jié)總數(shù)。例2-3-3-5:以ABC為地址標號的存儲區(qū)是用偽指令ABCDW100DUP(?)來定義的。TYPEABC等于2LENGTHABC等于100SIZEABC等于2002.3匯編語言2.3.3常用的偽操作指令22.6、LABEL格式:名稱LABEL類型屬性名稱為LABEL語句下一行所使用的語句中的變量或標號取的別名.LABEL偽指令助記符,不可缺省.類型屬性規(guī)定了所起別名的變量或標號的類型,此別名與原變量標號具有相同的段基址及偏移地址.說明:LABEL偽指令給已定義的變量或標號取另一個名字,并可重新定義它的類型屬性,使同一變量或標號在不同地方被引用時,可采用不同的名字,具有不同的類型屬性,提高程序的靈活性。
2.3匯編語言2.3.3常用的偽操作指令23.6、LABEL例1、DATBLABELBYTEDATWDW3031H,3233HMOVAL,DATB;31HALMOVBX,DATW;3031HBX堆棧段中經(jīng)常這樣使用LABEL例2、SSTACKSEGMENTSTACK‘STACK’DW100DUP(?)TOPLABELWORDSSTACKENDS此處定義100個字的堆棧,TOP為棧底的名,類型為字。
MOVSP,OFFSETTOP
2.3匯編語言2.3.3常用的偽操作指令24.例3、DISFLABELFARDISN:MOVAX,[SI]
DISF與DISN指向同一條指令,DISF是DISN的別名,但距離屬性改為FAR,其它代碼段可調用。2.3匯編語言2.3.3常用的偽操作指令25.EQU(標號賦值語句)格式:名稱EQU表達式說明:EQU偽操作用于定義一個數(shù)值。在程序指令中,則用該數(shù)值取代所定義的名稱。實例: VALUE EQU 10 COUNT EQU VALUE經(jīng)過以上定義后,在程序中若寫VALUE則代表10,若你寫COUNT,則是代表VALUE,在此例是10。2.3匯編語言2.3.3數(shù)據(jù)的定義26.=格式:名稱=表達式說明:“=”偽操作與EQU類似,但EQU可以定義文字(例COUNTEQUVALUE)和數(shù)值,而“=”只能用以定義數(shù)值;并且“=”偽操作中的名稱允許重復定義,而EQU不允許重復定義。實例: COUNT=18 COUNT=COUNT+12.3匯編語言2.3.3數(shù)據(jù)的定義27.數(shù)據(jù)定義及存儲空間分配偽操作DB、DW、DD、DQ和DT格式1:[變量名稱]偽操作助記符 操作數(shù),操作數(shù)…;注釋格式2:[變量名稱]偽操作助記符nDUP(操作數(shù),操作數(shù)…);注釋功能:將操作數(shù)存入變量名指定的存儲單元中,或者只分配存儲空間不存入數(shù)據(jù)。1、變量名:它用符號表示,可以省略,作用與指令語句中的標號相同。但后面不跟冒號“:”。匯編時將此變量的助記符后的第一個字節(jié)的偏移地址作為它的符號地址。2.3匯編語言2.3.3數(shù)據(jù)的定義28.數(shù)據(jù)定義及存儲空間分配偽操作DB、DW、DD、DQ和DT2、格式中的偽操作助記符共有以下5種:DB(DefineByte):定義字節(jié)數(shù)據(jù),分配1個字節(jié)存儲空間;DW(DefineWord):定義字數(shù)據(jù),分配2個字節(jié)存儲空間;DD(DefineDoubleword):定義雙字,4個字節(jié);DQ(DefineQuadword):定義四個字,8個字節(jié);DT(DefineTenbytes):定義十個字節(jié),10個字節(jié)。3、操作數(shù):操作數(shù)可以是常數(shù),字符串,變量,標號,表達式等,,多個操作數(shù)之間必須用逗號分開。在格式2中,用nDUP()表示時,n必須是正整數(shù),表示括號中的操作數(shù)的重復次數(shù),DUP后面必須帶括號。4、注釋:說明偽指令的功能,可以省略,注釋前必須帶分號“;”。2.3匯編語言2.3.3數(shù)據(jù)的定義29.例2-3-4-1:操作數(shù)是常數(shù)或表達式DA1DB10H,52H;變量DA1中裝入10H,52HDA2DW1122H,34H;變量DA2中裝入22H,11H,34H,00HDA3DD5*20H,0FFEEH;變量DA3中裝入000000A0H,0000FFEEH匯編后數(shù)據(jù)在存儲器中存放格式如圖所示:2.3匯編語言2.3.3數(shù)據(jù)的定義30.例2-3-4-2:操作數(shù)是字符串FIRSTDB‘HELLO’;將字符串‘HELLO’的ASCII碼裝入FIRST單元開始的存儲單元SECONDDW‘OK’;將字符串‘OK’的ASCII碼裝入SECOND開始的存儲單元2.3匯編語言2.3.3數(shù)據(jù)的定義31.例2-3-4-3:操作數(shù)用?定義不確定值的變量,用作保留存儲空間,以便存放運算結果。M1DB?;定義變量M1為不確定字節(jié),;保留一個字節(jié)空間。M2DW0D55H,?;定義變量M2第二個字為不確定,;保留兩個字節(jié)空間。2.3匯編語言2.3.3數(shù)據(jù)的定義32.例2-3-4-4:操作數(shù)用DUP來定義重復變量ONEDB5DUP(0);重復5個0存入ONE起始的存儲單元。TWODW10DUP(?);重復10次,保留10個字的存儲單元空間。THREEDB4DUP(1,2DUP(20H));DUP嵌套
2.3匯編語言2.3.3數(shù)據(jù)的定義33.當定義的數(shù)據(jù)為2字節(jié)及以上時,數(shù)據(jù)在內存中的存放順序是:“低字節(jié)存放在低地址,高字節(jié)存放在高地址”。例: DATA1 DB 08H DB 10H DATA2 DW 0011H DATA3 DD 11223344H假設DATA1的起始地址是20200H,則編譯成機器代碼,相對應內存內容如圖2-12所示
2.3匯編語言2.3.3數(shù)據(jù)的定義變量內存地址內存內容…低地址DATA120200H08H↓20201H10H↓DATA220202H11H↓20203H00H↓DATA320204H44H↓20205H33H↓20206H22H↓20207H11H↓…高地址34.例:2-3-4-5用逗號隔開的常數(shù)DATADB45H,45H,45H,45H,45H復制形式的運算符DATADB5DUP(45H)字符串STRINGDB‘Reg16?’
2.3匯編語言2.3.3數(shù)據(jù)的定義…45H45H45H45H45H…DATA3FH…52H65H67H36H31H20HSTRINGR的ASCII碼eg16空格?的ASCII碼35.ORG
給匯編程序設置位置指針,用來指明該語句下面的程序段在段內的起始地址。格式:ORG 表達式其中:ORG是偽指令助記符。表達式給定的偏移地址值,表達式的計算結果必須是正整數(shù)。一般情況下,段定義語句(SEGMENT)指出了段的起點,偏移地址為0。當用戶要求指定某條指令或數(shù)據(jù)為某個指定地址時,可用ORG語句來改變,ORG可以放在程序的任何位置。2.3匯編語言2.3.3常用的偽操作指令36.ORG例2-3-3-1用ORG指定代碼段地址。CODESEGMENTORG100HASSUMECS:CODE,DS:DATA….START:MOVAX,DATA;此代碼段起始地址偏移100H...CODEENDS2.3匯編語言2.3.3常用的偽操作指令37.ORG例2-3-3-2用ORG指定數(shù)據(jù)段地址。DATASEGMENTORG100HA1DB10H,20H,30H;A1偏移地址為100HORG200HA2DW303H,3233H;A2偏移地址為200HDATAENDS2.3匯編語言2.3.3常用的偽操作指令38.END用來指明整個程序的結束。格式:END標號名END是偽指令助記符,不可缺省,放在源程序的最后一行。標號名是該程序中第一條可執(zhí)行語句的標號名,可缺省。說明:ENDS、ENDP與END的區(qū)別:ENDS指令是用來標明一個段(Segment)的結束;ENDP是用來指示一個過程(Procedure)的結束;END指明整個程序的結束。2.3匯編語言2.3.3常用的偽操作指令例2-3-3-2CODESEGMENTASSUMECS:CODESTART:...SUB1PROCNEAR...SUB1ENDPCODEENDSENDSTART39.EVEN格式:EVEN ;使他后面的數(shù)據(jù)或指令從偶地址開始說明:EVEN直接放在某一語句前,匯編程序匯編時就會完成將地址調整在偶地址上。XDATASEGMENTORG100HX1DB0DHEVENX2DW100DUP(?)XDATAENDS2.3匯編語言2.3.3常用的偽操作指令若X1的偏移地址是100H。則X2的100個字從偏移地址102H開始。每個字從偶地址開始存放。40.ALIGN格式:ALIGNn ;使他后面的數(shù)據(jù)或指令 ;從n的整數(shù)倍地址開始說明:ALIGN偽指令是將當前偏移地址指針指向n(n是2的乘方即2、4、8、16等)的整數(shù)倍的地址。如果下一個地址正好能被n整除,那么,該偽指令不起作用。否則,匯編程序將空出若干個字節(jié),直到下一個地址能被n整除為止。2.3匯編語言2.3.3常用的偽操作指令B1DB12HALIGN2W1DW4567HB1DB12HEVENW1DW4567H41.SEGMENT和ENDS段定義偽指令,是用來定義段的組合。指令格式: 段名 SEGMENT[定位類型][組合類型][‘類別’]………… ;指令語句或偽指令語句 ……段名 ENDS2.3匯編語言2.3.3常用的偽操作指令42.SEGMENT和ENDS段定義偽指令,是用來定義段的組合。指令功能:定義段名,段屬性段名是邏輯段的標識符,不可省略,它確定了邏輯段在存儲器中的地址(指明段基址),SEGMENT和ENDS前的段名必須相同。SEGMENT…ENDS是段定義的偽指令助記符,任何一個邏輯段必須以SEGMENT開始,ENDS結束,不可省略,并需成對出現(xiàn),兩者之間是本邏輯段的內容。2.3匯編語言2.3.3常用的偽操作指令43.SEGMENT和ENDS段定義偽指令,是用來定義段的組合。指令格式: 段名 SEGMENT[定位類型][組合類型][‘類別’]………… ;指令語句或偽指令語句 ……段名 ENDS[定位類型]、[組合類型]、[‘類別’]這三個參數(shù)用來增加類型及屬性說明,一般可以省略,如果需要用連接程序把本程序相連時,需要用到這些參數(shù)2.3匯編語言2.3.3常用的偽操作指令44.SEGMENT和ENDS1、定位類型:此參數(shù)是對段起始地址定位.匯編程序對源程序匯編后生成的是目標代碼文件(.OBJ),其中的段地址和偏移地址都未最后確定,還需要用鏈接程序(LINK)把各個模塊鏈接起來.定位類型參數(shù)用于告訴LINK程序,鏈接時本段首地址的邊界定位方式.四種類型的邊界地址要求:PAGE=xxxxxxxxxxxx00000000;以256字節(jié)為邊界段起始地址必須是256的倍數(shù)地址。地址低8位為0,一頁的起點。PARA=xxxxxxxxxxxxxxxx0000;以16字節(jié)為邊界段起始地址必須是16的倍數(shù)地址。地址低4位為0。(默認)WORD=xxxxxxxxxxxxxxxxxxx0;以2字節(jié)為邊界段起始地址必須是偶地址。地址低1位為0。BYTE=xxxxxxxxxxxxxxxxxxxx;以1字節(jié)為邊界段起始地址可以定位在存儲單元的任何地址。2.3匯編語言2.3.3常用的偽操作指令45.
SEGMENT和ENDS2、組合類型:表示本段與其它段之間,具有相同段名的各段的組合關系,為連接程序提供信息。六種不同的組合類型:NONE:該段與其它同名段不進行連接,各段獨立存儲器中,隱含為NONE類型。(默認)PUBLIC:該段與其它模塊中的同名段連接時,由低地址到高地址連接起來,組成一個邏輯段,連接次序由連接命令指定。COMMON:連接時該段與其他同名分段有相同的起始地址,采用覆蓋的方式在存儲器存放。連接長度為各分段中最大長度。2.3匯編語言2.3.3常用的偽操作指令46.
SEGMENT和ENDS2、組合類型:AT表達式:使段的起始地址是表達式所計算的16位段地址上,AT不能用來定義代碼段STACK:指定該段作為堆棧段。此參數(shù)在堆棧中不可省略,多個模塊只需設置一個堆棧段,各模塊中的堆棧采用覆蓋方式組合,自動初始化SS、SP。如果在定義堆棧段時沒有將其說明為STACK類型,那么就需要在程序中用指令設置SS和SP寄存器的值,此時LINK程序將會給出一個警告信息。MEMORY:功能類似COMMON,區(qū)別是指定該段將分配在所有其他連接在一起的段的最上層。2.3匯編語言2.3.3常用的偽操作指令47.
SEGMENT和ENDS3、類別:可以是任何合法的名稱,但是必須用單引號括起來。連接時,把不同模塊中的相同類別的各段在物理上相鄰地連接在一起。說明:段定義時,段名是不能省略的,定位類型、組合類型和類別均可以省略,若不省略,它們的書寫順序不能隨意更改。定位類型若被省略,默認為PARA類型。段定義必須以ENDS偽指令結束,在同一段定義中,SEGMENT與ENDS前的段名必須一致。同一個程序中可以出現(xiàn)多個段,這是通過多次段定義來實現(xiàn)的。可以嵌套設置,但不允許交叉設置。2.3匯編語言2.3.3常用的偽操作指令48.段分配語句ASSUME格式:ASSUME段寄存器:名稱[,段寄存器:名稱,……]實例:ASSUMECS:CODE,DS:DATA,SS:sSTACK說明:格式中的段寄存器可以為CS,DS,ES,SS。ASSUME偽指令可以同時說明四個段寄存器,也可以只說明一個或者兩個段寄存器。程序中沒有用到寄存器可以省略不寫。ASSUME協(xié)助匯編程序,將各個段標號(例:CODE,DATA,STACK)翻譯成實際地址,但它并不意味著匯編后這些段地址已經(jīng)裝入了相應段寄存器中,段寄存器中的內容除了CS以外,仍需要用程序來裝入。2.3匯編語言2.3.3常用的偽操作指令49.例2-3-3-42.3匯編語言2.3.3常用的偽操作指令假設有2個數(shù)據(jù)段定義如下:DATA SEGMENT A DB 55DATA ENDSDSEG SEGMENT X DB 10DSEG ENDSCODESEGMENTASSUMEDS:DATA,ES:DSEG,CS:CODE MOV AX,DATA MOV DS,AX;裝入段基址 MOV AX,DSEG MOV ES,AX設變量A和X的偏移地址都是0000H。指令MOVAL,A自動按照MOVAL,DS:[0000H]的格式
匯編,執(zhí)行后(AL)=55,結果正確。指令MOVDL,X自動按照MOVDL,ES:[0000H]的格式
匯編,執(zhí)行后(DL)=10,結果正確。50.例2-3-3-42.3匯編語言2.3.3常用的偽操作指令如果這樣來取數(shù)據(jù):MOVSI,OFFSETA;A的偏移地址裝入SIMOVDI,OFFSETX;X的偏移地址裝入DIMOVAL,[SI] ;取A的值送ALMOVDL,[DI] ;取X的值送DL執(zhí)行的結果:(AL)=55正確,(DL)=55 錯誤。為了得到正確結果,上面第4條指令改寫為:MOV DL,ES:[DI] ;執(zhí)行后(DL)=10,結果正確,這條指令,指定了段基址,匯編出來的的機器指令比MOVDL,[DI]多1個字節(jié),稱為段跨越前綴. 51.SEGMENT和ENDS
80x86/Pentium完整段定義的擴充。(為了表示32位微處理器的功能)指令格式:
段名 SEGMENT[定位類型][組合類型][字長選擇][‘類別’]………… ;(段體) ……段名 ENDS與前述段定義格式比較,主要區(qū)別是增加了字長選擇項,該項用于定義段的尋址方式,共有兩種選擇:USE16—對應8086/8088實地址方式,段基址16位,偏移量16位,最大段長64K.USE32—對應保護方式,段基址16位,偏移量32位,最大段長4GB
字長選擇項只有在源程序開始時使用了.386、.486、.586或(.386P、.486P、.586P)方式選擇的情況下有效。(默認為USE32)2.3匯編語言2.3.3常用的偽操作指令52.SEGMENT和ENDS
80x86/Pentium完整段定義的擴充。(為了表示32位微處理器的功能)指令格式:
段名 SEGMENT[定位類型][組合類型][字長選擇][‘類別’]………… ;(段體) ……段名 ENDSUSE16—對應8086/8088實地址方式,段基址16位,偏移量16位,最大段長64K.USE32—對應保護方式,段基址16位,偏移量32位,最大段長4GB
方式選擇偽指令如:.386、.486、.586或(.386P、.486P、.586P)等,是80x866/Pentium擴展偽指令。方式選擇偽指令能確定微處理器的工作方式和當前指令集,它告訴匯編程序當前的源程序是針對哪種CPU而執(zhí)行的。(默認為8086/8088指令集)2.3匯編語言2.3.3常用的偽操作指令53.SEGMENT和ENDS
80x86/Pentium完整段定義的擴充。(為了表示32位微處理器的功能)
.486;80486方式DATASEGMENTUSE16;數(shù)據(jù)段以16位尋址DA1DD……..DA2DD……..DATAENDSFSEGSEGMENTUSE16;附加數(shù)據(jù)段以16位尋址REDD?FSEGENDSsSTACKSEGMENTSTACKUSE16;堆棧段以16位尋址DB100DUP(?)sSTACKENDSCODESEGMENTUSE16;代碼段以16位尋址ASSUMECS:CODE,DS:DATA,FS:FSEG,SS:sSTACK………..CODEENDSEND2.3匯編語言2.3.3常用的偽操作指令54.PAGE和TITLE用來控制匯編列表的格式。PAGE:一般用在程序的開頭,用此指令指明每一頁中所要打印的行數(shù),及以行中最多的字符個數(shù)。格式:PAGE 60,132;設定每頁有60行,每行132個字符說明:每頁的行數(shù)范圍是10~255行,而每行的字符數(shù)為60~132。若我們省略PAGE的敘述,匯編程序將會自動設定PAGE60,80。TITLE:讓一個程序標題印在每一頁的上面。格式:TITLE文本名;將文本名賦給源程序目標模塊作名字。2.3匯編語言2.3.3常用的偽操作指令55.NAME格式:NAME程序名說明:為源程序目標模塊賦名字。NAME放在程序開始,在輸出匯編語言源程序列表文件時,將在每一頁的開頭打印出該程序名。若源程序中省略NAME偽指令,匯編程序將源文件名作目標模塊的名字。2.3匯編語言2.3.3常用的偽操作指令56.PROC和ENDP過程定義偽指令格式:過程名 PROC[類型]…… RET過程名 ENDP2.3匯編語言2.3.3常用的偽操作指令過程名:是給過程起的名子。不可缺少,它是主程序調用(CALL指令)的目標操作數(shù),即子程序入口的符號地址。像標號一樣過程名具有三個屬性。1、段屬性:為該過程所在段的段基址。2、偏移地址屬性:指該過程第一個字節(jié)與段首址之間距離字節(jié)。3、距離屬性:為NEAR或FAR。即格式中的[類型]。PROC…ENDP:過程定義偽指令。兩者前面有相同的過程名。RET:為過程內部的返回指令。返回指令屬于段內返回還是段間返回與過程的類型決定。57.在匯編語言程序設計中,有的程序段要多次使用,除了過程調用的方法外,還可以用宏匯編的方法實現(xiàn),尤其是子程序段本身較短,而傳遞的參數(shù)較多的情況下,使用宏匯編更加有效。宏是源程序中一段獨立的程序段,首先對它進行定義,然后就可以用宏指令語句多次調用它了。2.3匯編語言2.3.3宏指令58.宏定義格式:宏指令名 MACRO <形式參數(shù)> … … ;宏體 … ENDM宏指令名:宏定義的名字,不可缺省,宏調用時要使用它,第一個符號必須是字母,其后可以是字母或數(shù)字.MACRO…ENDM:宏定義的偽指令助記符,不可缺省.它們成對出現(xiàn),表示宏定義的開始和結束,ENDM前不帶宏指令名.宏體:一段有獨立功能的程序代碼段。形式參數(shù):可以為“空”(沒有),也可以有多個,用逗號分隔。宏體由指令、偽指令和前面已經(jīng)定義的宏指令組成。2.3匯編語言2.3.3宏指令59.宏調用
經(jīng)宏定義后的宏指令可以在源程序中調用,宏調用格式:
宏指令名實參,實參…宏調用只需要有宏指令名,若宏定義中有形式參數(shù),那么宏調用時必須帶有實際參數(shù)來代替形式參數(shù),實際參數(shù)的個數(shù),順序,類型與形式參數(shù)原則上是一一對應,各參數(shù)用逗號分開。匯編程序不要求它們必須相等,若實參個數(shù)大于形參,則多余的實參不予考慮,若實參個數(shù)小于形參,則多余的形參作“空”處理。2.3匯編語言2.3.3宏指令60.宏展開
匯編程序在對源程序匯編時,對每個宏調用作宏展開,即用宏定義中的宏體取代宏指令名,并用實參一一對應代替形參,每條插入的宏體指令前帶上加號“+”。
實例:例2-3-5-1不帶參數(shù)的的宏定義,用宏指令來實現(xiàn)AL中內容右移4位。2.3匯編語言2.3.3宏指令宏定義:SHIFTMACROMOVCL,4SARAL,CLENDM宏調用:SHIFT宏展開:將下段程序插入宏調用語句位置。+MOVCL,4+SARAL,CL61.實例例2-3-5-2:宏定義帶1個參數(shù),用宏指令實現(xiàn)將AL中的內容右移任意次(小于256)。2.3匯編語言2.3.3宏指令宏定義:SHIFTMACRONMOVCL,NSARAL,CLENDM宏調用1:SHIFT4宏展開1:將下段程序插入宏調用語句位置。+MOVCL,4;AL中內容算術右移4次。+SARAL,CL宏調用2:SHIFT7宏展開2:將下段程序插入宏調用語句位置。+MOVCL,7;AL中內容算術右移7次。+SARAL,CL62.實例例2-3-5-3:宏定義帶2個參數(shù),用宏指令實現(xiàn)將任意寄存器的內容右移任意次(小于256)。2.3匯編語言2.3.3宏指令宏定義:SHIFTMACRON,MMOVCL,NSARM,CLENDM宏調用1:SHIFT4,AL宏展開1:將下段程序插入宏調用語句位置。+MOVCL,4;AL中內容算術右移4次。+SARAL,CL宏調用2:SHIFT6,DI宏展開2:將下段程序插入宏調用語句位置。+MOVCL,6;DI中內容算術右移6次。+SARDI,CL63.實例例2-3-5-4:宏定義帶3個參數(shù),參數(shù)可為操作碼,用宏指令實現(xiàn)對寄存器的內容左移或右移任意次。2.3匯編語言2.3.3宏指令宏定義:SHIFTMACRON,M,PMOVCL,NS&PM,CLENDM宏調用1:SHIFT3,AX,HR宏展開1:將下段程序插入宏調用語句位置。+MOVCL,3;AX中內容邏輯右移3次。+SHRAX,CL宏調用2:SHIFT5,BH,AL宏展開2:將下段程序插入宏調用語句位置。+MOVCL,5;BH中內容算術左移5次。+SALBH,CL宏定義可用部分操作碼作參數(shù),但在宏定義體中必須用“&”作分隔符,“&”是一個操作符,是形參的前綴,可以將&前后兩個符號合并成一個符號.64.宏定義中的標號與變量當宏定義中出現(xiàn)了標號或變量的定義時,若該宏指令被程序多次調用,那么在宏展開后程序中會出現(xiàn)多個相同的標號(或變量),這在匯編過程中會給出重復定義的錯誤。為了解決這類問題,宏定義中采用局部標號或變量。局部標號或變量有LOCAL為指令定義。格式:LOCAL 參數(shù)表說明:格式中的參數(shù)就是宏體中要用到的標號或變量。偽指令LOCAL應是宏體中的第一條語句。匯編時,當匯編到這些標號或變量時,匯編語言將用??0000、??0001、??0002等依次代替程序中出現(xiàn)的各個標號。2.3匯編語言2.3.3宏指令65.宏定義中的標號與變量例2-3-5-5定義一個延時程序的宏指令DELAT并且在同一個主程序中兩次被調用的擴展情況。DELAYMACRO;宏定義LOCALLOPMOVCX,2801;延時宏指令LOP:LOOPLOPENDM2.3匯編語言2.3.3宏指令66.宏定義中的標號與變量DELAY;宏調用DELAY;宏調用宏展開:
DELAY;宏調用+MOVCX,2801+??0000:LOOP??0000
DELAY;宏調用+MOVCX,2801+??0001:LOOP??00012.3匯編語言2.3.3宏指令67.宏指令和子程序的區(qū)別:宏指令實際上就代表了它對應的一組指令。對程序中出現(xiàn)的宏指令進行匯編時,這條宏指令被它對應的一組指令所代替。如果程序中多次使用宏指令,就等于多次重復拷貝了這個指令組,占用的內存隨之增加。調用子程序通過執(zhí)行CALL指令實現(xiàn),存在從“主程序”與“子程序”之間的兩次控制轉移。使用宏指令不存在控制轉移的過程。使用子程序和宏指令都可以提高編程效率。子程序占用固定大小的存儲空間,被主程序調用時,空間不會隨調用次數(shù)而增加。但是,宏指令占用存儲空間會隨著使用次數(shù)的增加而增加。2.3匯編語言2.3.3宏指令68.程序開始結束語句PAGE,TITLE,ORG,END,EVEN,ALING段定義語句SEGMENT…ENDS段分配語句ASSUME過程定義語句PROC…ENDP變量和標號屬性類偽指令數(shù)據(jù)定義語句DB,DW,DD,DQ和DT賦值語句EQU,=這些語句經(jīng)常使用,沒有這些偽指令,匯編程序不能得到正確的匯編結果。2.3匯編語言2.3.3常用的偽操作指令69.2.3.4完整匯編源程序框架代碼段DATA SEGMENT ;定義數(shù)據(jù)段(數(shù)據(jù)定義)DATA ENDSEXTRA SEGMENT ;定義附加段(數(shù)據(jù)定義)EXTRA ENDSsSTACK SEGMENT PARASTACK‘STACK’ ; 堆棧區(qū)間預留字節(jié)數(shù)定義TOP EQU THIS WORDsSTACK ENDS70.CODE SEGMENT ;定義代碼段ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:sSTACKSTART:MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX MOV AX,sSTACK MOV SS,AX MOV SP,OFFSETTOP …… MOV AH,4CH INT 21H
CODE ENDS END START71.一、源程序的結構特點(5)1.源程序由若干個邏輯段組成,各邏輯段都有一個段名;2.每個邏輯段由若干行匯編語句組成,整個源程序必須以end語句來結束,它通知匯編程序停止匯編(end后的標號start表示該程序執(zhí)行時的起始地址)。3.每條語句最多由4個字段組成執(zhí)行性指令包括::偽指令包括:標號:(label)操作符(operator)操作數(shù)n(operand);注解(comment)名字(Name)偽操作符(Pseudo)參數(shù)列表(Parameter);注解(comment)72.4.代碼段的起始處,用assume命令說明各個段寄存器與邏輯段的關系。并由用戶自已設置各段寄存器的初值(cs除外),以建立這些邏輯段的可尋址性。5.每個源程序在代碼段中都必須含有返回到DOS操作系統(tǒng)的指令語句,以保證程序執(zhí)行完畢后自動回到DOS狀態(tài)。73.二、執(zhí)行完程序,返回DOS,有兩種方法:1標準序:將主程序定義成遠(FAR)過程,最后一條指令為RET,在程序開始,用下列指令設置堆棧段MAINPROCFAR PUSH DS MOV AX,0 PUSH AX……RETMAINENDP74.由于開始執(zhí)行程序的時候,DS、ES并未指向相對應的邏輯段,因此,還要設置DS及ES的值MOV AX,DATAMOV DS,AXMOV ES,AX75.MAINPROCFAR PUSH DS MOV AX,0 PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AX……RETMAINENDP76.2非標準序:代替標準序部分,在代碼段結束之前增加兩條語句MOV AX,4C00H(或MOVAH,4CH)INT 21H77.2.3匯編語言DOS功能調用概述DOS系統(tǒng)功能調用通常指類型號為21H的軟件中斷。因為在21H類型所對應的中斷處理程序中包含了一系列最常用的功能子程序,所以21H類型中斷幾乎包括了整個的功能,由此也被稱為系統(tǒng)功能調用。DOS功能調用的一般步驟裝入入口參數(shù)到規(guī)定的寄存器;裝入功能號到AH中;裝入子功能號到AL中;調用DOS相應功能的中斷(這里一般指INT21H);取出返回結果或出錯信息。2.3.5DOS功能調用78.2.3匯編語言DOS功能調用分類DOS軟中斷(INT20H-INT27H)指令2.3.5DOS功能調用軟中斷功能入口參數(shù)出口參數(shù)INT20H程序正常退出INT21H系統(tǒng)功能調用AH=功能號功能調用相應的入口參數(shù)功能調用相應的出口參數(shù)INT22H結束退出INT23HCTRL-BREAK退出INT24H出錯退出INT25H讀盤CX=讀出扇區(qū)數(shù)DX=起始邏輯扇區(qū)DS:BX=緩沖區(qū)地址AL=盤號CF=1出錯79.2.3匯編語言DOS功能調用分類DOS軟中斷(INT20H-INT27H)指令2.3.5DOS功能調用軟中斷功能入口參數(shù)出口參數(shù)INT26H寫盤CX=寫扇區(qū)數(shù)DX=起始邏輯扇區(qū)DS:BX=緩沖區(qū)地址AL=盤號CF=1出錯INT27H駐留退出INT28H~INT2FHDOS專用80.DOS系統(tǒng)功能調用(INT21H)INT21H功能調用服務程序具有00H~62H個不同的功能。INT2lH功能大致可以分為四個方面:設備管理、目錄管理、文件管理和其它;如:鍵盤輸入、顯示器(CRT)輸出、打印機輸出、磁盤文件管理、傳統(tǒng)文件管理、擴充文件管理方法等。2.3.5
DOS功能調用81.AH入口參數(shù)出口參數(shù)功能01H
AL=輸入字符從鍵盤輸入一個字符,并在屏幕上顯示,檢查Ctrl-Break鍵06H輸入DL=0FFH輸出DL
0FFHAL=輸入字符
直接鍵盤輸入/出字符,不檢查Ctrl-Break鍵07H
AL=輸入字符直接鍵盤輸入/出字符,不檢查Ctrl-Break鍵,無回顯08H
AL=輸入字符鍵盤輸入一個字符,無回顯0AHDS:DX=緩沖區(qū)首址
輸入字符串到內存緩沖區(qū)0BH
AL=FFH有鍵入AL=00H無鍵入檢查鍵盤輸入狀態(tài)表2-4DOS鍵盤功能調用
82.AH入口參數(shù)功能2DL=顯示字符顯示一個字符,檢驗Ctrl-Break6DL=顯示字符顯示一個字符,不檢驗Ctrl-Break9DS:DX=串首地址顯示字符串,字符串以‘$’結束表2-5DOS顯示功能調用
83.(1)01H號功能:功能:從鍵盤輸入一個字符并顯示輸出出口參數(shù):AL放輸入字符的ASCII碼。調用方式:MOV AH,1 ;功能號=1INT 21H84.(2)02H號功能:功能:將單個字符顯示在當前光標處。入口參數(shù):DL放待輸出字符的ASCII碼調用方式:MOV AH,2 ;功能號=2MOV DL,<要顯示字符的ASCII碼>INT 21H85.(3)09H號功能:顯示字符串入口參數(shù):DS:DX指向字符串首地址。調用方式:MOV AH,9 ;功能號=9LEA DX,<字符串>INT 21H注意:被顯示的字符串必須以’$’結束。86.例:編寫一完整的匯編語言程序,實現(xiàn)以下功能: 接收從鍵盤上輸入的字符,根據(jù)輸入的字符確定要顯示的字符串。1、若輸入的字符是“g”,顯示字符串“good”2、若輸入的字符是“h”,顯示字符串“happy”3、若輸入的字符是“e”,顯示字符串“error,again”87.DATASEGMENTmseg1DB‘good$’mesg2DB‘happy$’mesg3DB‘error,again$’DATAENDSCODESEGMENTASSUMEcs:code,ds:datastart:MOVAX,DATAMOVDS,AXagain:MOVAH,01H INT21H CMPAL,’g’ JZL1 CMPAL,’h’ JZL288. CMPAL,’e’ JZL3 JMPexitL1: LEADX,mesg1 MOVAH,09H INT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育機構室內綠植裝飾打造綠色學習環(huán)境
- 2025年度校企合作產(chǎn)學研合作人才培養(yǎng)協(xié)議范本3篇
- 細胞與器官(說課稿)-2023-2024學年二年級下冊科學滬教版
- 9 古詩三首 題西林壁(說課稿)-2024-2025學年語文四年級上冊統(tǒng)編版
- 全國電子工業(yè)版初中信息技術第六冊第3單元3.2活動3《實現(xiàn)垃圾分類功能》說課稿
- 2025年度風力發(fā)電線路建設安全施工監(jiān)督合同2篇
- 2025年度陶瓷茶具品牌授權代理協(xié)議3篇
- 8古詩二首 說課稿2024-2025學年統(tǒng)編版語文 二年級上冊
- 粵教版 信息技術 必修 2.2.3 合法下載網(wǎng)絡中的文件 說課稿
- 《數(shù)學廣角-推理》(說課稿)-2023-2024學年二年級下冊數(shù)學人教版
- LED燈箱安裝制作及施工方案
- 混凝土澆筑申請表
- 山丹丹開花紅艷艷教案
- 中風后認知障礙中醫(yī)臨床路徑
- 罌粟湯_朱氏集驗方卷十_方劑加減變化匯總
- 《我相信---楊培安》歌詞-勵志歌曲
- 做一個幸福班主任
- 初中班主任案例分析4篇
- 公司7s管理組織實施方案
- Q∕GDW 12147-2021 電網(wǎng)智能業(yè)務終端接入規(guī)范
- 仁愛英語單詞默寫本(全六冊)英譯漢
評論
0/150
提交評論