版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1,微型計(jì)算機(jī)原理及其應(yīng)用第四章:匯編語言程序設(shè)計(jì),2,第四章 匯編語言程序設(shè)計(jì),匯編語言程序格式 偽指令語句 DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用 程序設(shè)計(jì)方法,3,匯編語言是利用指令的助記符、符號地址、標(biāo)號來編寫的語言。 用匯編語言編寫的程序稱為匯編語言源程序; 把匯編語言源程序翻譯成由機(jī)器代碼組成的目標(biāo)程序的過程稱為匯編; 用來把匯編語言源程序自動翻譯成目標(biāo)程序的軟件叫匯編程序。,4,計(jì)算機(jī)語言可分為機(jī)器語言、匯編語言、高級語言三類。 機(jī)器語言是計(jì)算機(jī)唯一能識別的語言(二進(jìn)制語言) 匯編語言是面向機(jī)器的語言,不同的CPU有不同的匯編語言(PC機(jī)匯編、單片機(jī)匯編) 優(yōu)點(diǎn):直接針對硬件操作,
2、效率高,節(jié)省內(nèi)存,運(yùn)行速度快,實(shí)時(shí)性能好。 高級語言是面向過程的語言:如Basic、c、Pascal 目前流行的面向?qū)ο蟮恼Z言:VB、VC、C# 8086系統(tǒng)中常用的匯編程序: 宏匯編程序MASM,5,【例】顯示輸出“This is a sample program.” DATA SEGMENT ;數(shù)據(jù)段 DA1 DB This is a sample program. DB 0DH,0AH, ;回車符和換行符的ASCII碼 DATA ENDS STACK SEGMENT STACK STACK;堆棧段 ST1 DB 100 DUP(?) ;定義100個(gè)空的字節(jié)單元 STACK ENDS CO
3、DE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK ;段分配 MAIN PROC FAR ;主過程開始 START: MOV AX,STACK ;初始化SS MOV SS,AX,6,PUSH DS ;為返回DOS設(shè)置堆棧 MOV AX,0 PUSH AX MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9號調(diào)用,顯示字符串,以結(jié)束 MOV DX,OFFSET DA1 INT 21H RET ;返回DOS MAIN ENDP ;主過程結(jié)束 CODE ENDS ;代碼段結(jié)束 END START ;源程序結(jié)束,7,【例】顯示輸
4、出“Hello!” DATA SEGMENT ;數(shù)據(jù)段 STRING DB Hello!, DATA ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA ;段分配 START: MOV AX,DATA ;初始化DS MOV DS,AX MOV AH,9 ;9號調(diào)用,顯示字符串,以結(jié)束 MOV DX,OFFSET STRING INT 21H MOV AH,4CH ;返回DOS INT 21H CODE ENDS ;代碼段結(jié)束 END START ;源程序結(jié)束,8,由例程看出: (1)8086匯編源程序具有分段結(jié)構(gòu) 段名 SEGMENT 段名 ENDS 在
5、源程序中各段的順序可以任意,段的數(shù)目可根據(jù)需要確定(至少有一個(gè)代碼段),原則上不受限制。而每個(gè)段又是由若干語句組成,語句是匯編語言源程序的基礎(chǔ)。 (2)CS不能人為設(shè)置,其它段寄存器的初始化需兩條指令完成(MOV AX,DATA MOV DS,AX)。,9,(3)兩種返回DOS的方法: MAIN PROC FAR ;將主程序建立為過程 PUSH DS ;將DOS段值和偏移量(0)入棧 MOV AX,0 PUSH AX RET ;返回DOS(將0和DOS段值IP、CS) MAIN ENDP ;主過程結(jié)束 使用4CH號的DOS系統(tǒng)功能調(diào)用 MOV AX,4C00H(或MOV AH ,4CH) IN
6、T 21H (4)全部源程序用END偽指令結(jié)束。,10,MASM中可使用的語句分成兩類:指令性語句和偽指令語句。 一、指令性語句 特點(diǎn):與機(jī)器指令相對應(yīng),匯編時(shí)產(chǎn)生目標(biāo)代碼。 標(biāo)號:指令助記符 操作數(shù),操作數(shù) ;注釋 標(biāo)號:表示本指令語句的符號地址,后跟冒號“:”,用作轉(zhuǎn)移的目標(biāo)地址; 指令助記符:指出指令的操作類型,由英文字母縮寫而成; 操作數(shù):指明參加指令運(yùn)算的數(shù)據(jù),有無操作數(shù)、單操作數(shù)和雙操作數(shù)之分,其中雙操作數(shù)之間用逗號“,”分隔,操作數(shù)與指令助記符之間用空格隔開; 注釋:用來說明一條指令或一段程序的功能,前面以分號“;”為標(biāo)記,匯編程序?qū)ψ⑨尣贿M(jìn)行匯編,增加可讀性 其中指令助記符是關(guān)
7、鍵字,不可省略,其余部分均可省略。,4-1 匯編語言程序格式,11,二、偽指令語句 特點(diǎn):沒有對應(yīng)的機(jī)器指令(本身不產(chǎn)生目標(biāo)代碼),只為匯編程序提供匯編信息。 格式: 名字 偽指令指示符 操作數(shù),操作數(shù) ;注釋 名字:給偽指令取的名稱,用符號地址表示,名字后不帶冒號“:”,只用空格符與偽指令指示符相分隔; 偽指令指示符:是MASM規(guī)定的符號,明確不同的操作; 操作數(shù):規(guī)定同指令性語句,區(qū)別在于操作數(shù)可能多于2個(gè); 注釋:規(guī)定同指令性語句 其中不可省略的部分是偽指令指示符,其余均可缺省。 三、數(shù)據(jù)項(xiàng) 操作數(shù)的三種基本數(shù)據(jù)項(xiàng):常數(shù)、變量、標(biāo)號,12,常量:固定值,不能改變 a.數(shù)字常數(shù):字母后綴B
8、、Q(或O)、D可省略、H b.字符串常數(shù):ABCASCII碼字節(jié)序列41H、42H、43H c.符號常數(shù):COUNT EQU 100 變量:某操作數(shù)據(jù)所存放單元的符號地址,在CS以外的其它段由DB、DW等定義 標(biāo)號:某條指令所存放單元的符號地址,在CS中定義 變量和標(biāo)號均具有三種屬性: a.段值(SEGMENT):可用分析運(yùn)算SEG取出 b.段內(nèi)偏移地址(OFFSET):可用分析運(yùn)算OFFSET取出 c.類型(TYPE):可用分析運(yùn)算TYPE取出 變量:每個(gè)元素所包含的字節(jié)數(shù),有BYTE、WORD和DWORD三種類型。 標(biāo)號:可轉(zhuǎn)移的距離(或距離屬性),有NEAR和FAR兩種。,13,四、M
9、ASM中的表達(dá)式 表達(dá)式由運(yùn)算對象和運(yùn)算符組成,在匯編過程中完成表達(dá)式運(yùn)算。其中運(yùn)算對象可以是常數(shù)、變量、標(biāo)號、寄存器等。 1.算術(shù)運(yùn)算符(運(yùn)算對象和運(yùn)算結(jié)果均為整數(shù)) 包括:+、- 等,常用于地址運(yùn)算。 注:兩符號地址相減表示某符號地址占用的內(nèi)存字節(jié)數(shù)。 【例】ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV CX,TRY-ARRAY 匯編后: MOV CX,8,14,2.邏輯運(yùn)算符(按位運(yùn)算) 包括:AND、OR、NOT、XOR 例:AND AL, 8FH AND 73H 運(yùn)算符,匯編過程中完成 指令助記符,程序執(zhí)行時(shí)完成。 3.關(guān)系運(yùn)算符 包括:EQ、NE(不
10、等)、LT(小于)、GT(大于)、LE()、GE() a.結(jié)果為真,輸出全1 (字節(jié)運(yùn)算為OFFH或字運(yùn)算為OFFFFH) b.結(jié)果為假,輸出全0 【例】 MOV AX,10H GE 16 匯編后:MOV AX,0FFFFH,15,4.數(shù)值返回運(yùn)算符(或分析運(yùn)算符) 功能:返回運(yùn)算對象的某個(gè)參數(shù)值。 包括:SEG、OFFSET、TYPE、LENGTH、SIZE SEG 變量或標(biāo)號 ;取段基址 常用法:MOV AX,SEG M1(或用段名) MOV DS, AX OFFSET 變量/標(biāo)號 ;取偏移地址值 常用法:MOV BX,OFFSET DA1 ;設(shè)地址指針 LEA BX,DA1 TYPE 變
11、量/標(biāo)號 ;取類型屬性 變量返回1(DB)、2(DW)、4(DD)等 標(biāo)號返回-1(NEAR)、-2(FAR) (0FFH) (0FEH),16,DATASEGMENT;定義數(shù)據(jù)段 VAR1 DB 10H,18H,25H,34H;定義字節(jié)數(shù)據(jù) VAR2 DW 2300H,1200H ;定義字?jǐn)?shù)據(jù) VAR3 DD 11002200H,33004400H ;定義雙字?jǐn)?shù)據(jù) DATAENDS;數(shù)據(jù)段結(jié)束 設(shè)DATA段起始于物理地址30000H處,則 MOV BX,SEG VAR1 匯編成: MOV BX,3000H MOV CX,SEG VAR2 匯編成: MOV CX,3000H MOV DX,SE
12、G VAR3 匯編成: MOV DX,3000H MOV BX,OFFSET VAR1 匯編成: MOV BX,0000H MOV CX,OFFSET VAR2 匯編成: MOV CX,0004H MOV DX,OFFSET VAR3 匯編成: MOV DX,0008H,17,【例】A1 DB 20H,30H A2 DW 0438H A3 DD ? L1: MOV AH,TYPE A1 MOV BH,TYPE A2 MOV AL,TYPE A3 MOV BL,TYPE L1 匯編后:MOV AH,1 MOV BH,2 MOV AL,4 MOV BL,0FFH,18,LENGTH 變量 ;返回重
13、復(fù)操作符DUP之前的重復(fù)次數(shù),若不是由DUP定義,則都返回1。 SIZE 變量 ;返回該變量包含的總字節(jié)數(shù)。 SIZE=LENGTH*TYPE 注:SEG、OFFSET、TYPE可用于變量和標(biāo)號前,返 回三種屬性值;而LENGTH和SIZE只對變量才有效。 【例】M1 DW 100 DUP (?) M2 DW 1,2,3 M3 DB A B C D MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV AL,LENGTH M3,19,匯編后: MOV CX,100 MOV BL,1 MOV AL,1 若指令改為: MOV CX,SIZE M1 MOV BL,SIZE M2
14、 MOV AL,SIZE M3 則匯編后: MOV CX,200 MOV BL,2 MOV AL,1,20,5.修改屬性運(yùn)算符(綜合運(yùn)算符) 功能:修改變量/標(biāo)號的三種屬性 段操作符:修改段基址與偏移地址來源的默認(rèn)關(guān)系,格式如下: 段前綴:變量或地址表達(dá)式 例:MOV AX ,ES:BX PTR:對變量/標(biāo)號賦予新的屬性,以保證操作數(shù)類型的匹配,常與BYTE、WORD、NEAR、FAR等連用。 格式:新類型 PTR 變量/標(biāo)號 例:MOV BX,10H ;匯編時(shí)提示錯(cuò)誤 MOV BYTE PTRBX,10H ;BX10H MOV WORD PTRBX,10H ;BX,BX+10010H,21,
15、例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX, WORD PTR N1 執(zhí)行后:AX=3615H MOV BL, BYTE PTR N2 執(zhí)行后:BL=22H MOV AX, WORD PTR N1+1 執(zhí)行后:AX=2236H 注:若符號地址出現(xiàn)在操作數(shù)中,其類型為DB、DW所定義的類型(如直接尋址、寄存器相對尋址、相對基址變址尋址),如類型不匹配匯編時(shí)提示W(wǎng)arning Error:Operand types must match 或 Illegal size for operand;若存儲器操作數(shù)中不包含符號地址(如寄存器間接尋址等),則該操作數(shù)的類型
16、不確定,指令中的另一操作數(shù)必須明確類型,否則匯編時(shí)提示Severe Error:Operand must have size. 例:LEA BX,N1之后CMP BX,10H 或 INC BX均出錯(cuò)。,22,THIS:對變量/標(biāo)號賦予新的屬性,且該變量或標(biāo)號的段地址和偏移地址與下一個(gè)存儲單元的地址相同。 格式:變量/標(biāo)號 EQU THIS 類型 例:FIRST EQU THIS BYTE TABLE DW 200 DUP(?) TABLE為字類型,FIRST為字節(jié)類型,兩者地址相同。 (該數(shù)據(jù)區(qū)具有雙重類型屬性) MOV AL , FIRST MOV AX , TABLE 均正確。 SHORT
17、:說明轉(zhuǎn)向地址為短轉(zhuǎn)移(8位位移量) 格式:SHORT 標(biāo)號 例:JMP SHORT LP MOV -128+127之間 LP: MOV,23,6.其它運(yùn)算符 方括號 a.表示地址表達(dá)式 例:M1 DB 10H,20H,30H,40H M2 DW 1234H,5678H,9ABCH MOV BX,OFFSET M1 MOV CL,BX ;10HCL MOV BX,OFFSET M2 MOV DX,BX+2 ; M2的第二個(gè)單元5678HDX b.表示多重變量的下標(biāo)值(下標(biāo)從0開始算) 例:MOV CX,M20 ;1234HCX MOV M21,CX ;CXM2的第二個(gè)單元,覆蓋5678H,24
18、,4-2 偽指令語句,特點(diǎn):無對應(yīng)的機(jī)器代碼,在匯編期間進(jìn)行處理 (不是由CPU執(zhí)行) (為匯編程序提供匯編信息) 一、數(shù)據(jù)定義語句 功能:為一個(gè)數(shù)據(jù)項(xiàng)分配存儲單元,用一個(gè)符號名與這個(gè)存儲單元相聯(lián)系,且為此存儲單元提供任意初始值。 例:ARRAY DB 1,2,4 則ARRAY記為第一個(gè)字節(jié)的偏移地址 該偽指令助記符有: DB 定義字節(jié) DW 定義字 DD 定義雙字,25,1、操作數(shù)是常數(shù)或表達(dá)式,可以為數(shù)據(jù)或地址 DA DW 1122H,34H,5*20H 2、操作數(shù)為字符串,字符串必須用單引號括起來 STR1 DB OK STR2 DW OK 注:字符串一般用DB定義,有時(shí)2個(gè)字符可用DW
19、定義 3、可用?保留空單元(分配內(nèi)存單元但不初始化) M1 DB ? M2 DW 1234H,? 4、用重復(fù)操作符DUP初始化重復(fù)數(shù)據(jù) 格式:DB(或DW) 重復(fù)次數(shù) DUP(重復(fù)內(nèi)容) 注:DUP可嵌套 ARR DW 3 DUP(1,2 DUP(0),2) ;變量共占 ?個(gè)字節(jié)單元,24,26,二、表達(dá)式賦值語句(不占用內(nèi)存) 1、賦值語句 EQU 格式:符號名 EQU 表達(dá)式(表達(dá)式應(yīng)有確定值) COUNT EQU 100 EQU左邊的名字等價(jià)于右邊的表達(dá)式 2、等號語句 = COUNT = 100 與EQU語句具有相同功能。 區(qū)別:EQU中的符號名不允許重復(fù)定義,應(yīng)先用PURGE語句解除
20、,而“=”偽指令可以。 例:C1 EQU 100 PURGE C1 ;C1不再代表100 C1 EQU 200,27,三、段定義語句 1、段定義語句 SEGMENTENDS SEGMENT和ENDS必須成對使用,將源程序分段。 段名 SEGMENT 定位類型 組合類型 分類名 段名 ENDS 在SEGMENT和ENDS之間,對于數(shù)據(jù)段、附加段和堆棧段中,一般是一些偽指令;而對于代碼段,主要是指令序列和偽指令。,28,(1)定位類型:對段起始地址定位 此參數(shù)一般缺省,缺省值為PARA,表示段起始地址必須在節(jié)的整數(shù)邊界(存儲空間從0開始,每16個(gè)存儲單元叫一節(jié))。 (2)組合類型:提出各個(gè)邏輯之間
21、的組合方式 此參數(shù)在堆棧段中不可缺省,用STACK指定該段為堆棧段。而在其它段中一般缺省,缺省值為NONE,表示該段與其它同名段不進(jìn)行連接,各段獨(dú)立存在于存儲器中。 (3)分類名 此參數(shù)一般缺省,主要作用是匯編程序連續(xù)時(shí)將所有分類名相同的邏輯段組成一個(gè)段組。,29,2、段分配語句(ASSUME) ASSUME CS:CODE ,DS:DATA ,SS:STACK ,ES:EXTRA 該語句不可省略,一般放在代碼段的開始。 用來建立4個(gè)段寄存器(CS、DS、ES、SS)與程序中所取段名(位于SEGMENT和ENDS之前)之間的對應(yīng)關(guān)系。 但ASSUME語句只指定某個(gè)段分配給哪個(gè)段寄存器,它并不能
22、把段基址裝入段寄存器中,故DS、ES、SS的具體值還必須分別通過兩條MOV指令得到(如初始化SS,還應(yīng)加上SP的初始化),但CS的賦值是在程序初始化時(shí)自動完成的。,30,總結(jié):分段程序的兩種完整段定義格式 (1)DATA SEGMENT ;數(shù)據(jù)段 DATA ENDS STACK SEGMENT STACK ;堆棧段 STT DW 100 DUP(?) TOP EQU SIZE STT STACK ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE,DS:DATA,SS:STACK ;段分配 MAIN PROC FAR ;主過程 START: MOV AX , STACK
23、 ;初始化SS和SP MOV SS , AX MOV SP , TOP,DW 100 DUP (?) TOP EQU $,31,PUSH DS ;為返回DOS設(shè)置堆棧 MOV AX ,0 ;(XOR AX,AX),(AND AX,0) ;(SUB AX,AX) PUSH AX MOV AX ,DATA ;初始化DS MOV DS ,AX RET ;返回DOS MAIN ENDP CODE ENDS END START,32,(2)前面兩個(gè)段相同 CODE SEGMENT ASSUME START: 段寄存器及SP初始化 MOV AH ,4CH ;利用4CH號DOS系統(tǒng) INT 21H ;功能調(diào)
24、用返回DOS CODE ENDS END START,33,例:兩個(gè)16位無符號二進(jìn)制數(shù)相乘。 DATA SEGMENT D1 DW 1234H D2 DW 5678H P1 DD ? P2 DD ? DATA ENDS STACK SEGMENT STACK STT DB 100 DUP (?) TOP EQU SIZE STT STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA,34,START:MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,AX L1: MOV AX,D
25、1 MUL D2 MOV BX,OFFSET P1 MOV BX,AX MOV BX+2,DX MOV AH,4CH INT 21H CODE ENDS END START,35,四、過程定義語句(子程序定義語句) 格式:過程名 PROC NEAR或FAR RET 過程名 ENDP a.每定義一個(gè)過程,PROC和ENDP要成對出現(xiàn),兩者前面的過程名應(yīng)一致。 b.主、子程序在同一代碼段中,則定義為NEAR型(或缺省) 主、子程序不在同一代碼段中,則定義為FAR型; 一般可將主程序定義為FAR屬性(主過程作為DOS調(diào)用的一個(gè)遠(yuǎn)端子過程) c.要調(diào)用一個(gè)過程,在主調(diào)函數(shù)中用CALL 過程名,而過程返
26、回必須通過RET語句。,36,例:用過程調(diào)用的方法,將內(nèi)存中4個(gè)BCD碼相加。 DATA SEGMENT ONE DB 22H,33H,44H,55H TWO DB 55H,66H,77H,88H SUM DB 20 DUP (?) DATA ENDS STACK SEGMENT STACK STT DB 100 DUP (?) TOP EQU SIZE STT STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA START:MOV AX,STACK MOV SS,AX MOV SP,TOP,37,MOV AX,DAT
27、A MOV DS,AX MOV ES,AX MOV SI,OFFSET ONE ;設(shè)置地址指針 MOV BX,OFFSET TWO MOV DI,OFFSET SUM CLD ;清方向標(biāo)志 CLC ;清進(jìn)位標(biāo)志 MOV CX,4 ;循環(huán)次數(shù) LL: CALL ABC LOOP LL MOV AH,4CH INT 21H,38,ABC PROC NEAR ;完成單字節(jié)數(shù)據(jù)加法運(yùn)算 LODSB ;DS:SIAL,SI+1SI L1: ADC AL,BX ;帶進(jìn)位相加 DAA ;十進(jìn)制調(diào)整 STOSB ;ALES:DI,DI+1DI INC BX ;修改指針 RET ABC ENDP CODE EN
28、DS END START,39,五、程序開始和結(jié)束語句 1.NAME:為源程序目標(biāo)模塊賦名字 格式:NAME 程序名 一般放在程序開始,列表文件將打印此程序名,如缺省NAME語句,匯編程序?qū)⒃次募髂繕?biāo)模塊的名字。 2.ORG:定位偽指令 格式:ORG 表達(dá)式(值為065535) 功能:表示下面存儲單元的偏移地址從表達(dá)式的值開始排。即程序和數(shù)據(jù)要從某一個(gè)特定的地址開始存放。 注:一般,段內(nèi)的EA是從段名SEGMENT以下,以0作為開始,以后每分配一個(gè)字節(jié),EA加1。 若要給某變量或標(biāo)號設(shè)置特定的起始偏移地址,可用ORG語句。,40,例:DATA SEGMENT ORG 100H A1 DB
29、10H,20H,30H ORG 200H A2 DB 40H,50H,60H DATA ENDS 3.END:源程序結(jié)束語句 格式:END 標(biāo)號:標(biāo)號為程序中第一條指令的起始地址,可以缺省。 放在源程序最后一行,告訴匯編程序,源程序到此結(jié)束,此后的內(nèi)容將被認(rèn)為不屬于本程序的范疇。,41,匯編語言中經(jīng)常地址計(jì)數(shù)器的值。(P150) 注:地址計(jì)數(shù)器用來保存當(dāng)前指令或數(shù)據(jù)的偏移地址。其值可用“”來引用,“”的值是動態(tài)變化的。常用于堆棧段的長度定義,以便于設(shè)置堆棧指針。 例: ORG 1000H ABC DW 1,2,+4,ODH,OAH,+3 設(shè)定ABC的偏移地址為1000H,則第一個(gè)“”代表100
30、4H, 而第二個(gè)“”代表100AH。 上述語句等價(jià)于 ABC DW 1,2,1008H,ODH,OAH,100DH 例:STACK SEGMENT DW 100 DUP(?) TOP EQU STACK ENDS MOV SP,TOP ;代碼段中初始化堆棧指針SP,42,六、高檔微機(jī)增加的偽指令 1、常用偽指令 (1) .386 選擇80386指令系統(tǒng) (2) .EXIT 返回DOS (3) .MODEL 選擇編程模型 (4) .STARTUP 指示程序的開始(包括段寄存器初始化) 2、匯編語言的兩種編程格式 完整的段定義 模型 常用模型SMALL,包含兩個(gè)段:64KB的代碼段和64KB的 數(shù)
31、據(jù)段。,43,例:將存儲塊LIST1中100個(gè)字節(jié)的內(nèi)容復(fù)制到存儲塊LIST2中。 .MODEL SMALL ;小模型 .386 ;選擇80386指令系統(tǒng) .STACK 100H ;定義堆棧段 .DATA ;定義數(shù)據(jù)段 LIST1 DB 100 DUP (?) LIST2 DB 100 DUP (?) .CODE ;定義代碼段 .STARTUP ;說明程序的起點(diǎn),初始化DS、SS CLD MOV SI,OFFSET LIST1 MOV DI,OFFSET LIST2 MOV CX,100 REP MOVSB .EXIT 0 ;返回DOS(返回0,表示無錯(cuò)誤) END,44,操作系統(tǒng)(OS)包括
32、DOS、WINDOWS、UNIX等。 操作系統(tǒng)是用戶和PC機(jī)之間的接口,用戶依靠操作系統(tǒng)來使用PC機(jī)。 DOS系統(tǒng)設(shè)置了兩層內(nèi)部子程序(供用戶使用) 基本輸入輸出系統(tǒng)BIOS(OS的核心) 主要功能:驅(qū)動系統(tǒng)所配置的外部設(shè)備 采用BIOS功能調(diào)用(INT 10HINT 1AH) DOS層的功能模塊(DOS系統(tǒng)功能調(diào)用) 主要功能:文件管理、存儲管理、作業(yè)管理、設(shè)備管理等 原理:通過BIOS使用外部設(shè)備,但功能較BIOS弱。(INT 21H) 一、DOS系統(tǒng)功能調(diào)用簡述 按功能分為六組: 1.字符I/O管理 2.傳統(tǒng)的文件管理(磁盤) 3.擴(kuò)充的文件管理(目錄、文件) 4.內(nèi)存管理(內(nèi)存) 5.
33、作業(yè)管理(終止、裝入等) 6.其它資源管理(日期、時(shí)間等),4-3 DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用,45,二、DOS系統(tǒng)功能調(diào)用(88種功能,系統(tǒng)功能號00H57H) 調(diào)用格式分四步: 系統(tǒng)功能號AH 置入口參數(shù) 執(zhí)行中斷指令I(lǐng)NT 21H 分析出口參數(shù)。 三、常用的DOS系統(tǒng)功能調(diào)用 1. 01H號調(diào)用:讀取鍵盤單字符并回顯 調(diào)用方式:MOV AH ,1 INT 21H 注:無入口參數(shù) 出口參數(shù):所按鍵字符對應(yīng)的ASC碼AL,46,【例】交互式程序中用戶按下1,2,3,程序轉(zhuǎn)入相應(yīng)的服務(wù)子程序,若按下其它鍵就繼續(xù)等待。 KEY: MOV AH,1 ;讀入鍵值A(chǔ)L INT 21H CMP
34、 AL,1 ;按下數(shù)字鍵1? JE ONE CMP AL,2 ;按下數(shù)字鍵2? JE TWO CMP AL,3 ;按下數(shù)字鍵3? JE THREE JMP KEY ;等待鍵入正確數(shù)字 ONE: TWO: THREE: ,47,2. 02H調(diào)用:顯示單字符 調(diào)用方式: MOV DL ,待顯示字符的ASC碼 MOV AH ,2 INT 21H 注:出口參數(shù)是把字符顯示在屏幕上。 3. 09H號調(diào)用(字符串輸出顯示) 調(diào)用方式:DS:DX待顯示字符串的首地址 MOV AH ,9 INT 21H 注:待顯示字符串必須以“”字符結(jié)束,且“”不顯示,只作為結(jié)束標(biāo)志。,48,【例】在屏幕上顯示HOW ARE
35、 YOU!,且光標(biāo)換行。 CR EQU 0DH ;回車符ASCII碼 LF EQU 0AH ;換行符ASCII碼 MES DB HOW ARE YOU!,CR,LF,$ MOV DX,OFFSET MES MOV AH,9 INT 21H 4. OAH號調(diào)用(字符串輸入) 調(diào)用方式:DS:DX接收字符的輸入緩沖區(qū)首地址 MOV AH ,OAH INT 21H 注:a.直到回車符結(jié)束,49,b.緩沖區(qū)第一個(gè)字節(jié)為此區(qū)能接收字符的個(gè)數(shù);第二個(gè)字節(jié)保留(用“?”初始化),用作填寫實(shí)際字符個(gè)數(shù);從第三個(gè)字節(jié)開始順序存放鍵盤輸入的字符。 c.如實(shí)際輸入字符數(shù)定義的字節(jié)數(shù),緩沖區(qū)其余字節(jié)補(bǔ)零。 【例】開辟
36、一個(gè)緩沖區(qū)接收從鍵盤輸入的字符串,將輸入的字符數(shù)存入CL寄存器,并將指針指向第一個(gè)字符。 BUFF DB 100 ;緩沖區(qū)大小 DB ? ;實(shí)際輸入字符數(shù) DB 100 DUP(?) ;順序存放輸入字符 MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,DX MOV CL,BX+1 ;取字符數(shù) ADD BX,2 ;指針指向第一個(gè)字符 5. 4CH號調(diào)用:返回操作系統(tǒng) 調(diào)用方式:MOV AH ,4CH INT 21H 注:無入口參數(shù),50,4-4 程序設(shè)計(jì)方法,匯編語言設(shè)計(jì)基本要求: 結(jié)構(gòu)化、簡明、易讀、易調(diào)試 執(zhí)行速度快 占用的存儲空間少 在結(jié)構(gòu)化程序設(shè)
37、計(jì)中,提倡采用的基本結(jié)構(gòu)形式是: 順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序結(jié)構(gòu)。 一、順序結(jié)構(gòu) 一般為簡單程序,由上而下順序執(zhí)行每條指令 無分支,無循環(huán),無轉(zhuǎn)移,又稱為直線程序 順序程序結(jié)構(gòu)是各種其它程序結(jié)構(gòu)中的局部程序段,51,【例】內(nèi)存中TABLE開始存放09的平方值,通過人機(jī)對話,當(dāng)任意輸入09,查表得出平方值,放在AL中。 .MODEL SMALL .386 .STACK 100H .DATA TABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB Input one number(09),ODH,0AH,$ .CODE .STARTUP LEA DX,BUF
38、;顯示提示字符串 MOV AH,9 INT 21H,52,MOV AH,1 ;等待鍵入 INT 21H AND AL,0FH ;屏蔽AL高4位,低4位不變 MOV BX,OFFSET TABLE MOV AH,0 ADD BX,AX MOV AL,BX .EXIT 0 END,XLAT TABLE,53,二、分支結(jié)構(gòu) 分支結(jié)構(gòu)有兩種形式: 雙分支結(jié)構(gòu)和多分支結(jié)構(gòu),條件?,分支程序段1,分支程序段2,Y,N,條件?,程序段1,程序段n,程序段2,條件1,條件2,條件n,圖a:雙分支,圖b:多分支,54,1、雙分支結(jié)構(gòu) 雙分支結(jié)構(gòu)一般由四個(gè)部分組成: 產(chǎn)生條件:用于比較、判斷的指令CMP、SUB、
39、TEST、AND、CMPSB/W 、SCASB/W、移位指令(如判AX中有多少個(gè)“1”)等只要能影響PSW中的一個(gè)或多個(gè)標(biāo)志。 測試:條件轉(zhuǎn)移指令JC、JA、JG等 定向:根據(jù)條件,決定程序的不同走向(條件滿足或不滿足,程序轉(zhuǎn)移或不轉(zhuǎn)移即順序執(zhí)行) 標(biāo)號:用來指定分支后的轉(zhuǎn)移地址。 應(yīng)注意統(tǒng)一出口:某個(gè)分支結(jié)束后用JMP指令跳過另一分支。 2、多分支結(jié)構(gòu) 一次判斷可引出兩個(gè)分支,故N個(gè)分支,需N-1次判斷。 按條件的先后,依次分解成一串雙分支結(jié)構(gòu),然后使用雙分支的方法進(jìn)行程序設(shè)計(jì)。實(shí)質(zhì)是用一連串的條件轉(zhuǎn)移指令來實(shí)現(xiàn)。,55,【例】存儲器中有一串字符串首址為BUF,字符串長度N小于256,要求分
40、別計(jì)算出其中數(shù)字、大寫字母和其它字符的個(gè)數(shù),存放在字符串的下面三個(gè)單元中。 解:本題根據(jù)字符的ASCII碼值范圍進(jìn)行判斷,大寫字母 41H5AH,數(shù)字30H39H。 .MODEL SMALL .386 .STACK 100H .DATA BUF DB 7 DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP (?) .CODE .STARTUP,56,MOV CH,BUF ;數(shù)組個(gè)數(shù)CH MOV BX,1 MOV DX,0 ;DH計(jì)數(shù)字個(gè)數(shù),DL計(jì)字母個(gè)數(shù) LP: MOV AH,BUFBX ;第一次取01HAH CMP AH,30H JL NEXT ;小于0轉(zhuǎn)
41、(用JB最佳) CMP AH,39H JG ABC ;大于9轉(zhuǎn)(用JA最佳) INC DH ;數(shù)字個(gè)數(shù)+1 JMP NEXT ABC: CMP AH,41H JL NEXT ;小于A 轉(zhuǎn) CMP AH,5AH JG NEXT ;大于Z轉(zhuǎn) INC DL ;字母個(gè)數(shù)+1,57,NEXT: INC BX ;數(shù)組地址+1 DEC CH ;計(jì)數(shù)-1 JNZ LP ;不為0跳轉(zhuǎn)繼續(xù) MOV NUM,DH ;數(shù)字個(gè)數(shù)送入內(nèi)存單元 MOV NUM+1,DL ;字母個(gè)數(shù)送入內(nèi)存單元 MOV AH,BUF SUB AH,DH ;計(jì)算其它字符個(gè)數(shù) SUB AH,DL MOV NUM+2,AH ;其它字符個(gè)數(shù)送入內(nèi)存
42、單元 .EXIT 0 END,58,【例】設(shè)有首地址為BUFFER的數(shù)據(jù),已按升序排好,字組的長度N(=10),在該數(shù)組中查找數(shù)M(=80),若找到它則從數(shù)組中刪掉,若找不到將它插入正確的排列位置,DX中記錄數(shù)組最后的長度。 DATA SEGMENT BUFFER DW 5,10,32,47,53,77,89,106,115,124 N DW 10 M EQU 80 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA
43、MOV DS,AX MOV ES,AX,59,MOV AX,M ;待查數(shù)AX MOV CX,N ;計(jì)數(shù)CX MOV DX,N ;數(shù)組長度 MOV DI,OFFSET BUFFER CLD REPNE SCASW ;串掃描查找 JE DEL ;找到ZF=1 DEC DX ;未查到,此數(shù)插入正確位置 MOV SI,DX ;定位到BUFFER最后一個(gè)數(shù) ADD SI,DX L1: CMP AX,BUFFERSI ;關(guān)鍵字從后向前比較 JL L2 ;關(guān)鍵字比數(shù)組中某個(gè)字小 MOV BUFFERSI+2,AX ;否則插在后面 JMP L3,60,L2: MOV BX,BUFFERSI ;數(shù)組后移一個(gè)數(shù)
44、MOV BUFFERSI+2,BX SUB SI,2 ;指針前移一個(gè)數(shù) JMP L1 L3: ADD DX,2 ;修改長度 JMP NEXT1 DEL: JCXZ NEXT ;找到,且為最后一個(gè)數(shù),刪此元素 DEL1: MOV BX,DI ;其后元素依次前移 MOV DI-2,BX ADD DI,2 LOOP DEL1 NEXT: DEC DX ;改變數(shù)組長度 NEXT1:RET MAIN ENDP CODE ENDS END START,61,三、循環(huán)結(jié)構(gòu) 1. 循環(huán)結(jié)構(gòu)有兩種結(jié)構(gòu)形式 a. “先執(zhí)行,后判斷”結(jié)構(gòu)(直到型) : 至少執(zhí)行一次循環(huán)體(不允許零次循環(huán)); 適合于循環(huán)次數(shù)固定的程
45、序 b. “先判斷,后執(zhí)行”結(jié)構(gòu)(當(dāng)型) : 循環(huán)體可能一次也不執(zhí)行(允許零次循環(huán)) ; 適合于循環(huán)次數(shù)不固定的程序,62,入口,入口,初始化部分,初始化部分,循環(huán)體,修改參數(shù),循環(huán)控制,出口,循環(huán)控制,循環(huán)體,修改參數(shù),”先執(zhí)行,后判斷“結(jié)構(gòu),”先判斷,后執(zhí)行“結(jié)構(gòu),63,循環(huán)結(jié)構(gòu)包括四部分: (1)初始化:為循環(huán)做準(zhǔn)備,建立指針,設(shè)置循環(huán)計(jì)數(shù)器,設(shè)置其它變量的初值 (2)循環(huán)體:循環(huán)部分的核心,完成循環(huán)的基本操作 (3)修改參數(shù):修改地址指針,為下次循環(huán)作準(zhǔn)備 (4)循環(huán)控制:修改計(jì)數(shù)器值,判斷循環(huán)控制條件,決定是否繼續(xù)循環(huán),64,2. 循環(huán)程序的控制方法 核心問題:循環(huán)的控制 (1)計(jì)數(shù)
46、控制法(已知循環(huán)次數(shù)) 正計(jì)數(shù)法:計(jì)數(shù)器初值為0,遞增,與終值比較 倒計(jì)數(shù)法:計(jì)數(shù)器初值設(shè)為循環(huán)次數(shù),遞減,直到減為0為止,一般用LOOP完成,或用DEC和JNZ聯(lián)用實(shí)現(xiàn)。 (2)條件控制法(循環(huán)次數(shù)未知) 每執(zhí)行一次循環(huán)體后判斷一次循環(huán)條件, 滿足循環(huán)條件,繼續(xù)循環(huán);不滿足則結(jié)束循環(huán)。 一般在數(shù)據(jù)或表格處理中常在末尾添加一個(gè)特殊的結(jié)束標(biāo)志。,65,【例】將BX中的16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,存放到BUF開始的內(nèi)存單元中去,并在屏幕顯示出數(shù)值。 MOV SI,OFFSET BUF ;設(shè)置地址指針 MOV CH,4 ;計(jì)數(shù)初值=4 NEXT: MOV CL,4 ;最高位移到右邊 ROL BX,
47、CL MOV AL,BL ;轉(zhuǎn)換成ASCII碼 AND AL,0FH ADD AL,30H CMP AL,3AH ;字符為AF嗎? JL STORE,66,ADD AL,7 STORE:MOV SI,AL ;字符存入內(nèi)存 MOV AH,2 ;顯示單字符 MOV DL,AL INT 21H INC SI DEC CH ;修改計(jì)數(shù)并判斷 JNZ NEXT HLT ;循環(huán)結(jié)束 此題采用“先執(zhí)行,后判斷”的結(jié)構(gòu)。,67,【例】AX寄存器中有一個(gè)16位二進(jìn)制數(shù),編程統(tǒng)計(jì)其中1的個(gè)數(shù),結(jié)果放到CL寄存器。 MOV CL,0 ;初始化 L1: AND AX,AX ;循環(huán)控制 JZ STOP SAL AX,1
48、 ;循環(huán)體 JNC L2 INC CL L2: JMP L1 STOP:HLT 此方法采用“先判斷,后執(zhí)行”的結(jié)構(gòu)。,68,MOV BX,16 ;初始化 MOV CL,0 L1: SAL AX,1 ;控制循環(huán) JNC L2 INC CL L2: DEC BX JNZ L1 STOP:HLT 此方法采用“先執(zhí)行,后判斷”的結(jié)構(gòu)。,69,3. 循環(huán)程序的兩種基本模式 (1)單重循環(huán):循環(huán)體為順序和分支結(jié)構(gòu) (2)多重循環(huán):循環(huán)體為一個(gè)新的循環(huán)結(jié)構(gòu) 多重循環(huán)是由單重循環(huán)嵌套而成。 最常用:雙重循環(huán)(分為內(nèi)循環(huán)和外循環(huán)) 設(shè)計(jì)方法同單重循環(huán),但應(yīng)注意: 雙重循環(huán)的初始控制條件及程序?qū)崿F(xiàn); 各層循環(huán)之間
49、不能交叉,可以從內(nèi)循環(huán)跳到外循環(huán),不可以從外循環(huán)跳進(jìn)內(nèi)層循環(huán); 防止出現(xiàn)死循環(huán)。,70,【例】存儲器數(shù)據(jù)段從BUF開始存放著一個(gè)無符號字?jǐn)?shù)組,數(shù)組的第一個(gè)字中存放著該數(shù)組的長度,編制一個(gè)程序使此數(shù)組中的數(shù)據(jù)按照從小到大的順序排列。 分析一:采用冒泡排序算法,即從第一個(gè)數(shù)據(jù)開始,相鄰的數(shù)進(jìn)行比較,若次序不對,兩數(shù)交換位置。第一遍比較(N-1)次后,最大的數(shù)已到了數(shù)組尾,第二遍僅需比較(N-2)次就夠了,共比較(N-1)遍就完成了排序,共有兩重循環(huán)。 DATA SEGMENT BUF DW 7,15,37,8600,A768H,3412H,1256H,76H DATA ENDS STACK SEG
50、MENT STACK SA DB 100 DUP(?) TOP EQU $ STACK ENDS,71,CODE SEGMENT ASSUME CS:CODE,DS,DATA,SS:STACK MAIN PROC FAR START:MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV CX,BUFBX ;CX作為內(nèi)循環(huán)計(jì)數(shù)器 DEC CX,72,L1:MOV DX,CX ;DX作為外循環(huán)計(jì)數(shù)器 L2:ADD BX,2 ;修改地址指針 MOV AX,BUFBX
51、 ;取一數(shù) CMP AX,BUFBX+2 ;與下一數(shù)比較 JBE CONTI ;若符合前小后大,轉(zhuǎn)移 XCHG AX,BUFBX+2 ;否則兩數(shù)交換 MOV BUFBX,AX CONTI:LOOP L2 ;內(nèi)循環(huán)控制 MOV CX,DX ;外循環(huán)次數(shù)CX MOV BX,0 ;地址指針返回 LOOP L1 ;外循環(huán)控制 RET MAIN ENDP CODE ENDS END START,73,分析二:采用改進(jìn)的冒泡排序法,即用設(shè)置標(biāo)志的 方法。設(shè)立一個(gè)FLAG位作標(biāo)記,進(jìn)入外循環(huán)時(shí)標(biāo)志 為0,在內(nèi)循環(huán)中每進(jìn)行一次交換,標(biāo)志置1。內(nèi)循 環(huán)結(jié)束測試標(biāo)志,若為1,再一次進(jìn)入外循環(huán);若為 0,表示內(nèi)循環(huán)
52、沒有進(jìn)行數(shù)據(jù)交換,可以提前結(jié)束外 循環(huán),不必循環(huán)N-1遍,節(jié)省了操作時(shí)間。,74,START:MOV DI,OFFSET BUF ;設(shè)置地址指針 MOV CX,DI ;設(shè)內(nèi)循環(huán)計(jì)數(shù)器CX DEC CX ;N-1,內(nèi)循環(huán)次數(shù) L1: MOV DX,CX ;設(shè)外循環(huán)計(jì)數(shù)器DX MOV BH,0 ;BH為FLAG L2: ADD DI,2 MOV AX,DI CMP AX,DI+2 JBE CONTI XCHG AX,DI+2 ;若前大后小,交換,F(xiàn)LAG=1 MOV DI,AX MOV BH,1 CONTI:LOOP L2 CMP BH,0 ;FLAG=0,提前結(jié)束,跳出外循環(huán) JE STOP,7
53、5,MOV CX,DX MOV DI,OFFSET BUF LOOP L1 STOP: RET 思考:如何改為降序?,76,總結(jié):雙重循環(huán)需要內(nèi)、外兩個(gè)循環(huán)計(jì)數(shù)器 方法(1):CX內(nèi)循環(huán)計(jì)數(shù)器 DX(或其它)外循環(huán)計(jì)數(shù)器 格式: MOV DX,外循環(huán)次數(shù) LP1: MOV CX,內(nèi)循環(huán)次數(shù) LP0: LOOP LP0 DEC DX JNZ LP1,77,方法(2):內(nèi)、外循環(huán)計(jì)數(shù)器均用CX,此時(shí)應(yīng)采用堆棧保護(hù)外循環(huán)計(jì)數(shù)器 格式: MOV CX,外循環(huán)次數(shù) LP1: PUSH CX ;保護(hù)外循環(huán)計(jì)數(shù)值 MOV CX,內(nèi)循環(huán)次數(shù) LP0: ;內(nèi)循環(huán)體 LOOP LP0 POP CX ;恢復(fù)外循環(huán)計(jì)
54、數(shù)值 LOOP LP1,78,四、子程序結(jié)構(gòu) 1. 概念 子程序:可以多次反復(fù)調(diào)用的,能完成指定操作功能的特殊程序段。 主程序:調(diào)用子程序的程序(相對而言) 調(diào)用子程序(或轉(zhuǎn)子):主程序調(diào)用子程序的過程 返回主程序(或返主):子程序結(jié)束返回主程序接著執(zhí)行 過程調(diào)用的指令為CALL,過程返回的指令為RET。 CALL指令自動保存返回地址,RET指令自動恢復(fù)返回地址,均需通過堆棧完成。,79,2. 子程序的結(jié)構(gòu)形式 完整的子程序結(jié)構(gòu)必須包括: (1)子程序說明文件(以注釋形式出現(xiàn)) ;子程序名 ;子程序的功能 ;子程序中用到的寄存器和存儲單元 ;子程序的入口參數(shù)和出口參數(shù) ;子程序中調(diào)用其它子程序
55、的名稱 ;子程序舉例 (2)子程序的現(xiàn)場保護(hù)和現(xiàn)場恢復(fù) 在子程序設(shè)計(jì)時(shí),一般在子程序一開始就保護(hù)子程序?qū)⒁加玫募拇嫫鞯膬?nèi)容(用一組PUSH指令),子程序執(zhí)行RET之前再恢復(fù)被保護(hù)寄存器的內(nèi)容(用一組POP指令) 。,80,保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場的工作既可在主程序中完成,也可在子程序中完成。 注意:保護(hù)和恢復(fù)現(xiàn)場需遵循堆棧操作先進(jìn)后出的特點(diǎn)。 (3)子程序的調(diào)用與返回 由設(shè)在主程序的CALL指令和設(shè)在子程序結(jié)尾的RET指令聯(lián)合實(shí)現(xiàn)。 3. 子程序的設(shè)計(jì)方法 (1)子程序的定義 過程名 PROC NEAR或FAR RET 過程名 ENDP,81,注: 主、子程序在同一代碼段中,則定義為NEAR型(或
56、缺省) 主、子程序不在同一代碼段中,則定義為FAR型; 一般可將主程序定義為FAR屬性(主過程作為DOS調(diào)用的一個(gè)遠(yuǎn)端子過程) (2)子程序的參數(shù)傳遞方法 主、子程序間的參數(shù)傳遞:主程序傳遞輸入?yún)?shù)及子程序傳遞輸出參數(shù)的過程。 三種方法: 用寄存器傳遞參數(shù):適合于參數(shù)較少的情況,傳遞速度較快; 用存儲器傳遞參數(shù):適合于參數(shù)較多的情況,需要事先在存儲器中建立一個(gè)存儲區(qū),主、子程序均能訪問,通常采用寄存器存放該存儲區(qū)首地址的方法; 用堆棧傳遞參數(shù):適合于參數(shù)較多的情況,注意堆棧中返回地址的保存與恢復(fù)。,82,【例】有一個(gè)子程序說明如下: ;名稱:BCD2BIN ;功能:將一個(gè)字節(jié)的BCD碼轉(zhuǎn)換成二
57、進(jìn)制數(shù) ;所用寄存器:CX ;入口參數(shù):AL存放兩位BCD碼 ;出口參數(shù):AL存放二進(jìn)制數(shù) ;調(diào)用其它子程序:無 ;子程序舉例:執(zhí)行前AL=36H,執(zhí)行后AL=24H 子程序編制如下:,83,BCD2BIN PROC NEAR(或FAR) PUSH CX ;保護(hù)現(xiàn)場 MOV CH,AL AND CH,0FH ;存低4位 MOV CL,4 SHR AL,CL ;高4位右移4位 MOV CL,10 ;然后乘10 MUL CL ADD AL,CH ;高4位乘10+低4位 POP CX ;恢復(fù)現(xiàn)場 RET BCD2BIN ENDP 注:本例是通過寄存器來傳遞參數(shù)的。,84,【例】數(shù)據(jù)段定義兩個(gè)數(shù)組,編
58、程實(shí)現(xiàn)對兩個(gè)數(shù)組分別求和(不計(jì)溢出)。 DATA SEGMENT ARY1 DW 100 DUP(?) ;定義數(shù)組1 SUM1 DW ? ARY2 DW 100 DUP(?) ;定義數(shù)組2 SUM2 DW ? DATA ENDS STACK SEGMENT STACK SA DW 50 DUP(?) TOP EQU SIZE SA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,85,MAIN PROC FAR START: MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,
59、AX LEA SI,ARY1 ;數(shù)組1首地址,入口參數(shù) MOV CX,LENGTH ARY1 ;數(shù)組1長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 LEA SI,ARY2 ;數(shù)組2首地址,入口參數(shù) MOV CX,LENGTH ARY2 ;數(shù)組2長度,入口參數(shù) CALL SUM ;調(diào)用求和子程序 MOV AH,4CH ;返回DOS INT 21H MAIN ENDP,86,SUM PROC NEAR ;子程序 XOR AX,AX ;AX清0 L1: ADD AX,WORD PTRSI ;加數(shù)組元素 INC SI INC SI LOOP L1 MOV WORD PTRSI,AX ;數(shù)組和送入
60、SUM RET ;子程序返回 SUM ENDP CODE ENDS END START 注:本例是通過存儲器來傳遞參數(shù)的。,87,【例】通過堆棧傳遞參數(shù),實(shí)現(xiàn)十進(jìn)制數(shù)數(shù)組求和,要求主程序和過程不在同一個(gè)代碼段中,要進(jìn)行段間調(diào)用。 MDATA SEGMENT ARY1 DB 20 DUP(?) ;定義數(shù)組1 SUM1 DW ? ARY2 DB 100 DUP(?) ;定義數(shù)組2 SUM2 DW ? MDATA ENDS MSTACK SEGMENT STACK DW 100 DUP(?) TOP EQU $ MSTACK ENDS MCODE SEGMENT ;主代碼段 ASSUME CS:MC
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 運(yùn)營助理的年終總結(jié)
- 新生兒輕度窒息的護(hù)理
- 福建省2024八年級數(shù)學(xué)上冊第12章整式的乘除12.2整式的乘法3.多項(xiàng)式與多項(xiàng)式相乘課件新版華東師大版
- 人事測評課件教學(xué)課件
- 2.1.2碳酸鈉和碳酸氫鈉 說課課件 高一上學(xué)期化學(xué)人教版(2019)必修第一冊
- 洗地機(jī)行業(yè)現(xiàn)狀分析報(bào)告
- 如何寫年終述職報(bào)告
- 肱骨遠(yuǎn)段骨折康復(fù)治療
- 不樣的我教案反思
- 2025文旅景區(qū)蛇年新年國潮非遺年貨大集主題活動策劃方案-111P
- 中文分項(xiàng)樣本a10vm.a10ve
- 電梯安裝工程進(jìn)度計(jì)劃與措施保障方案
- 幼兒園游戲方案與案例-完整版PPT課件
- 生產(chǎn)安全事故風(fēng)險(xiǎn)評估報(bào)告(參考模板)
- ASME培訓(xùn)教程ASME規(guī)范第VIII-1卷-壓力容器
- 過磅管理制度管理辦法
- 繩子的故事(課堂PPT)
- 第2章 行車荷載分析-3
- 華為交換機(jī)常用配置
- 社區(qū)居家養(yǎng)老服務(wù)需求論文
- 110米鋼桁梁頂推架設(shè)監(jiān)理實(shí)施細(xì)則
評論
0/150
提交評論