第4章 語言程序設計_第1頁
第4章 語言程序設計_第2頁
第4章 語言程序設計_第3頁
第4章 語言程序設計_第4頁
第4章 語言程序設計_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、本章內(nèi)容:n匯編語言概述n匯編語言源程序格式n匯編語言程序設計n系統(tǒng)功能調(diào)用機器指令機器指令:用二進制編碼的指令如:如:1000 1001 1101 1000機器語言編寫程序煩瑣,難記憶,易出錯。符號指令符號指令:由助記符、符號組成,與機器指令一一對應MOV AX,BX1000 1001 1101 1000匯編:匯編:機器只能識別機器指令,所以需要將符號指令翻譯成機器指令,翻譯的過程稱作匯編。匯編程序:匯編程序:完成匯編任務的程序。匯編語言源程序:匯編語言源程序:用符號指令書寫的程序。用符號指令書寫的程序。1EPUSH DS2BC0SUB AX,AX50PUSH AXB83412MOV AX,

2、12348ED8MOV DS,AX 匯編語言源程序匯編語言源程序匯編程序匯編程序目標文件目標文件匯編語言源程序結構采用分段式結構。一個匯編語言源程序由若干段組成,一般有數(shù)據(jù)段、代碼段、擴展段和堆棧段四種類型,源程序可以根據(jù)實際需要來確定段的數(shù)目。本節(jié)內(nèi)容:n匯編語言的語句格式n偽指令n匯編語言源程序的結構本小節(jié)內(nèi)容:n匯編語言的語句分類n匯編語言語句的格式匯編語言有三種基本語句:n指令語句n偽指令語句n宏指令語句指令語句是指在匯編時產(chǎn)生目標代碼對應著機器某種操作的語句,每條指令語句都對應著CPU的一條機器指令。偽指令語句不產(chǎn)生任何目標代碼,它是一種指示性語句,只是指示匯編程序如何進行匯編,只有

3、在匯編和連接時才起作用。宏指令語句是以宏名定義的一段指令序列,是一般性指令語句的擴展。在匯編時,凡是出現(xiàn)宏指令語句的地方全部用其對應指令序列的目標代碼代替。 指令語句的格式為:指令語句的格式為: 標號: 助記符號 操作數(shù) ;注釋偽指令語句的格式為:偽指令語句的格式為: 名稱 定義符號 參數(shù),參數(shù);注釋標號和名稱代表該語句的存儲器地址。n標號后面要緊跟一個冒號“:” 。標號在一些指令中充當操作數(shù),用來表示轉移地址。n名稱可以是變量名、段名、過程名等。匯編語言中標識符的命名規(guī)則為:標識符的第一個字符必須是字母、問號?、或下劃線四者之一;從第二個字符開始可以是字母、問號?、下劃線或數(shù)字; 標識符不能

4、是保留字(例如MOV、STACK)。在給標識符命名時,應使標識符命名與它代表的內(nèi)容相符。 指令語句中的助記符,規(guī)定了該指令語句的操作。例如ADD、XOR等。偽指令語句中的定義符對應于8086宏匯編中提供的偽操作功能。根據(jù)不同的指令,可能是單操作數(shù)或雙操作數(shù),也可能不帶操作數(shù)。偽指令語句中的操作數(shù)可以是一個或多個,操作數(shù)之間用逗號隔開。操作數(shù)可以是:n常量n變量n標號n寄存器n表達式常量:指令中出現(xiàn)的固定不變的值。可分為:n數(shù)值常量n字符常量數(shù)值常量允許使用二進制、十進制、十六進制數(shù),但要注意應以B、D、H字符結尾。十六進制數(shù)如果以字母開頭,則必須在該數(shù)前面加0,以區(qū)別于標識符,如0F5H。AS

5、CII碼常數(shù)可將字符放在單引號內(nèi),如A。 變量:指存放在某些存儲單元中的值,這些值是可變的。可以用不同的尋址方式對其存取。變量具有如下三種屬性:n段屬性:段屬性:指變量所在段的段基址。n偏移量屬性:偏移量屬性:指變量單元地址與段的起始地址之間的地址偏移量。n類型屬性:類型屬性:是指變量所占存儲單元的字節(jié)數(shù)大小。類型有字節(jié)(BYTE) 、字(WORD)、雙字(DWORD)等。 標號有三種屬性:n段屬性:段屬性:定義標號的程序段的段基址,當程序中引用一個標號時,該標號的段地址應在CS寄存器中。n偏移量屬性:偏移量屬性:標號所在段的起始地址與定義標號的地址之間的字節(jié)數(shù) 。n標號的類型屬性:標號的類型

6、屬性:NEAR和FAR。nNEAR標號可以在段內(nèi)被引用,它所代表的地址指針為兩個字節(jié);nFAR標號可以跨段引用,它所代表的地址指針為四個字節(jié)。 操作數(shù)部分是寄存器名,如AX、BX、SI等。 表達式:由常數(shù)、變量、操作符和運算符組成。有三種運算符(算術運算符、邏輯運算符、關系運算符)和兩種操作符(分析操作符、合成操作符)。表達式分為數(shù)值表達式和地址表達式。n數(shù)值表達式只產(chǎn)生數(shù)值結果。n地址表達式不是單純的數(shù)值,而是具有不同屬性的存儲器地址變量或標號,屬性包括:段、偏移量和類型。 包括:(加)、(減)、(乘)、(除)、MOD(取模)等。算術運算符可用于數(shù)值表達式,運算結果是一個數(shù)值。在地址表達式中

7、,只能使用“”、“”運算符。例如:MOV AL,10 MOD 4 ;10 MOD 4=2,故(AL)=2包括:AND(與)、OR(或)、XOR(異或)、NOT(非)。注意:邏輯運算符只適用于數(shù)字操作,對存儲器地址操作不適用。例: MOV AX,789AH XOR 000FH 該指令實際等價于 MOV AX,7895H。 包括:EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。關系運算符所連接的兩個操作數(shù),必須是數(shù)字或是同一段內(nèi)的存儲器地址。運算結果為數(shù)字值。當關系不成立,則結果為0; 當關系成立,則結果為全1。例:MOV AL,5 NE 2;關系成立

8、,故(AL)=0FFH MOV AL,5 LT 2;關系不成立,故(AL)=00H包括:n取地址偏移量算符OFFSETn取段基址算符SEGn取類型算符TYPEn取變量單元數(shù)算符LENGTHn取變量字節(jié)數(shù)算符SIZE格式:OFFSET 變量或標號例: MOV SI,OFFSET BUF 等價于 LEA SI,BUF注意:OFFSET后面只能是變量或標號。 格式:SEG 變量或標號例:MOV AX,SEG BUF;將BUF所在段的段基址送入寄存器AX。 格式:TYPE 變量或標號該算符返回的結果為一數(shù)值。 格式:LENGTH 變量如果一個變量已用重復操作符DUP說明其變量的個數(shù),則利用LENGTH

9、算符可以得到這個變量的個數(shù)。如果未用DUP說明,則得到結果總為1。 格式:SIZE 變量如果一個變量已用重復操作符DUP說明其變量的個數(shù),則利用SIZE算符可以得到這個變量的字節(jié)總數(shù)。如果未用DUP說明,則得到的結果和TYPE算符所得結果相同。 可對變量、標號或存儲器操作數(shù)的類型屬性進行修改。包括:n類型設置運算符PTRn定義類型算符THIS格式:類型 PTR 表達式其中類型可以是BYTE、WORD、DWORD、NEAR、FAR。該算符強制設置表達式類型為算符前的規(guī)定類型。例: MOV BYTE PTR SI, 200格式:THIS 類型該運算符的功能是將類型符后面的類型屬性賦予當前的存儲單元

10、。 例4.2 DATA1 EQU THIS WORD DATA2 DB 12H,34H,56H,78HDATA1變量是字類型,而DATA2為字節(jié)類型,它們具有同樣的段和偏移量。注釋由分號“;”引導,用來說明一段程序、一條或幾條指令的功能,使程序便于閱讀。匯編程序對注釋不進行匯編。 偽指令是給匯編程序的控制命令,在匯編過程中由匯編程序進行處理。翻譯成目標程序后,這些偽指令就不存在了。包括:n符號定義偽指令n數(shù)據(jù)定義偽指令n段定義偽指令n過程定義偽指令n源程序結束偽指令符號定義偽指令用來給一個符號重新命名,或定義新的類型屬性等。這些符號包括匯編語言中所用的變量名、標號名、過程名、寄存器名以及指令的

11、助記符等。符號定義偽指令有:n等價偽指令n等號偽指令格式:符號名 EQU 表達式例: A EQU 5*3+2利用EQU偽指令,可以用一個名字代表一個數(shù)值。如該數(shù)值在程序中多次被引用,這種方法可以使程序更加簡潔,并且將來修改數(shù)值時,只要修改一處,而不必修改多處,提高了修改的效率。利用EQU偽指令,也可以用一個較短的名字來代表一個較長的名字。EQU偽操作不能對同一個符號重復定義。格式:符號名 = 表達式等號偽指令主要用來定義符號常量。其功能與EQU類似,而與EQU的唯一區(qū)別是它能對符號進行再定義。例如: COUNT = 100 MOV CL,COUNT ;(CL)=100 COUNT = 200

12、MOV CL,COUNT ;(CL)=200數(shù)據(jù)定義偽指令用來定義一個變量,為變量分配存儲空間,賦初值等。格式:格式:變量名變量名 偽指令偽指令 表達式表達式,表達式,表達式變量名字段為可選項,可有可無。表達式可以不止一個,但相互之間應以逗號分開。用DB定義的變量類型為字節(jié)(BYTE);用DW定義的變量類型為字(WORD);用DD定義的變量類型為雙字(DWORD);用DQ定義的變量類型為四字(QWORD);用DT定義的變量類型為10個字節(jié)(TBYTE)。表達式可以是以下幾種:n常量或常量表達式。nASCII碼字節(jié)或字節(jié)串。n問號“?”表示初值未確定,常用來預留存儲空間。n重復子句DUPDUP格

13、式格式為: N DUP (表達式) 其中N為重復次數(shù),括號內(nèi)的表達式為重復的內(nèi)容。n地址表達式。即用變量名來表示的變量地址。 X1 DB 08HBUF DW 01H,02H,03H,04HX108H01H存儲器存儲器00HBUF02H00H03H00H04H00H01H02H03H04HBUF1 DB HELLOBUF2 DB ABBUF3 DW ABBUF1HE存儲器存儲器LBUF2LOABBABUF3BUF1 DB HELLOSA_BUF DW BUF1LA_BUF DD BUF1BUF1HE存儲器存儲器LSA_BUFLOLA_BUFBUF1的偏移地址BUF1的偏移地址BUF1的段基址一個

14、匯編語言源程序由若干個邏輯段組成,所有的指令、變量分別存放在各個邏輯段中。段定義偽指令用來定義匯編語言源程序的邏輯段。常用的段定義偽指令有:nSEGMENT/ENDSnASSUMEnORG格式:段名格式:段名 SEGEMNT 定位方式定位方式 組合方式組合方式 類別類別 段名段名 ENDSSEGEMNT為段定義符,ENDS為段結束符,它們必須成對出現(xiàn)。省略號部分:省略號部分:n對于數(shù)據(jù)段、擴展段和堆棧段來說,一般是存儲單元的定義、分配等偽指令;n對于代碼段來說,一般是完成程序功能的指令語句和偽指令語句。段名是程序員為該段起的名字,不可省略。定位方式、組合方式、類別是賦給段名的屬性。 通過建立段

15、與段寄存器之間的對應關系,來明確源程序中的邏輯段與物理段之間的關系。格式: ASSUME 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名其中段寄存器名必須是CS、DS、ES、SS中的一個,段名必須是由SEGMENT和 ENDS偽指令定義的段名。ASSUME偽指令只指定所定義的段和段寄存器的對應關系,并不能將段基址裝入段寄存器中。數(shù)據(jù)段、擴展段、堆棧段寄存器的初值應該在代碼段中由程序寫入,代碼段CS寄存器的初值由系統(tǒng)自動裝入。DSEG SEGMENT DATA1 DB 02HBUF1 DW 01H,02H,03HDSEG ENDSESEG SEGMENT DATA2 DB

16、3 DUP(03H)SUM DB ?ESEG ENDSSSEG SEGMENT STACK STK DB 100 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:ESEGSTART: MOV AX, DSEG MOV DS, AX ;將DSEG段的段基址裝入DS MOV AX, ESEG MOV ES, AX ;將ESEG段的段基址裝入ES MOV AX, SSEG MOV SS, AX ;將SSEG段的段基址裝入SS CSEG ENDS END START匯編地址計數(shù)器保存當前正在被匯編程序翻譯的指令或偽指令的地址。用

17、符號$來代表當前匯編地址計數(shù)器中的值。定位偽指令ORG可以設置當前匯編地址計數(shù)器中的值。格式:ORG 數(shù)值表達式數(shù)值表達式DSEG SEGMENTORG 10HBUF DB 1234ORG $+5NUM DW 50DSEG ENDSBUF12存儲器存儲器34NUM0010H0014H0019H32H00H50格式: 過程名過程名 PROC NEAR/FAR 過程名過程名 ENDP如沒有指明類型,則默認為NEAR類型。PROC和ENDP必須成對出現(xiàn)。當一個程序段被定義為過程后,在其它地方就可以通過CALL指令來調(diào)用這段程序。 格式: END 標號標號/過程名過程名該語句為源程序的最后一個語句,表

18、示源程序的結束。其中標號表示程序開始執(zhí)行的起始地址。若有多個模塊相連接,則只有主模塊要使用標號,其他模塊只使用END而不必指定標號。 例4.13:兩數(shù)求和的程序段DSEG SEGMENT DATA ;定義數(shù)據(jù)段DATA1 DB 15H;被加數(shù)SUM DB 00H;和DSEG ENDS;數(shù)據(jù)段結束CSEG SEGMENT CODE ;定義代碼段ASSUME CS:CSEG,DS:DSEGSTART: MOV AX, DSEG MOV DS, AX;裝入數(shù)據(jù)段DS初值 MOV AL, DATA1;被加數(shù)送AL ADD AL, 12H; (AL)+12H AL MOV SUM, AL;和送SUM H

19、LT;暫停指令CSEG ENDS;代碼段結束 END START;源程序結束匯編語言程序的結構是分段結構形式,一個匯編語言源程序由若干段組成,每個段以SEGMENT開始,以ENDS結束。整個源程序以END結束。每個段均有若干行指令,每一條指令占一行。本節(jié)內(nèi)容:n程序設計的基本步驟n順序結構n分支結構n循環(huán)結構n子程序結構分析問題,建立數(shù)學模型確定算法繪制流程圖分配存儲器及寄存器編制程序調(diào)試程序整理開發(fā)文檔、投入使用程序的基本結構有三種形式:順序結構、分支結構和循環(huán)結構。 順序程序是指程序在執(zhí)行時是完全按照指令的存放順序從第一條開始逐條執(zhí)行,直到最后一條指令為止。用順序程序能較好地完成一些基本功

20、能,例如數(shù)據(jù)的傳送和交接、查找和算術運算等。它是構成復雜程序的基礎。 設內(nèi)存單元DATA存放一字節(jié)無符號數(shù),編程將其拆成二個一位十六進制數(shù),HEX單元存放低 位 十 六 進 制 數(shù) ,HEX+1單元存放高位十六進制數(shù)。DSEG SEGMENTDATA DB 8AHHEX DB 0,0DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART: MOV AX,DSEG MOV DS,AX MOV AL,DATA;無符號數(shù)送AL MOV AH,AL;保存副本

21、到AH AND AL,0FH ;屏蔽高四位 MOV HEX,AL;保存低四位 AND AH,0F0H ;屏蔽低四位 MOV CL,4 SHR AH,CL;右移四位 MOV HEX+1,AH;保存高四位 MOV AH,4CH INT 21H ;返回操作系統(tǒng)CSEG ENDS END START 在很多實際問題中,都是根據(jù)不同的情況進行不同的處理。這種思想體現(xiàn)在程序設計中,就是根據(jù)不同條件而跳到不同的程序段去執(zhí)行,這就構成了分支程序。在匯編語言程序設計中,跳躍是通過條件轉移指令來實現(xiàn)的。設內(nèi)存中有三個互不相等的有符號字數(shù)據(jù),分別存放在X、Y、Z字單元中,編程將其中最小值存入MIN單元。DSEG S

22、EGMENTX DW 4321HY DW 7658HZ DW 9B00HMIN DW ?DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP(?)SSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART:MOV AX,DSEG MOV DS,AX MOV AX,X CMP AX,Y JL NEXT MOV AX,YNEXT: CMP AX,Z JL DONE MOV AX,ZDONE: MOV MIN,AX MOV AH,4CH INT 21H CSEG ENDS END START 在程序設計中,經(jīng)常遇到一

23、個程序段需要多次重復執(zhí)行。對這類問題采用循環(huán)程序結構,可以使程序代碼縮短,并節(jié)省內(nèi)存。四部分:n循環(huán)初始部分:建地址指針、置計數(shù)初值、設置必要的常數(shù)、對工作寄存器及工作單元置初值或清0等。n循環(huán)操作部分:重復執(zhí)行的部分,循環(huán)的核心。n循環(huán)修改部分:修改計數(shù)器、寄存器、地址指針、恢復某些參數(shù)。n循環(huán)控制部分:判斷控制循環(huán)是否結束或繼續(xù).循環(huán)程序有兩個基本結構:n先處理后判斷結構n先判斷后處理結構試編程統(tǒng)計由DATA單元開始的數(shù)據(jù)塊中能被3整除的數(shù)的個數(shù)。結果存于COUNT單元中。(設數(shù)據(jù)塊中共有10個無符號數(shù))分析:可以采用除法指令,對待判斷的無符號數(shù)做除3操作,然后檢查余數(shù)是否為零,若為零,則

24、該數(shù)能被3整除。 DSEG SEGMENTDATA DB 41,9,33H,0F0H,32,0AH,0FFH,99,68,23HCOUNT DW ?DSEG ENDS SSEG SEGMENT STACKSTK DB 100 DUP (?)SSEG ENDSCSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX LEA SI,DATA MOV CX,10 MOV DX,0 MOV BL,3LP: MOV AL,SI MOV AH,0 DIV BL AND AH,AH JNZ NEXT INC DX NEX

25、T: INC SI LOOP LP MOV COUNT,DX MOV AH,4CH INT 21HCSEG ENDS END START 試編程統(tǒng)計DA1字單元中二進制數(shù)據(jù)中含1的個數(shù),結果存于DA2單元中。分析:可以利用移位指令,將待判斷的字數(shù)據(jù)一位一位地移到進位位中,然后判斷進位位是1還是0,以此實現(xiàn)對二進制數(shù)據(jù)中含1的個數(shù)統(tǒng)計。 DSEG SEGMENT DA1 DW 3F28HDA2 DB ?DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP (?)SSEG ENDSCSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEGS

26、TART: MOV AX,DSEG MOV DS,AX XOR BL,BL MOV AX,DA1LP: AND AX,AX JZ DONE SHL AX,1 JNC LP INC BL JMP LP DONE: MOV DA2,BL MOV AH,4CH INT 21HCSEG ENDS END START 在編寫程序時,經(jīng)常在不同的位置或不同的程序段中存在相同語句串,可以將它們抽取出來,組成子程序,供其它程序調(diào)用,調(diào)用子程序的程序被稱為主程序。不但使主程序結構清晰,而且節(jié)省了內(nèi)存空間。主程序和子程序之間的信息交換主要通過參數(shù)的傳遞來實現(xiàn)。參數(shù)傳遞的方法有三種:寄存器傳遞法存儲器傳遞法堆棧傳遞

27、法。注意保護和恢復現(xiàn)場。所謂現(xiàn)場,就是指調(diào)用程序當前CPU狀態(tài),包括標志寄存器、通用寄存器、段寄存器以及指令指針寄存器的內(nèi)容。保護和恢復的操作一般在子程序中進行,進入子程序后,就應該把子程序中所使用到的寄存器內(nèi)容保存在堆棧中,而在子程序返回主程序之前根據(jù)堆棧中的內(nèi)容恢復原來的狀態(tài)。 例4.19 編制程序實現(xiàn)將內(nèi)存中一字符串的小寫字母轉換成大寫字母。分析:n由ASCII碼編碼表可知,英文大、小寫的26個字母字符編碼順序遞增,且各小寫字母與其對應大寫字母的編碼差值均為32,因此當要將小寫字母轉換成大寫字母時,只需將其ASCII碼值減去32即可。n這里將判斷輸入的字符是否小寫字母的工作編為子程序,該

28、子程序將判斷的結果通過標志位CF返回給主程序,CF=0表示是小寫字母,CF=1表示不是小寫字母。n主程序通過AL寄存器將要判斷的內(nèi)容傳遞給子程序。DSEG SEGMENTSTRBUF DB WelCome To our Class!$DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP (?)SSEG ENDSCSEG SEGMENTASSUME DS:DSEG,SS:SSEG,CS:CSEGSTART: MOV AX,DSEG MOV DS,AX MOV BX,OFFSET STRBUF LOP: MOV AL,BX CMP AL,$ JE EXIT CALL

29、COMPARE JC NEXT SUB AL,32 MOV BX,AL NEXT:INC BX JMP LOP EXIT: HLT ;子程序名:COMPARE;功能:判斷輸入的字符是否小寫字母;入口參數(shù):AL待判斷的字符;出口參數(shù):CF是否是小寫字母 COMPARE PROC NEAR CMP AL,a JB SETFLAG CMP AL,z JA SETFLAG CLC RET SETFLAG: STC RET COMPARE ENDP CSEG ENDS END START如果需要傳遞的參數(shù)比較多,可以考慮采用存儲器傳遞法,也就是在內(nèi)存開辟一塊區(qū)域用來保存和傳遞主程序和子程序間的參數(shù)。例4

30、.20 編程將四個字節(jié)單元的非壓縮BCD碼轉換為4位壓縮BCD碼(兩個字節(jié))后存放到首址為BCDBUF的兩個字節(jié)單元中。DSEG SEGMENTSRCBUF DB 06H,02H,07H,04HBCDBUF DB 2 DUP (?)DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP (?)SSEG ENDSCSEG SEGMENTASSUME DS:DSEG,SS:SSEG,CS:CSEGSTART: MOV AX,DSEG MOV DS,AX CALL MERGE HLTMERGE PROC NEAR PUSH AX PUSH BX PUSH CX LEA S

31、I,SRCBUF MOV AH, SI MOV BH, SI+1 MOV CL, 4 SHL AH, CL ADD AH,BH MOV AL, SI+2 MOV BL, SI+3 MOV CL, 4 SHL AL, CL ADD AL,BL MOV BCDBUF,AH MOV BCDBUF+1,AL POP CX POP BX POP AX RET MERGE ENDPCSEG ENDS END START在內(nèi)存區(qū)域開辟一段堆棧區(qū),用來進行主程序和子程序之間的參數(shù)傳遞,也是一種行之有效的方法。用堆棧傳遞參數(shù)的方法是在調(diào)用子程序之前,用PUSH指令將輸入?yún)?shù)壓入堆棧,在子程序中用出棧的方式依次獲

32、得參數(shù)。使用這種方式傳遞參數(shù)時,要特別注意堆棧中斷點的保護與恢復。例4.21 將內(nèi)存中的兩個數(shù)組的對應單元求和,其結果存放到另一個數(shù)組中,要求求和部分由子程序完成。需要注意,由于CALL指令將返回地址存放在堆棧的頂部,故在子程序中,從堆棧中取參數(shù),不能使用POP指令,應該使用MOV指令直接到堆棧中取出參數(shù)。DSEG SEGMENTA1 DW 100,300,28,40,55,121,39,21,39,165A2 DW 20,102,18,33,65,141,1,155,18,120A3 DW 10 DUP (0)DSEG ENDSSSEG SEGMENT STACKSTK DB 100 DUP

33、 (?)SSEG ENDSCSEG SEGMENTASSUME DS:DSEG,SS:SSEG,CS:CSEGSTART:MOV AX,DSEG MOV DS,AX MOV CX,10 MOV SI,OFFSET A1MOV DI,OFFSET A2MOV BX,OFFSET A3LOP:PUSH WORD PTR SI PUSH WORD PTR DI CALL SUM MOV BX,AX ADD BX,2 ADD SI,2 ADD DI,2 LOOP LOP MOV AH,4CH INT 21HSUM PROC NEAR PUSH BP MOV BP,SP MOV AX,BP+2 ADD

34、AX,BP+4 POP BP RET SUM ENDPCSEG ENDS END STARTDOS(Disk Operation System)和BIOS(Basic Input and Output System)為用戶提供兩組系統(tǒng)服務程序。用戶程序可以調(diào)用這些系統(tǒng)服務程序。DOS提供若干功能調(diào)用。包括基本輸入/輸出管理、內(nèi)存儲器讀/寫管理、磁盤文件的讀/寫管理、時間和日期的設置功能。BIOS在較低層次上為用戶提供一組I/O程序,要求用戶對硬件有一定的了解,但也不要求用戶直接控制外設。BIOS駐留在ROM中,獨立于操作系統(tǒng)。用戶通過軟中斷指令INT n去調(diào)用DOS和BIOS中的服務程序來訪問

35、系統(tǒng)。本小節(jié)內(nèi)容:n系統(tǒng)功能調(diào)用的方法nDOS系統(tǒng)功能調(diào)用nBIOS系統(tǒng)功能調(diào)用INT 21H是一個具有多個子功能的中斷服務程序,這些子功能的編號稱為功能號。INT 21H一般稱為系統(tǒng)功能調(diào)用。調(diào)用步驟:調(diào)用步驟:置入口參數(shù)置入口參數(shù)功能號功能號AH執(zhí)行執(zhí)行INT 21H分析出口參數(shù)分析出口參數(shù)視具體情況而定視具體情況而定幾個常用的DOS系統(tǒng)功能調(diào)用:n讀取鍵盤單個字符并回顯(01H功能)n在屏幕上輸出單個字符(02H功能)n在打印裝置上輸出單個字符(05H功能)n在屏幕上輸出字符串(09H功能)n字符串輸入(0AH功能)調(diào)用方式: MOV AH,1;子功能號送AH INT 21H說明:該調(diào)用

36、沒有入口參數(shù),執(zhí)行時,系統(tǒng)掃描鍵盤,等到鍵盤按下,先檢查是否是CTRL-BREAK鍵,如是則退出命令執(zhí)行,否則將按下鍵對應ASCII碼送入AL寄存器,并在屏幕上顯示該字符。調(diào)用方式: MOV AH,2;子功能號送AH MOV DL,A INT 21H;將字符A在屏幕上顯示出來說明:該調(diào)用無出口參數(shù),入口參數(shù)(待顯示字符的ASCII碼)送DL,如DL中的字符為CTRL-BREAK,則終止程序執(zhí)行。 調(diào)用方式: MOV AH,5;子功能號送AH MOV DL,A INT 21H;將字符A在打印機上打印出來 功能:在輸出設備上顯示一個以$為結束標志的字符串。入口參數(shù):DS:DX指向一個以$為結束標志的字符串。例: BUF DB WELCOME TO OUR SYSTEM$ . MOV DX,OFFSET BUF MOV AH,9 INT 21H 運行后,在屏幕上顯示“WELCOME TO OUR SYSTEM”。 功能:將從鍵盤上輸入的一串字符送到指定的內(nèi)存緩沖區(qū)。入口參數(shù):DS:DX指向內(nèi)存緩沖區(qū)。緩沖區(qū)的第一個字節(jié):放緩沖區(qū)能容納的最大字符個數(shù)(1-255),不能為零。緩沖區(qū)的第二個字節(jié):是保留來填寫實際輸入的字符個數(shù),由計算機自動填入。緩沖區(qū)的第三字節(jié)開始,存放從鍵盤接收到的字符,最后結束字符串的回車符也包括在內(nèi)。如實際鍵入的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論