




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、本章內(nèi)容: n匯編語言概述 n匯編語言源程序格式 n匯編語言程序設(shè)計 n系統(tǒng)功能調(diào)用 機器指令機器指令:用二進制編碼的指令 如:如:1000 1001 1101 1000 機器語言編寫程序煩 瑣,難記憶,易出錯。 符號指令符號指令:由助記符、符號組成,與機器指令一一對應 MOV AX,BX1000 1001 1101 1000 匯編:匯編:機器只能識別機器指令,所以需要將符號指令 翻譯成機器指令,翻譯的過程稱作匯編。 匯編程序:匯編程序:完成匯編任務(wù)的程序。 匯編語言源程序:匯編語言源程序:用符號指令書寫的程序。用符號指令書寫的程序。 1EPUSH DS 2BC0SUB AX,AX 50PUS
2、H AX B83412MOV AX,1234 8ED8MOV DS,AX 匯編語言源程序匯編語言源程序 匯編程序匯編程序 目標文件目標文件 匯編語言源程序結(jié)構(gòu)采用分段式結(jié)構(gòu)。 一個匯編語言源程序由若干段組成,一般有數(shù)據(jù)段、 代碼段、擴展段和堆棧段四種類型,源程序可以根 據(jù)實際需要來確定段的數(shù)目。 本節(jié)內(nèi)容: n匯編語言的語句格式 n偽指令 n匯編語言源程序的結(jié)構(gòu) 本小節(jié)內(nèi)容: n匯編語言的語句分類 n匯編語言語句的格式 匯編語言有三種基本語句: n指令語句 n偽指令語句 n宏指令語句 指令語句是指在匯編時產(chǎn)生目標代碼對應著機 器某種操作的語句,每條指令語句都對應著 CPU的一條機器指令。 偽指
3、令語句不產(chǎn)生任何目標代碼,它是一種指 示性語句,只是指示匯編程序如何進行匯編, 只有在匯編和連接時才起作用。 宏指令語句是以宏名定義的一段指令序列,是 一般性指令語句的擴展。 在匯編時,凡是出現(xiàn)宏指令語句的地方全部用 其對應指令序列的目標代碼代替。 指令語句的格式為:指令語句的格式為: 標號: 助記符號 操作數(shù) ;注釋 偽指令語句的格式為:偽指令語句的格式為: 名稱 定義符號 參數(shù),參數(shù);注釋 標號和名稱代表該語句的存儲器地址。 n標號后面要緊跟一個冒號“:” 。標號在一些指令中充 當操作數(shù),用來表示轉(zhuǎn)移地址。 n名稱可以是變量名、段名、過程名等。 匯編語言中標識符的命名規(guī)則為: 標識符的第一
4、個字符必須是字母、問號?、或下劃線四 者之一; 從第二個字符開始可以是字母、問號?、下劃線或數(shù) 字; 標識符不能是保留字(例如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ù)值常量
5、允許使用二進制、十進制、十六進 制數(shù),但要注意應以B、D、H字符結(jié)尾。 十六進制數(shù)如果以字母開頭,則必須在該數(shù) 前面加0,以區(qū)別于標識符,如0F5H。 ASCII碼常數(shù)可將字符放在單引號內(nèi),如A。 變量:指存放在某些存儲單元中的值,這些值是可 變的。 可以用不同的尋址方式對其存取。變量具有如下三 種屬性: n段屬性:段屬性:指變量所在段的段基址。 n偏移量屬性:偏移量屬性:指變量單元地址與段的起始地址 之間的地址偏移量。 n類型屬性:類型屬性:是指變量所占存儲單元的字節(jié)數(shù)大 小。類型有字節(jié)(BYTE) 、字(WORD)、雙字 (DWORD)等。 標號有三種屬性: n段屬性:段屬性:定義標號的程
6、序段的段基址,當程序中引用一 個標號時,該標號的段地址應在CS寄存器中。 n偏移量屬性:偏移量屬性:標號所在段的起始地址與定義標號的地址 之間的字節(jié)數(shù) 。 n標號的類型屬性:標號的類型屬性:NEAR和FAR。 nNEAR標號可以在段內(nèi)被引用,它所代表的地址指針 為兩個字節(jié); nFAR標號可以跨段引用,它所代表的地址指針為四個 字節(jié)。 操作數(shù)部分是寄存器名,如AX、BX、SI等。 表達式:由常數(shù)、變量、操作符和運算符組成。 有三種運算符(算術(shù)運算符、邏輯運算符、關(guān)系運算 符)和兩種操作符(分析操作符、合成操作符)。 表達式分為數(shù)值表達式和地址表達式。 n數(shù)值表達式只產(chǎn)生數(shù)值結(jié)果。 n地址表達式不
7、是單純的數(shù)值,而是具有不同屬性 的存儲器地址變量或標號,屬性包括:段、偏移 量和類型。 包括:(加)、(減)、(乘)、(除)、 MOD(取模)等。 算術(shù)運算符可用于數(shù)值表達式,運算結(jié)果是 一個數(shù)值。 在地址表達式中,只能使用“”、“” 運算符。 例如: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(小于)
8、、GT(大 于)、LE(小于等于)、GE(大于等于)。 關(guān)系運算符所連接的兩個操作數(shù),必須是數(shù)字或是 同一段內(nèi)的存儲器地址。 運算結(jié)果為數(shù)字值。 當關(guān)系不成立,則結(jié)果為0; 當關(guān)系成立,則結(jié)果為全1。 例:MOV AL,5 NE 2;關(guān)系成立,故(AL)=0FFH MOV AL,5 LT 2;關(guān)系不成立,故(AL)=00H 包括: n取地址偏移量算符OFFSET n取段基址算符SEG n取類型算符TYPE n取變量單元數(shù)算符LENGTH n取變量字節(jié)數(shù)算符SIZE 格式:OFFSET 變量或標號 例: MOV SI,OFFSET BUF 等價于 LEA SI,BUF 注意:OFFSET后面只能
9、是變量或標號。 格式:SEG 變量或標號 例:MOV AX,SEG BUF;將BUF所在段的 段基址送入寄存器AX。 格式:TYPE 變量或標號 該算符返回的結(jié)果為一數(shù)值。 格式:LENGTH 變量 如果一個變量已用重復操作符DUP說明其變 量的個數(shù),則利用LENGTH算符可以得到這 個變量的個數(shù)。 如果未用DUP說明,則得到結(jié)果總為1。 格式:SIZE 變量 如果一個變量已用重復操作符DUP說明其變 量的個數(shù),則利用SIZE算符可以得到這個變 量的字節(jié)總數(shù)。 如果未用DUP說明,則得到的結(jié)果和TYPE算 符所得結(jié)果相同。 可對變量、標號或存儲器操作數(shù)的類型屬性 進行修改。 包括: n類型設(shè)置
10、運算符PTR n定義類型算符THIS 格式:類型 PTR 表達式 其中類型可以是BYTE、WORD、DWORD、 NEAR、FAR。該算符強制設(shè)置表達式類型為 算符前的規(guī)定類型。 例: MOV BYTE PTR SI, 200 格式:THIS 類型 該運算符的功能是將類型符后面的類型屬性 賦予當前的存儲單元。 例4.2 DATA1 EQU THIS WORD DATA2 DB 12H,34H,56H,78H DATA1變量是字類型,而DATA2為字節(jié)類型, 它們具有同樣的段和偏移量。 注釋由分號“;”引導,用來說明一段程序、 一條或幾條指令的功能,使程序便于閱讀。 匯編程序?qū)ψ⑨尣贿M行匯編。
11、偽指令是給匯編程序的控制命令,在匯編過程中由 匯編程序進行處理。 翻譯成目標程序后,這些偽指令就不存在了。 包括: n符號定義偽指令 n數(shù)據(jù)定義偽指令 n段定義偽指令 n過程定義偽指令 n源程序結(jié)束偽指令 符號定義偽指令用來給一個符號重新命名, 或定義新的類型屬性等。 這些符號包括匯編語言中所用的變量名、標 號名、過程名、寄存器名以及指令的助記符 等。 符號定義偽指令有: n等價偽指令 n等號偽指令 格式:符號名 EQU 表達式 例: A EQU 5*3+2 利用EQU偽指令,可以用一個名字代表一個數(shù)值。 如該數(shù)值在程序中多次被引用,這種方法可以使程 序更加簡潔,并且將來修改數(shù)值時,只要修改一
12、處, 而不必修改多處,提高了修改的效率。 利用EQU偽指令,也可以用一個較短的名字來代表 一個較長的名字。 EQU偽操作不能對同一個符號重復定義。 格式:符號名 = 表達式 等號偽指令主要用來定義符號常量。 其功能與EQU類似,而與EQU的唯一區(qū)別是 它能對符號進行再定義。 例如: COUNT = 100 MOV CL,COUNT ;(CL)=100 COUNT = 200 MOV CL,COUNT ;(CL)=200 數(shù)據(jù)定義偽指令用來定義一個變量,為變量 分配存儲空間,賦初值等。 格式:格式:變量名變量名 偽指令偽指令 表達式表達式,表達式,表達式 變量名字段為可選項,可有可無。 表達式可
13、以不止一個,但相互之間應以逗號 分開。 用DB定義的變量類型為字節(jié)(BYTE); 用DW定義的變量類型為字(WORD); 用DD定義的變量類型為雙字(DWORD); 用DQ定義的變量類型為四字(QWORD); 用DT定義的變量類型為10個字節(jié)(TBYTE)。 表達式可以是以下幾種: n常量或常量表達式。 nASCII碼字節(jié)或字節(jié)串。 n問號“?”表示初值未確定,常用來預留存儲空 間。 n重復子句DUPDUP格式格式為: N DUP (表達式) 其中N為重復次數(shù),括號內(nèi)的表達式為重復的內(nèi)容。 n地址表達式。即用變量名來表示的變量地址。 X1 DB 08H BUF DW 01H,02H,03H,0
14、4H X108H 01H 存儲器存儲器 00H BUF 02H 00H 03H 00H 04H 00H 01H 02H 03H 04H BUF1 DB HELLO BUF2 DB AB BUF3 DW AB BUF1H E 存儲器存儲器 L BUF2 L O A B B A BUF3 BUF1 DB HELLO SA_BUF DW BUF1 LA_BUF DD BUF1 BUF1H E 存儲器存儲器 L SA_BUF L O LA_BUF BUF1的偏移地址 BUF1的偏移地址 BUF1的段基址 一個匯編語言源程序由若干個邏輯段組成, 所有的指令、變量分別存放在各個邏輯段中。 段定義偽指令用來
15、定義匯編語言源程序的邏 輯段。 常用的段定義偽指令有: nSEGMENT/ENDS nASSUME nORG 格式:段名格式:段名 SEGEMNT 定位方式定位方式 組合方式組合方式 類別類別 段名段名 ENDS SEGEMNT為段定義符,ENDS為段結(jié)束符,它們必須成對出 現(xiàn)。 省略號部分:省略號部分: n對于數(shù)據(jù)段、擴展段和堆棧段來說,一般是存儲單元的定 義、分配等偽指令; n對于代碼段來說,一般是完成程序功能的指令語句和偽指 令語句。 段名是程序員為該段起的名字,不可省略。 定位方式、組合方式、類別是賦給段名的屬性。 通過建立段與段寄存器之間的對應關(guān)系,來明確源 程序中的邏輯段與物理段之
16、間的關(guān)系。 格式: ASSUME 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名 其中段寄存器名必須是CS、DS、ES、SS中的一個, 段名必須是由SEGMENT和 ENDS偽指令定義的段名。 ASSUME偽指令只指定所定義的段和段寄存器的對 應關(guān)系,并不能將段基址裝入段寄存器中。 數(shù)據(jù)段、擴展段、堆棧段寄存器的初值應該在代碼 段中由程序?qū)懭?,代碼段CS寄存器的初值由系統(tǒng)自 動裝入。 DSEG SEGMENT DATA1 DB 02H BUF1 DW 01H,02H,03H DSEG ENDS ESEG SEGMENT DATA2 DB 3 DUP(03H) SUM DB
17、 ? ESEG ENDS SSEG SEGMENT STACK STK DB 100 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:ESEG START: 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ù)器保存當前正在被匯編程序翻 譯的指令或偽指令的地址。用符號$來代表當
18、前匯編地址計數(shù)器中的值。 定位偽指令ORG可以設(shè)置當前匯編地址計數(shù) 器中的值。 格式:ORG 數(shù)值表達式數(shù)值表達式 DSEG SEGMENT ORG 10H BUF DB 1234 ORG $+5 NUM DW 50 DSEG ENDS BUF1 2 存儲器存儲器 3 4 NUM 0010H 0014H 0019H32H 00H 50 格式: 過程名過程名 PROC NEAR/FAR 過程名過程名 ENDP 如沒有指明類型,則默認為NEAR類型。 PROC和ENDP必須成對出現(xiàn)。 當一個程序段被定義為過程后,在其它地方 就可以通過CALL指令來調(diào)用這段程序。 格式: END 標號標號/過程名過
19、程名 該語句為源程序的最后一個語句,表示源程 序的結(jié)束。 其中標號表示程序開始執(zhí)行的起始地址。 若有多個模塊相連接,則只有主模塊要使用 標號,其他模塊只使用END而不必指定標號。 例4.13:兩數(shù)求和的程序段 DSEG SEGMENT DATA ;定義數(shù)據(jù)段 DATA1 DB 15H;被加數(shù) SUM DB 00H;和 DSEG ENDS;數(shù)據(jù)段結(jié)束 CSEG SEGMENT CODE ;定義代碼段 ASSUME CS:CSEG,DS:DSEG START: MOV AX, DSEG MOV DS, AX;裝入數(shù)據(jù)段DS初值 MOV AL, DATA1;被加數(shù)送AL ADD AL, 12H; (
20、AL)+12H AL MOV SUM, AL;和送SUM HLT;暫停指令 CSEG ENDS;代碼段結(jié)束 END START;源程序結(jié)束 匯編語言程序的結(jié)構(gòu)是分段結(jié)構(gòu)形式, 一個匯編語言源程序由若干段組成,每個 段以SEGMENT開始,以ENDS結(jié)束。 整個源程序以END結(jié)束。 每個段均有若干行指令,每一條指令占 一行。 本節(jié)內(nèi)容: n程序設(shè)計的基本步驟 n順序結(jié)構(gòu) n分支結(jié)構(gòu) n循環(huán)結(jié)構(gòu) n子程序結(jié)構(gòu) 分析問題,建立數(shù)學模型 確定算法 繪制流程圖 分配存儲器及寄存器 編制程序 調(diào)試程序 整理開發(fā)文檔、投入使用 程序的基本結(jié)構(gòu)有三種形式:順序結(jié)構(gòu)、分 支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。 順序程序是指程序在執(zhí)
21、行時是完全按照指令 的存放順序從第一條開始逐條執(zhí)行,直到最 后一條指令為止。 用順序程序能較好地完成一些基本功能,例 如數(shù)據(jù)的傳送和交接、查找和算術(shù)運算等。 它是構(gòu)成復雜程序的基礎(chǔ)。 設(shè)內(nèi)存單元DATA存放 一字節(jié)無符號數(shù),編程 將其拆成二個一位十六 進制數(shù),HEX單元存放 低 位 十 六 進 制 數(shù) , HEX+1單元存放高位十 六進制數(shù)。 DSEG SEGMENT DATA DB 8AH HEX DB 0,0 DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSE
22、G,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AL,DATA;無符號數(shù)送AL MOV AH,AL;保存副本到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)在程序設(shè)計中,就是根據(jù)不 同條件而跳到不同的程序段去執(zhí)行,這就構(gòu)成了分 支程序。 在匯編語言
23、程序設(shè)計中,跳躍是通過條件轉(zhuǎn)移指令 來實現(xiàn)的。 設(shè)內(nèi)存中有三個互不相 等的有符號字數(shù)據(jù),分 別存放在X、Y、Z字單 元中,編程將其中最小 值存入MIN單元。 DSEG SEGMENT X DW 4321H Y DW 7658H Z DW 9B00H MIN DW ? DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,X CMP AX,Y JL NEXT MOV AX,Y NE
24、XT: CMP AX,Z JL DONE MOV AX,Z DONE: MOV MIN,AX MOV AH,4CH INT 21H CSEG ENDS END START 在程序設(shè)計中,經(jīng)常遇到一個程序段需要多次重復執(zhí)行。對 這類問題采用循環(huán)程序結(jié)構(gòu),可以使程序代碼縮短,并節(jié)省 內(nèi)存。 四部分: n循環(huán)初始部分:建地址指針、置計數(shù)初值、設(shè)置必要的常 數(shù)、對工作寄存器及工作單元置初值或清0等。 n循環(huán)操作部分:重復執(zhí)行的部分,循環(huán)的核心。 n循環(huán)修改部分:修改計數(shù)器、寄存器、地址指針、恢復某 些參數(shù)。 n循環(huán)控制部分:判斷控制循環(huán)是否結(jié)束或繼續(xù). 循環(huán)程序有兩個基本結(jié)構(gòu): n先處理后判斷結(jié)構(gòu) n
25、先判斷后處理結(jié)構(gòu) 試編程統(tǒng)計由DATA單元開始的數(shù)據(jù)塊中能被3 整除的數(shù)的個數(shù)。結(jié)果存于COUNT單元中。 (設(shè)數(shù)據(jù)塊中共有10個無符號數(shù)) 分析:可以采用除法指令,對待判斷的無符 號數(shù)做除3操作,然后檢查余數(shù)是否為零,若 為零,則該數(shù)能被3整除。 DSEG SEGMENT DATA DB 41,9,33H,0F0H,32,0AH,0FFH,99,68,23H COUNT DW ? DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START
26、: MOV AX,DSEG MOV DS,AX LEA SI,DATA MOV CX,10 MOV DX,0 MOV BL,3 LP: MOV AL,SI MOV AH,0 DIV BL AND AH,AH JNZ NEXT INC DX NEXT: INC SI LOOP LP MOV COUNT,DX MOV AH,4CH INT 21H CSEG ENDS END START 試編程統(tǒng)計DA1字單元中二進制數(shù)據(jù)中含1的個 數(shù),結(jié)果存于DA2單元中。 分析:可以利用移位指令,將待判斷的字數(shù)據(jù) 一位一位地移到進位位中,然后判斷進位位是1 還是0,以此實現(xiàn)對二進制數(shù)據(jù)中含1的個數(shù)統(tǒng) 計。 DS
27、EG SEGMENT DA1 DW 3F28H DA2 DB ? DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX XOR BL,BL MOV AX,DA1 LP: AND AX,AX JZ DONE SHL AX,1 JNC LP INC BL JMP LP DONE: MOV DA2,BL MOV AH,4CH INT 21H CSEG ENDS END START 在編寫程序時,
28、經(jīng)常在不同的位置或不同的程序段中 存在相同語句串,可以將它們抽取出來,組成子程序, 供其它程序調(diào)用,調(diào)用子程序的程序被稱為主程序。 不但使主程序結(jié)構(gòu)清晰,而且節(jié)省了內(nèi)存空間。 主程序和子程序之間的信息交換主要通過參數(shù)的傳 遞來實現(xiàn)。參數(shù)傳遞的方法有三種: 寄存器傳遞法 存儲器傳遞法 堆棧傳遞法。 注意保護和恢復現(xiàn)場。所謂現(xiàn)場,就是指調(diào)用程序 當前CPU狀態(tài),包括標志寄存器、通用寄存器、段 寄存器以及指令指針寄存器的內(nèi)容。保護和恢復的 操作一般在子程序中進行,進入子程序后,就應該 把子程序中所使用到的寄存器內(nèi)容保存在堆棧中, 而在子程序返回主程序之前根據(jù)堆棧中的內(nèi)容恢復 原來的狀態(tài)。 例4.19
29、 編制程序?qū)崿F(xiàn)將內(nèi)存中一字符串的小寫字母轉(zhuǎn)換成 大寫字母。 分析: n由ASCII碼編碼表可知,英文大、小寫的26個字母字符編 碼順序遞增,且各小寫字母與其對應大寫字母的編碼差值 均為32,因此當要將小寫字母轉(zhuǎn)換成大寫字母時,只需將 其ASCII碼值減去32即可。 n這里將判斷輸入的字符是否小寫字母的工作編為子程序, 該子程序?qū)⑴袛嗟慕Y(jié)果通過標志位CF返回給主程序,CF=0 表示是小寫字母,CF=1表示不是小寫字母。 n主程序通過AL寄存器將要判斷的內(nèi)容傳遞給子程序。 DSEG SEGMENT STRBUF DB WelCome To our Class!$ DSEG ENDS SSEG SE
30、GMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX MOV BX,OFFSET STRBUF LOP: MOV AL,BX CMP AL,$ JE EXIT CALL COMPARE JC NEXT SUB AL,32 MOV BX,AL NEXT:INC BX JMP LOP EXIT: HLT ;子程序名:COMPARE ;功能:判斷輸入的字符是否小寫字母 ;入口參數(shù):AL待判斷的字符 ;出口參數(shù):CF是否是小寫字母
31、 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.20 編程將四個字節(jié)單元的非壓縮BCD碼 轉(zhuǎn)換為4位壓縮BCD碼(兩個字節(jié))后存放到 首址為BCDBUF的兩個字節(jié)單元中。 DSEG SEGMENT SRCBUF DB 06H,02H,07H,04H BCDBUF DB 2 DUP (?)
32、 DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX CALL MERGE HLT MERGE PROC NEAR PUSH AX PUSH BX PUSH CX LEA SI,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,
33、CL ADD AL,BL MOV BCDBUF,AH MOV BCDBUF+1,AL POP CX POP BX POP AX RET MERGE ENDP CSEG ENDS END START 在內(nèi)存區(qū)域開辟一段堆棧區(qū),用來進行主程序和子程序之間 的參數(shù)傳遞,也是一種行之有效的方法。 用堆棧傳遞參數(shù)的方法是在調(diào)用子程序之前,用PUSH指令將 輸入?yún)?shù)壓入堆棧,在子程序中用出棧的方式依次獲得參數(shù)。 使用這種方式傳遞參數(shù)時,要特別注意堆棧中斷點的保護與 恢復。 例4.21 將內(nèi)存中的兩個數(shù)組的對應單元求和,其結(jié)果存放 到另一個數(shù)組中,要求求和部分由子程序完成。 需要注意,由于CALL指令將返回
34、地址存放在堆棧的頂部,故 在子程序中,從堆棧中取參數(shù),不能使用POP指令,應該使 用MOV指令直接到堆棧中取出參數(shù)。 DSEG SEGMENT A1 DW 100,300,28,40,55,121,39,21,39,165 A2 DW 20,102,18,33,65,141,1,155,18,120 A3 DW 10 DUP (0) DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START:MOV AX,DSEG MOV DS,AX MO
35、V CX,10 MOV SI,OFFSET A1 MOV DI,OFFSET A2 MOV BX,OFFSET A3 LOP: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 21H SUM PROC NEAR PUSH BP MOV BP,SP MOV AX,BP+2 ADD AX,BP+4 POP BP RET SUM ENDP CSEG ENDS END START DOS(Disk Operation System)和BIOS(B
36、asic Input and Output System)為用戶提供兩組系統(tǒng)服務(wù)程序。用戶程序可 以調(diào)用這些系統(tǒng)服務(wù)程序。 DOS提供若干功能調(diào)用。包括基本輸入/輸出管理、內(nèi)存儲器 讀/寫管理、磁盤文件的讀/寫管理、時間和日期的設(shè)置功能。 BIOS在較低層次上為用戶提供一組I/O程序,要求用戶對硬 件有一定的了解,但也不要求用戶直接控制外設(shè)。BIOS駐留 在ROM中,獨立于操作系統(tǒng)。 用戶通過軟中斷指令I(lǐng)NT n去調(diào)用DOS和BIOS中的服務(wù)程序來 訪問系統(tǒng)。 本小節(jié)內(nèi)容: n系統(tǒng)功能調(diào)用的方法 nDOS系統(tǒng)功能調(diào)用 nBIOS系統(tǒng)功能調(diào)用 INT 21H是一個具有多個子功能的中斷服務(wù)程序,
37、這些子功能的編號稱為功能號。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)用沒有入口參數(shù),執(zhí)行時,系統(tǒng) 掃描鍵盤,等到鍵盤按下,先檢查是否是 CTRL-BREAK鍵,如是則退出
38、命令執(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è)備上顯示一個以$為結(jié)束標志的字符 串。 入口參數(shù):DS:DX指向一個以$為結(jié)束標志的字符串。 例: 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é)開始,存放從鍵盤接收到的字符,最后結(jié) 束字符串的回車
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級上冊數(shù)學教學設(shè)計-第三單元第1課時 因數(shù)與倍數(shù) 北師大版
- 一年級下冊數(shù)學教案-綜合實踐 趣味拼擺| 青島版(五四學制)
- 學習2025年雷鋒精神六十二周年主題活動實施方案 (3份)-54
- 2025年河南測繪職業(yè)學院單招職業(yè)適應性測試題庫帶答案
- 2025年廣西安全工程職業(yè)技術(shù)學院單招職業(yè)技能測試題庫含答案
- 2025年廣東金融學院單招職業(yè)適應性測試題庫完整
- 2025年貴州航天職業(yè)技術(shù)學院單招職業(yè)技能測試題庫一套
- 2025福建省安全員考試題庫及答案
- 2025年度幼兒園教職工被辭退勞動權(quán)益保護合同
- 2025年度幼兒園實習教師培養(yǎng)與就業(yè)服務(wù)協(xié)議
- 二年級下冊計算小能手帶答案
- 2024年臨滄市工業(yè)產(chǎn)業(yè)發(fā)展集團限公司招聘2名公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 2023年3月云南專升本大??肌堵糜螌W概論》試題及答案
- 一年級趣味數(shù)學幾和第幾
- 2024年西安電力高等??茖W校單招職業(yè)技能測試題庫及答案解析
- 2024年中國科學技術(shù)大學創(chuàng)新班物理試題答案詳解
- 方案優(yōu)缺點對比表模板
- 中職數(shù)學基礎(chǔ)模塊上冊學業(yè)水平考試第四章三角函數(shù)單元測試及參考答案
- 數(shù)據(jù)真實性承諾書
- 山東信息職業(yè)技術(shù)學院單招職業(yè)技能測試參考試題庫(含答案)
- 充電站風險管理的法律法規(guī)研究
評論
0/150
提交評論