版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第5章章 匯編語言程序設計匯編語言程序設計 本章主要內(nèi)容本章主要內(nèi)容 本章介紹匯編語言程序設計的基本方法,包本章介紹匯編語言程序設計的基本方法,包 括:順序程序設計、分支程序設計、循環(huán)程括:順序程序設計、分支程序設計、循環(huán)程 序設計和子程序的設計。序設計和子程序的設計。 5.1 匯編語言源程序設計的步驟匯編語言源程序設計的步驟 5.1.1 分析問題分析問題 首先必須明確求解問題的意義和任務。對給出的已首先必須明確求解問題的意義和任務。對給出的已 知條件和要完成的任務進行詳細地了解和分析,將知條件和要完成的任務進行詳細地了解和分析,將 一個實際的問題轉(zhuǎn)化為計算機可以處理的問題。一個實際的問題轉(zhuǎn)
2、化為計算機可以處理的問題。 5.1.2 確定確定算法算法 其次就是確定解決問題的算法。所謂算法,簡單地其次就是確定解決問題的算法。所謂算法,簡單地 說就是說就是計算機能夠?qū)崿F(xiàn)的有限的解題計算機能夠?qū)崿F(xiàn)的有限的解題步驟步驟。我們知。我們知 道,計算機只能進行最基本的算術(shù)運算和邏輯運算,道,計算機只能進行最基本的算術(shù)運算和邏輯運算, 要完成較為復雜的運算和控制操作,必須選擇合適要完成較為復雜的運算和控制操作,必須選擇合適 的算法,這是正確編程的基礎(chǔ)。的算法,這是正確編程的基礎(chǔ)。 5.1.3 繪制繪制流程圖流程圖 將提出的算法或編程思想用流程圖的方式畫將提出的算法或編程思想用流程圖的方式畫 出來。圖
3、出來。圖5-1給出了流程圖中較為通用的幾種給出了流程圖中較為通用的幾種 符號。符號。 起始框和終止框起始框和終止框 執(zhí)行框執(zhí)行框 判斷框判斷框 聯(lián)系框聯(lián)系框 5.1.4 程序設計程序設計 根據(jù)流程圖進行程序設計就是采用某種程序根據(jù)流程圖進行程序設計就是采用某種程序 設計語言來實現(xiàn)上面已確定的算法,此過程設計語言來實現(xiàn)上面已確定的算法,此過程 有些書上稱為有些書上稱為編碼編碼。 本書所介紹的是采用匯編語言編寫程序。本書所介紹的是采用匯編語言編寫程序。 采用匯編語言編寫程序應注意以下幾個問題:采用匯編語言編寫程序應注意以下幾個問題: 必須詳細了解必須詳細了解CPU的編程模型、指令系統(tǒng)、的編程模型、
4、指令系統(tǒng)、 尋址方式及相關(guān)偽指令;尋址方式及相關(guān)偽指令; 必須進行存儲空間和工作單元的合理分配;必須進行存儲空間和工作單元的合理分配; 多次使用的程序段落可采用子程序或宏指令;多次使用的程序段落可采用子程序或宏指令; 盡可能用盡可能用標號或變量標號或變量來代替絕對地址和常數(shù);來代替絕對地址和常數(shù); 5.1.5 程序程序檢驗檢驗 程序編寫好以后,必須經(jīng)過書面檢查和上機程序編寫好以后,必須經(jīng)過書面檢查和上機 調(diào)試,以便說明程序是否正確。檢驗時,應調(diào)試,以便說明程序是否正確。檢驗時,應 預先選擇典型數(shù)據(jù),檢查是否可以得到預期預先選擇典型數(shù)據(jù),檢查是否可以得到預期 結(jié)果。結(jié)果。 5.1.6 編寫編寫說
5、明說明文件文件 一個完整的軟件應有相應的說明文件,這不一個完整的軟件應有相應的說明文件,這不 僅便于用戶使用,也便于對程序的維護和擴僅便于用戶使用,也便于對程序的維護和擴 充。說明文件主要應包括程序的功能和使用充。說明文件主要應包括程序的功能和使用 方法,程序的基本結(jié)構(gòu)和所采用的主要算法方法,程序的基本結(jié)構(gòu)和所采用的主要算法 以及程序必要說明和注意事項等。以及程序必要說明和注意事項等。 32位微機系統(tǒng)中,位微機系統(tǒng)中,CPU可以工作在實模式、可以工作在實模式、 保護模式和虛擬模式下,本章僅介紹基于保護模式和虛擬模式下,本章僅介紹基于實實 模式模式的程序設計。的程序設計。 5.2 順序程序設計順
6、序程序設計 順序結(jié)構(gòu)也稱線性結(jié)構(gòu),其特點是其中的語順序結(jié)構(gòu)也稱線性結(jié)構(gòu),其特點是其中的語 句或結(jié)構(gòu)被連續(xù)執(zhí)行,順序程序是句或結(jié)構(gòu)被連續(xù)執(zhí)行,順序程序是最簡單最簡單的,的, 也是也是最基本最基本的一種程序結(jié)構(gòu)形式。的一種程序結(jié)構(gòu)形式。 CPU總是根據(jù)總是根據(jù)CS:IP獲取下一條指令所在存儲獲取下一條指令所在存儲 單元的地址,并自動對單元的地址,并自動對IP不斷執(zhí)行加不斷執(zhí)行加1操作。操作。 這種結(jié)構(gòu)的程序從開始到結(jié)尾一直是順序執(zhí)這種結(jié)構(gòu)的程序從開始到結(jié)尾一直是順序執(zhí) 行的,中途沒有任何分支和循環(huán)。行的,中途沒有任何分支和循環(huán)。 從流程圖來看,順序結(jié)從流程圖來看,順序結(jié) 構(gòu)除了一個起始框,一構(gòu)除了
7、一個起始框,一 個結(jié)束框外,就是若干個結(jié)束框外,就是若干 個執(zhí)行框,沒有判斷框。個執(zhí)行框,沒有判斷框。 具有順序結(jié)構(gòu)的程序叫具有順序結(jié)構(gòu)的程序叫 做簡單程序。做簡單程序。 順序結(jié)構(gòu)順序結(jié)構(gòu) 開始開始 結(jié)束結(jié)束 例:實現(xiàn)例:實現(xiàn)625*210M。 M DD ? MOV AX,625 MOV BX,210 MUL BX ;16位乘法:結(jié)果為位乘法:結(jié)果為32位位 MOV M ,AX MOV M+2,DX 注:算術(shù)運算指令需要注意注:算術(shù)運算指令需要注意字長字長、區(qū)分、區(qū)分無符無符 號號/有符號有符號、溢出溢出等問題。等問題。 例例5.9:P161。 5.3 分支程序設計分支程序設計 分支程序有分支
8、程序有3種結(jié)構(gòu),即種結(jié)構(gòu),即簡單分支簡單分支、復合分支、復合分支 和多分支。和多分支。 復合分支復合分支是指通過一個簡單分支不能實現(xiàn)判是指通過一個簡單分支不能實現(xiàn)判 斷,必須多個分支合起來才能進行判斷的情斷,必須多個分支合起來才能進行判斷的情 況。況。 在設計多分支轉(zhuǎn)移程序時,如果分支太多,在設計多分支轉(zhuǎn)移程序時,如果分支太多, 則平均轉(zhuǎn)移速度太慢??梢圆捎棉D(zhuǎn)移地址表則平均轉(zhuǎn)移速度太慢。可以采用轉(zhuǎn)移地址表 來實現(xiàn)多分支轉(zhuǎn)移,可以提高平均轉(zhuǎn)移速度。來實現(xiàn)多分支轉(zhuǎn)移,可以提高平均轉(zhuǎn)移速度。 多分支多分支結(jié)構(gòu)相當于一個多路開關(guān),在程序設結(jié)構(gòu)相當于一個多路開關(guān),在程序設 計中通常是根據(jù)某計中通常是根據(jù)
9、某寄存器寄存器或某或某存儲單元存儲單元的內(nèi)的內(nèi) 容容(一個數(shù)字一個數(shù)字)進行程序轉(zhuǎn)移。進行程序轉(zhuǎn)移。 分支程序的結(jié)構(gòu)示意圖分支程序的結(jié)構(gòu)示意圖 (a) 簡單分支簡單分支 (b) 復合分支復合分支 條件成立?條件成立? Y Y 條件成立?條件成立? N 語句語句 語句語句 1語句語句 2 語句語句 1語句語句 2語句語句 n 情況情況1情況情況2情況情況n 表達式計算結(jié)果是表達式計算結(jié)果是 (c) 多路分支多路分支 1.簡單分支簡單分支 通常,是在執(zhí)行了通常,是在執(zhí)行了算術(shù)比較指令算術(shù)比較指令CMP,或者或者 邏輯比較指令邏輯比較指令TEST之后,根據(jù)之后,根據(jù)Z,S,O,P, C等各種等各種狀
10、態(tài)標志狀態(tài)標志進行條件轉(zhuǎn)移。進行條件轉(zhuǎn)移。 如果條件成立:跳轉(zhuǎn)到指定指令開始執(zhí)行;如果條件成立:跳轉(zhuǎn)到指定指令開始執(zhí)行; 否則,順序執(zhí)行轉(zhuǎn)移指令的下一條指令。否則,順序執(zhí)行轉(zhuǎn)移指令的下一條指令。 例例:將一個將一個16位二進制數(shù)以二進制數(shù)的方式顯示。位二進制數(shù)以二進制數(shù)的方式顯示。 CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H ;BX中為將要處理的中為將要處理的16位二進制數(shù)位二進制數(shù) MOV CX,16 ;每次移出每次移出1位、循環(huán)位、循環(huán)16次次 LAST:MOV DL,0 RCL BX,1 ;BX循環(huán)左移一位循環(huán)左移一位 JNC
11、NEXT ;若進位標志為若進位標志為0則轉(zhuǎn),顯示則轉(zhuǎn),顯示0 MOV DL,1 ;為為1時,則顯示時,則顯示1 NEXT: MOV AH,2 INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG 思考:思考: 例中的例中的RCL換為換為SHL、SAL、ROL,是否可,是否可 行?行? “左移左移”換為換為“右移右移” 是否可行?是否可行? 2.復雜分支復雜分支 在簡單分支的某個分支上進行其他條件的判在簡單分支的某個分支上進行其他條件的判 斷。斷。 【例例】 設有一個帶符號的設有一個帶符號的16位數(shù)存于位數(shù)存于ALFA 單元中。編程判斷該數(shù)
12、,若單元中。編程判斷該數(shù),若大于大于0、將、將BETA 單元置為單元置為0FFH;若;若等于等于0、將、將BETA+1單元置單元置 為為0FFH;若;若小于小于0、將、將BETA+2單元置為單元置為 0FFH。 解解:程序設計如下程序設計如下: START:MOV AX,DATA ;設置段地址設置段地址 MOV DS,AX MOV AX,ALFA ;取操作數(shù)取操作數(shù) OR AX,AX ;設置狀態(tài)標志位設置狀態(tài)標志位 ;是否可以改為是否可以改為AND?XOR呢?呢? JS LOOP1 ;SF=1,小于小于0轉(zhuǎn)移轉(zhuǎn)移 JZ LOOP2 ;ZF=0,等于等于0轉(zhuǎn)移轉(zhuǎn)移 MOV BETA,0FFH ;
13、大于大于0 JMP LOOP3 ;能否省略?能否省略? LOOP1:MOV BETA+2, 0FFH JMP LOOP3 ;能否省略?能否省略? LOOP2:MOV BETA+1,0FFH LOOP3: END START 思考:本例可以采用思考:本例可以采用CMP AX,0的做法:的做法: 但是,必須使用但是,必須使用JG/JL,而不能使用,而不能使用JA/JB。 例:實現(xiàn)下列符號函數(shù)例:實現(xiàn)下列符號函數(shù)Y的功能,其中:的功能,其中: -128X+127。 1 當當X0時時 Y 0 當當X0時時 -1 當當X0時時 X DB?;自變量自變量X Y DB ?;函數(shù)值函數(shù)值Y MOV AL,0
14、;同時假設同時假設Y=0 CMP X,AL JG BIG ;X大于大于0 JZ SAV ;X等于等于0 、Y=0 MOV AL,0FFH ;X小于小于0、Y= -1 JMP SHORT SAV BIG: MOV AL,1 ;Y=1 SAV: MOVY,AL ;保存結(jié)果保存結(jié)果 例例5.11P162復合判斷。判斷一個復合判斷。判斷一個無符號數(shù)無符號數(shù) X與已知兩個無符號數(shù)與已知兩個無符號數(shù)N1、N2(N1N2)之間之間 的大小關(guān)系,并顯示判斷結(jié)果。的大小關(guān)系,并顯示判斷結(jié)果。 DATA SEGMENT USE16 MESG1 DB N1=X=N2$ MESG2 DB XN2$ NUMBER DB
15、 ? N1 EQU 22 N2 EQU 88 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESG1;預設一種結(jié)果預設一種結(jié)果 CMP NUMBER,N1 ;無需無需PTR JNC NEXT MOV DX,OFFSET MESG2 JMP DISP NEXT:CMP NUMBER,N2+1 JC DISP ;如果上一條指令如果上一條指令N2+1改用改用N2則則JC應改為應改為JBE MOV DX,OFFSET MESG3 DISP:MOV AH,9 INT
16、 21H MOV AH,4CH INT 21H CODE ENDS END BEG 思考:如果思考:如果NUM的值分別為以下情況、結(jié)果如何:的值分別為以下情況、結(jié)果如何: 55 ? A a -1 3.多分支多分支 在一個程序中,如果分支太多,將會出現(xiàn)連在一個程序中,如果分支太多,將會出現(xiàn)連 續(xù)多次條件判斷,則平均轉(zhuǎn)移速度較慢,即續(xù)多次條件判斷,則平均轉(zhuǎn)移速度較慢,即 程序執(zhí)行程序執(zhí)行效率較低效率較低。 多路分支相對于一個多路多路分支相對于一個多路開關(guān)開關(guān),通常是根據(jù),通常是根據(jù) 一個一個存儲單元存儲單元或者一個或者一個寄存器寄存器的內(nèi)容的內(nèi)容( )進行程序:進行程序:。 例例5.12P163:
17、設計一個支持:設計一個支持256個分支的段個分支的段 內(nèi)轉(zhuǎn)移程序。內(nèi)轉(zhuǎn)移程序。 設設JUMP中有一個數(shù)中有一個數(shù)X。 若若X=0,轉(zhuǎn)移到標號為,轉(zhuǎn)移到標號為P000的程序段。的程序段。 若若X=1,轉(zhuǎn)移到標號為,轉(zhuǎn)移到標號為P001的程序段。的程序段。 若若X=255,轉(zhuǎn)移到標號為,轉(zhuǎn)移到標號為P255的程序段。的程序段。 圖示;假設圖示;假設JUMP為為3。 .486 DATA SEGMENT USE16 JUMP DB ? TAB DW P000 ;P000是標號是標號 DW P001 . . DW P255 DATA ENDS CODE SEGMENT USE16 ASSUME CS:C
18、ODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV BL,JUMP MOV BH,0 ;2句可否合并進入句可否合并進入BX? ;能否直接使用;能否直接使用BX? ADD BX,BX ;乘以乘以2操作、為什么?操作、為什么? MOV SI,OFFSET TAB JMP BX+SI P000:. . P001:. . . . P255:. . CODE ENDS END BEG 例例統(tǒng)計一個班學生的考試分數(shù)在各個分數(shù)段統(tǒng)計一個班學生的考試分數(shù)在各個分數(shù)段 的情況。分數(shù)在的情況。分數(shù)在059的個數(shù)在的個數(shù)在Sort存儲單元,存儲單元, 6069的在的在Sort+1單元
19、,單元,9099的在的在Sort+4 單元。程序如下:單元。程序如下: DATA SEGMENT SORT DB 5 DUP(0) ADDR DW S59,S69,S79,S89,S99 TABLE DB 59,60,68,77,71,78,90,95、 DB * ;循環(huán)結(jié)束標志循環(huán)結(jié)束標志 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DI,OFFSET TABLE ;逐個讀取分數(shù)逐個讀取分數(shù) MOV SI,OFFSET ADDR NEXT:MOV AL,DI ;逐個讀取分數(shù)逐個讀取
20、分數(shù) CMP AL,* JE OVER INC DI ;準備讀取下一個數(shù)據(jù)準備讀取下一個數(shù)據(jù) CMP AL,60 JAE NEXT MOV AL,0 ;當分數(shù)低于當分數(shù)低于60時,時,AL直接置直接置0 NEXT :MOV AH,0 ;AL/10 5 MOV BL,10 DIV BL SUB AL,5 ;AL介于介于14 MOV BL,AL MOV BH,0 ;BX介于介于04 ADD BX,BX ;乘以乘以2 JMP SI+BX S59:INC SORT JMP NEXT S69:INC SORT+1 JMP NEXT S79:INC SORT+2 JMP NEXT S89:INC SORT
21、+3 JMP NEXT S99:INC SORT+4 JMP NEXT OVER:MOV CX,5 ;顯示結(jié)果;顯示結(jié)果 MOV SI,OFFSET SORT-1 DISP:MOV AH,2 MOV DL,13 INT 21H MOV AH,2 MOV DL,10 INT 21H INC SI MOV DL,SI ADD DL,30H MOV AH,2 INT 21H LOOP DISP MOV AH,4CH INT 21H CODE ENDS END START 5.4 循環(huán)程序設計循環(huán)程序設計 循環(huán)程序一般應包括以下幾部分:循環(huán)程序一般應包括以下幾部分: (1)循環(huán)初始化循環(huán)初始化。通常是
22、指設置循環(huán)的初始條件,包。通常是指設置循環(huán)的初始條件,包 括設置循環(huán)計數(shù)器的初值等,常使用寄存器或者內(nèi)括設置循環(huán)計數(shù)器的初值等,常使用寄存器或者內(nèi) 存單元作為循環(huán)計數(shù)器。存單元作為循環(huán)計數(shù)器。 (2)循環(huán)體循環(huán)體。 (3) 循環(huán)控制循環(huán)控制部分。根據(jù)循環(huán)的條件是否滿足來決定部分。根據(jù)循環(huán)的條件是否滿足來決定 程序是否循環(huán),通常用一個簡單分支來實現(xiàn)循環(huán)控程序是否循環(huán),通常用一個簡單分支來實現(xiàn)循環(huán)控 制。制。 特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設置、地址特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設置、地址 指針及循環(huán)控制條件的修改等,否則會得不到期望指針及循環(huán)控制條件的修改等,否則會得不到期望 的結(jié)果。的
23、結(jié)果。 循環(huán)結(jié)構(gòu)可以分為單循環(huán)、雙循環(huán)和多重循環(huán)。三循環(huán)結(jié)構(gòu)可以分為單循環(huán)、雙循環(huán)和多重循環(huán)。三 重及以上的循環(huán)就比較復雜了。重及以上的循環(huán)就比較復雜了。 例例求求最大數(shù)最大數(shù)。假設從內(nèi)存的。假設從內(nèi)存的BUF單元開始存單元開始存 有一個以有一個以ASCII碼碼方式表示的字符串,求其中方式表示的字符串,求其中 的最大數(shù)的最大數(shù)(即即ASCII碼最大的字符的碼最大的字符的ASCII值值), 顯示到屏幕上。顯示到屏幕上。 注意:注意:ASCII碼參與比較時視為碼參與比較時視為無符號數(shù)無符號數(shù)! 必須使用必須使用JA/JB,而不能使用,而不能使用JG/JL 解法解法1循環(huán)次數(shù)已知循環(huán)次數(shù)已知 DAT
24、A SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $-BUF ;統(tǒng)計字節(jié)個數(shù)、即統(tǒng)計字節(jié)個數(shù)、即循環(huán)次數(shù)循環(huán)次數(shù) MAX DB MAX=,?,0DH, 0AH, $ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV AL,0 ;最大數(shù)最大數(shù)0送送AL LEA BX,BUF MOV CX,COUNT LAST: CMP BX,AL JB NEXT MOV AL,BX ;大數(shù)大數(shù) NEXT:INC BX LOOP LAST MOV MAX+4
25、,AL MOV AH,9 LEA DX,MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG 在上面的例子里面,循環(huán)次數(shù)已知,在已知在上面的例子里面,循環(huán)次數(shù)已知,在已知N 個數(shù)中,求最大數(shù)時:個數(shù)中,求最大數(shù)時: (1)需要比較)需要比較N次次: 給定一個假設的最小無符號數(shù)給定一個假設的最小無符號數(shù)0; (2)只需要)只需要N-1次:次: 假設第一個數(shù)即是最大數(shù)。假設第一個數(shù)即是最大數(shù)。 解法解法2 循環(huán)結(jié)束標志循環(huán)結(jié)束標志 當循環(huán)次數(shù)不確定時,采用當循環(huán)次數(shù)不確定時,采用循環(huán)結(jié)束標志循環(huán)結(jié)束標志控控 制循環(huán)。制循環(huán)。 此例中:定義一個值為此例中:
26、定義一個值為-1的的FLAG單元作為字單元作為字 符串的結(jié)束標志。符串的結(jié)束標志。 解法解法2 求字符串中最大字符,利用求字符串中最大字符,利用結(jié)束標志結(jié)束標志。 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 FLAG DB -1 MAX DB MAX=,?,0DH, 0AH, $ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;最小無符號數(shù)最小無符號數(shù)0送送AL LEA BX,BUF LAST:CMP BYTE PTR BX,-1
27、 JE DISP CMP BX,AL JC NEXT MOV AL,BX NEXT:INC BX JMP LAST DISP:MOV MAX+4,AL MOV AH,9 MOV DX,OFFSET MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG 例例設某數(shù)據(jù)塊存放在設某數(shù)據(jù)塊存放在BUFFER開始的開始的100個字節(jié)單元中。試個字節(jié)單元中。試 編程統(tǒng)計數(shù)據(jù)塊中編程統(tǒng)計數(shù)據(jù)塊中負數(shù)的個數(shù)負數(shù)的個數(shù),并將統(tǒng)計的結(jié)果存放到,并將統(tǒng)計的結(jié)果存放到 NUMBER單元中。單元中。 解解:程序如下程序如下: START:MOV AX,DATA MOV DS,
28、 AX LEA SI,BUFFER ;設置數(shù)據(jù)塊指針設置數(shù)據(jù)塊指針 MOV CX,100 ;設置循環(huán)次數(shù)設置循環(huán)次數(shù) MOV BL,0 ;統(tǒng)計個數(shù)統(tǒng)計個數(shù) LOOP1:MOV AL,SI ;取數(shù)據(jù)取數(shù)據(jù) OR AL,AL ;設置設置狀態(tài)標志位狀態(tài)標志位 JNS LOOP2 ;非負轉(zhuǎn)移非負轉(zhuǎn)移 INC BL ;計數(shù)器加計數(shù)器加1 LOOP2:INC SI ;修改指針修改指針 LOOP LOOP1 ;CX0,繼續(xù)循環(huán)繼續(xù)循環(huán) MOV NUMBER, BL END START 例例設設STRING開始的區(qū)域中存放著一個字符串開始的區(qū)域中存放著一個字符串,以字符以字符* 作為結(jié)束標志。設計程序作為結(jié)束
29、標志。設計程序,統(tǒng)計字符串的長度統(tǒng)計字符串的長度,并存入并存入 LENGTH單元中。單元中。 解解:程序如下程序如下: START:MOV AX,DATA MOV DS,AX LEA BX,STRING ;設置字符串首地設置字符串首地 MOV CX,0 ;計數(shù)器清計數(shù)器清0 LOOP1:MOV AL,BX ;取一個字符取一個字符 CMP AL,* ;與與*比較比較 JZ LOOP2 ;相等轉(zhuǎn)相等轉(zhuǎn)LOOP2 INC CX ;計數(shù)器加計數(shù)器加1 INC BX ;修改指針修改指針 JMP LOOP1 ;循環(huán)循環(huán) LOOP2: MOV LENGTH, CX ;存結(jié)果存結(jié)果 END START ;例:
30、內(nèi)存緩沖區(qū)從例:內(nèi)存緩沖區(qū)從BUF+1開始存有若干個單字節(jié)的開始存有若干個單字節(jié)的 有符號數(shù),其個數(shù)放在有符號數(shù),其個數(shù)放在BUF單元,要求找出單元,要求找出最大數(shù)最大數(shù) 送到送到MAX單元,最小數(shù)送到單元,最小數(shù)送到MIN單元單元。 DATA SEGMENT USE16 BUF DB 8, 34,56,-1,7FH,-88,200,22,80H MAX DB ? MIN DB ? DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV CH,0 MOV CL,BUF MOV AL,B
31、UF+1 MOV MAX,AL MOV MIN,AL DEC CX MOV BX,OFFSET BUF+2 LAST:MOV AL,BX CMP AL,MAX JG GREAT CMP AL,MIN JL LESS JMP NEXT GREAT: MOV MAX,AL JMP NEXT LESS:MOV MIN,AL NEXT:INC BX LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG 例在字型例在字型無序表無序表中找出中找出最大數(shù)最大數(shù)和和最小數(shù)最小數(shù),并分別,并分別 存入存入MAX和和MIN單元。單元。 STACKSG SEGMENT STA
32、CK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT BUFFER DW 500,30,56,77,999,67,433,5675,0,9999, 3455,6578,32766,8,0,32560,45,889,5665,09 ;無序表無序表 CN DW ($-BUFFER)/2;元素個數(shù)元素個數(shù) MAX DW ?;存放最大數(shù)單元存放最大數(shù)單元 MIN DW ? ;存放最小數(shù)單元存放最小數(shù)單元 DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUS
33、H AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指針初始化地址指針 MOV CX,CN ;元素個數(shù)元素個數(shù) MOV AX,SI ;取第一數(shù)取第一數(shù) MOV MAX,AX ;初始化最大數(shù)初始化最大數(shù) MOV MIN,AX ;初始化最小數(shù)初始化最小數(shù) DEC CX ;循環(huán)次數(shù)減循環(huán)次數(shù)減1 COMP:ADD SI,2 ;修改地址指針修改地址指針 MOV AX,SI;取下一個數(shù)取下一個數(shù) CMP AX,MAX;與當前的最大數(shù)比較與當前的最大數(shù)比較 JL NEXT;若小于轉(zhuǎn)若小于轉(zhuǎn) MOV MAX,AX ;若大于則把此數(shù)作為最大數(shù)保存若大于則把此數(shù)作為最大
34、數(shù)保存 JMP SHORT LOP NEXT:CMP AX,MIN;與當前的最小數(shù)比較與當前的最小數(shù)比較 JG LOP;若大于轉(zhuǎn)若大于轉(zhuǎn) MOV MIN,AX;若小于則把此數(shù)作為最小數(shù)保存若小于則把此數(shù)作為最小數(shù)保存 LOP: LOOP COMP;決定循環(huán)繼續(xù)還是終止決定循環(huán)繼續(xù)還是終止 RET MAIN ENDP CODE ENDS END MAIN 多重循環(huán)程序設計多重循環(huán)程序設計 例編制用軟件延時例編制用軟件延時200ms的程序。的程序。 假設,以下程序片段可以延時假設,以下程序片段可以延時10ms: DELAY10: MOV CX,2801 ;置循環(huán)次數(shù)置循環(huán)次數(shù) WT: LOOP W
35、T 則延時則延時200ms只需把以上程序片段只需把以上程序片段循環(huán)循環(huán)20次次即即 可,如下所示:可,如下所示: DELAY PROC MOV BL,20;置外循環(huán)次數(shù)置外循環(huán)次數(shù) DELAY10: MOV CX,2801;置內(nèi)循環(huán)次數(shù)置內(nèi)循環(huán)次數(shù) WT: LOOP WT;內(nèi)循環(huán)體、循環(huán)次數(shù)修改及循環(huán)控制內(nèi)循環(huán)體、循環(huán)次數(shù)修改及循環(huán)控制 DEC BL;修改外循環(huán)次數(shù)修改外循環(huán)次數(shù) JNZ DELAY10;外循環(huán)控制外循環(huán)控制 RET DELAY ENDP 5.5 子程序設計子程序設計 子程序子程序(即即:過程過程)是相對獨立的程序,當程序中經(jīng)常是相對獨立的程序,當程序中經(jīng)常 需要完成某一項操作
36、時,為了簡化程序和閱讀方便,需要完成某一項操作時,為了簡化程序和閱讀方便, 常常把完成某項操作的程序單獨設計為一個子程序,常常把完成某項操作的程序單獨設計為一個子程序, 需要時就調(diào)用它。需要時就調(diào)用它。 子程序通常用子程序通常用PROC/ENDP作為定界語句,用作為定界語句,用CALL 指令調(diào)用,子程序用指令調(diào)用,子程序用RET返回。返回。 從子程序相對于調(diào)用指令的位置來看,分為從子程序相對于調(diào)用指令的位置來看,分為段內(nèi)段內(nèi)和和 段間段間子程序。分別用子程序。分別用NEAR和和FAR表示其屬性。表示其屬性。 根據(jù)子程序入口地址給出的方式不同,子程序的調(diào)根據(jù)子程序入口地址給出的方式不同,子程序的
37、調(diào) 用也可以分為用也可以分為直接直接和和間接調(diào)用間接調(diào)用兩種方式。兩種方式。 1調(diào)用程序和子程序在調(diào)用程序和子程序在同一個代碼段同一個代碼段的程序結(jié)構(gòu)的程序結(jié)構(gòu) (子程序類型可缺省,注意(子程序類型可缺省,注意END后必須跟主程序名)后必須跟主程序名) CODE SEGMENT MAINPROC FAR CALLSUB1 RET MAINENDP SUB1PROC RET SUB1ENDP CODEENDS ENDMAIN 2調(diào)用程序和子程序在調(diào)用程序和子程序在不同段不同段的程序結(jié)構(gòu)的程序結(jié)構(gòu)(SUB2既被既被段間段間調(diào)用又被調(diào)用又被段內(nèi)段內(nèi) 調(diào)用調(diào)用,必須是必須是FAR屬性屬性。CALL要顯
38、式說明是要顯式說明是FAR屬性)屬性) CODE1SEGMENT MAINPROC FAR CALLFAR PTR SUB2 RET MAINENDP CODE1ENDS CODE2SEGMENT SUB2PROC FAR RET SUB2ENDP SUB3PROC CALLFAR PTR SUB2 RET SUB3ENDP CODE2ENDS ENDMAIN 子程序分為無參數(shù)和有參數(shù)兩種。子程序分為無參數(shù)和有參數(shù)兩種。 調(diào)用有參數(shù)的子程序時,向子程序調(diào)用有參數(shù)的子程序時,向子程序傳遞參數(shù)的方法傳遞參數(shù)的方法 有三種:有三種: (1)利用利用寄存器寄存器。使用方便,適合于傳遞。使用方便,適合于
39、傳遞參數(shù)較少參數(shù)較少的的 場合;場合; (2)利用利用堆棧堆棧;例如:;例如:C語言中的動態(tài)存儲區(qū)語言中的動態(tài)存儲區(qū) (3)利用利用內(nèi)存單元內(nèi)存單元。如果使用連續(xù)多個存儲單元:實。如果使用連續(xù)多個存儲單元:實 際上是傳遞一片連續(xù)存儲單元的首地址指針,際上是傳遞一片連續(xù)存儲單元的首地址指針, 即:把即:把首地址首地址的偏移地址放在某個的偏移地址放在某個寄存器寄存器里面。里面。 注意,若調(diào)用程序和子程序在注意,若調(diào)用程序和子程序在同一模塊同一模塊(源程序)(源程序) 中,子程序可以直接訪問模塊中的變量。中,子程序可以直接訪問模塊中的變量。 通常情況下,一個子程序或函數(shù):通常情況下,一個子程序或函數(shù)
40、: 只有只有一個入口一個入口:調(diào)用子程序?qū)嶋H上是根據(jù):調(diào)用子程序?qū)嶋H上是根據(jù)CS:IP指向指向 子程序子程序第一條第一條指令的地址;指令的地址; 可以有可以有多個出口多個出口(多條多條RET指令指令); 但返回主程序的同一個位置:但返回主程序的同一個位置:一個斷點一個斷點; 實際上,如果需要、子程序可以提供實際上,如果需要、子程序可以提供多個入口多個入口:此:此 時,調(diào)用子程序時可以從第二條、第三條指令開始時,調(diào)用子程序時可以從第二條、第三條指令開始 執(zhí)行;執(zhí)行; 類似地,通常、子程序返回時通常是返回到調(diào)用程類似地,通常、子程序返回時通常是返回到調(diào)用程 序的斷點,即:序的斷點,即:CALL指令
41、的下一條指令。但實際指令的下一條指令。但實際 上,如果需要、也可以上,如果需要、也可以不返回斷點不返回斷點(CALL的下一條的下一條 指令指令)、而是返回任意指定的位置、而是返回任意指定的位置。 理解:因為,無論是多個入口或多個出口或多個斷理解:因為,無論是多個入口或多個出口或多個斷 點,本質(zhì)含義都是通過指令引導點,本質(zhì)含義都是通過指令引導CPU根據(jù)指定的根據(jù)指定的 CS:IP的內(nèi)容進行跳轉(zhuǎn)。的內(nèi)容進行跳轉(zhuǎn)。 例例3個個16位操作數(shù)加法程序位操作數(shù)加法程序 解法解法1主程序通過主程序通過內(nèi)存單元內(nèi)存單元(把內(nèi)存單元的首地址放把內(nèi)存單元的首地址放 入入SI)傳遞參數(shù)給傳遞參數(shù)給COMPUTE,通
42、過通過寄存器寄存器BX直接直接 傳遞參數(shù)給子程序傳遞參數(shù)給子程序DISP顯示結(jié)果。顯示結(jié)果。 DATA SEGMENT USE16 NUM DW 1122H DW 3344H DW 5566H ;參數(shù)在存儲單元中參數(shù)在存儲單元中 DATA ENDS STACK_ SEGMENT STACK USE16 DB 100H DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV ,OFFSET NUM CALL COMPUTE ;BX中為中為3個數(shù)之和個數(shù)
43、之和 ;-COMPUTE-;參數(shù)在數(shù)據(jù)段參數(shù)在數(shù)據(jù)段(DS) ;入口參數(shù):三個入口參數(shù):三個16位加數(shù)放在內(nèi)存位加數(shù)放在內(nèi)存DS:SI開始處開始處 ;出口參數(shù):出口參數(shù):16位和放在位和放在BX中中 ;功能:完成三個功能:完成三個16位數(shù)相加位數(shù)相加 COMPUTE PROC NEAR MOV BX,0 ;累加和累加和 ADD BX,SI+0 ;加第一個數(shù)加第一個數(shù) ADD BX,SI+2 ADD BX,SI+4 ;省略省略DS,參數(shù)在存儲單元中,參數(shù)在存儲單元中 RET COMPUTE ENDP CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STA
44、CK_ BEG:MOV AX,DATA MOV DS,AX MOV ,OFFSET NUM CALL COMPUTE ;BX中為中為3個數(shù)之和個數(shù)之和 CALL DISP MOV AH,4CH INT 21H ;-DISPLAY ;將將BX中的數(shù)值以二進制中的數(shù)值以二進制 ASCII碼顯示到屏幕碼顯示到屏幕 DISP PROC NEAR MOV CX,16 LAST:MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS END BEG 解法解法2主程序通過主程序通過
45、堆棧堆棧傳遞參數(shù)給子程序傳遞參數(shù)給子程序 COMPUTE DATA SEGMENT USE16 NUM DW 1122H ;加數(shù)加數(shù)N1 DW 3344H ;加數(shù)加數(shù)N2 DW 5566H ;加數(shù)加數(shù)N3 DATA ENDS STACK_ SEGMENT STACK USE16 DB 100H DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;圖示:圖示:SP的變化的變化:初始為初始為SP0 PUSH WORD P
46、TR SI+0 ; SP0-2 、 1122H入棧入棧 PUSH WORD PTR SI+2 ; SP0-4 、 3344H入棧入棧 PUSH WORD PTR SI+4 ; SP0-6 、 5566H入棧入棧 CALL COMPUTE ; SP0-8(段內(nèi)段內(nèi)) 、斷點入棧、斷點入棧 XYZ: ;-COMPUTE-;參數(shù)在堆棧段參數(shù)在堆棧段(SS) ; 子程序子程序COMPUTE中:中:SP當前值當前值: SP0-8 ; 輸入?yún)?shù)輸入?yún)?shù): 在在堆棧中的堆棧中的SS:SP0-8+2,SS:SP0-8+4, ;SS:SP0-8+6中:中:分別為分別為N3, N2, N1 COMPUTE PRO
47、C NEAR MOV BP,SP MOV BX,0 ;累加和累加和 ADD BX,BP+2;操作數(shù)在堆棧中操作數(shù)在堆棧中:N3 ADD BX,BP+4;操作數(shù)操作數(shù)N2 ADD BX,SS:BP+6;操作數(shù)操作數(shù)N1 RET 6; 堆?;謴驮瓲疃褩;謴驮瓲?SP恢復恢復初始值初始值SP0 COMPUTE ENDP CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG:MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;圖示:圖示:SP的變化的變化:初始為初始為SP0 PUSH WORD PTR SI+0 ;
48、 SP0-2 、 1122H入棧入棧 PUSH WORD PTR SI+2 ; SP0-4 、 3344H入棧入棧 PUSH WORD PTR SI+4 ; SP0-6 、 5566H入棧入棧 CALL COMPUTE ; SP0-8(段內(nèi)段內(nèi)) 、斷點入棧、斷點入棧 XYZ:CALL DISP MOV AH,4CH INT 21H ;-DISPLAY DISP PROC NEAR MOV CX,16 LAST:MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS
49、END BEG 解法解法3主程序仍然通過主程序仍然通過內(nèi)存單元內(nèi)存單元(內(nèi)存單元的首地址內(nèi)存單元的首地址 放入放入SI)傳遞參數(shù)給傳遞參數(shù)給COMPUTE。 注意:注意:斷點斷點的含義!的含義! CODE SEGMENT USE16 ASSUME CS:CODE,SS:STACK_ BEG: CALL COMPUTE ;將將OFFSET NUM值壓入堆棧值壓入堆棧 NUM DW 1122H ; CS段段圖示:圖示:數(shù)數(shù)N1 DW 3344H ; 數(shù)數(shù)N2 DW 5566H ; 數(shù)數(shù)N3 ;注意:注意:數(shù)據(jù)定義在代碼段數(shù)據(jù)定義在代碼段!(類似于類似于COM格式格式) ;理解:指令;理解:指令CA
50、LL COMPUTE的的斷點斷點是是下一個存下一個存 儲單元的地址儲單元的地址(內(nèi)容是數(shù)據(jù)內(nèi)容是數(shù)據(jù)22H) !且壓入堆棧。!且壓入堆棧。 此時:此時:斷點斷點指示的存儲單元存放數(shù)據(jù)而指示的存儲單元存放數(shù)據(jù)而不是指令不是指令! XYZ:CALL DISP ; CALL COMPUTE正確斷點正確斷點應該是應該是XYZ MOV AH,4CH INT 21H ;-COMPUTE-;參數(shù)在參數(shù)在代碼段代碼段(CS) COMPUTE PROC NEAR MOV BP,SP MOV SI,BP+0 ;SI棧頂棧頂OFFSET NUM MOV BX,0 ;初始和為初始和為0 ADD BX,CS:SI+0
51、; 加數(shù)加數(shù)N1;CS不能省略不能省略 ;理解:加數(shù)可以用理解:加數(shù)可以用CS:NUM尋址尋址 ADD BX,CS:SI+2 ; 加數(shù)加數(shù)N2 ADD BX,CS:SI+4 ; 加數(shù)加數(shù)N3 POP AX ;將棧頂元素將棧頂元素OFFSET NUM值拋棄值拋棄 MOV AX,OFFSET XYZ PUSH AX ;把真正的斷點把真正的斷點OFFSET XYZ壓入堆棧壓入堆棧 RET ;彈出斷點彈出斷點IP,返回主程序返回主程序XYZ處處 COMPUTE ENDP ;-DISPLAY DISP PROC NEAR ; 顯示顯示BX中各個二進制位中各個二進制位 MOV CX,16 LAST:MOV
52、 DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT:MOV AH,2 INT 21H LOOP LAST RET DISP ENDP CODE ENDS END BEG 【例例4.31】設設NUM開始的單元中存放著開始的單元中存放著10個個無符號無符號字型字型數(shù)組數(shù)組 元素元素,利用利用子程序子程序求出該數(shù)組中求出該數(shù)組中最大值最大值與與最小值最小值,分別存入分別存入 MAX和和MIN單元中。單元中。 解解:說明文件及程序如下說明文件及程序如下: 子程序名子程序名:MAX_MIN 子程序功能子程序功能:求數(shù)組中的最大值與最小值。求數(shù)組中的最大值與最小值。 入口參數(shù)入口參
53、數(shù):SI存放存放數(shù)組首地址數(shù)組首地址,CX存放存放數(shù)組元素個數(shù)數(shù)組元素個數(shù)。 出口參數(shù)出口參數(shù):最大數(shù)存入最大數(shù)存入MAX單元單元,最小數(shù)存入最小數(shù)存入MIN單元單元。 子程序用到的寄存器子程序用到的寄存器:SI、CX、AX和和BX 程序代碼如下程序代碼如下: DATA SEGMENT NUM DW 980,435H,4,547DH,1234H,320H,456H,7890H,234,128 MAX DW ? MIN DW ? DATA ENDS STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD ;TOP為字地址為字地址 STACK ENDS C
54、ODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA SI, NUM ;SI指向數(shù)據(jù)緩沖區(qū)指向數(shù)據(jù)緩沖區(qū)第一個第一個數(shù)組元素數(shù)組元素 MOV CX, 9 ;剩余剩余9個個元素需要比較元素需要比較 CALL MAX_MIN MOV AH,CH ;AH00 INT 21H ;返回返回DOS MAX_MIN PROC NEAR PUSH AX PUSH BX PUSH CX PUSH SI MOV AX,SI ;
55、最大數(shù)最大數(shù) MOV BX,AX ;最小數(shù)最小數(shù) LOPX: ADD SI , 2 CMP SI , AX ; 與較大的與較大的AX比較比較 JC MINU ; 如果小于較大的如果小于較大的AX, 則繼續(xù)與較小的則繼續(xù)與較小的BX比比 較較 JZ NEXT;等于;等于AX MOV AX,SI;大于大于AX JMP NEXT;能否省略能否省略 MINU: CMP SI,BX JNC NEXT ;大于大于BX MOV BX,SI;小于小于BX NEXT: LOOP LOPX MOV MAX,AX ;保存較大數(shù)保存較大數(shù) MOV MIN,BX ;保存較小數(shù)保存較小數(shù) POP SI POP CX PO
56、P BX POP AX RET MAX_MIN ENDP CODE ENDS END MAIN 設計子程序時應注意的問題:設計子程序時應注意的問題: 1子程序說明;子程序說明; 2寄存器的保存與恢復;寄存器的保存與恢復; 3密切注意堆棧狀態(tài)。密切注意堆棧狀態(tài)。 若調(diào)用程序和子程序在若調(diào)用程序和子程序在同一模塊同一模塊中,子程序可以直中,子程序可以直 接訪問模塊中的變量。接訪問模塊中的變量。 例實現(xiàn)例實現(xiàn)數(shù)組求和數(shù)組求和功能。要求數(shù)組求和(不考慮溢功能。要求數(shù)組求和(不考慮溢 出情況)由子程序?qū)崿F(xiàn),其數(shù)組元素及結(jié)果均為字出情況)由子程序?qū)崿F(xiàn),其數(shù)組元素及結(jié)果均為字 型數(shù)據(jù)。型數(shù)據(jù)。 STACKS
57、G SEGMENT STACK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 COUNT DW ($-ARY)/2;數(shù)組元素個數(shù)數(shù)組元素個數(shù) SUM DW ?;數(shù)組和的地址數(shù)組和的地址 DATA ENDS CODE1 SEGMENT MAIN PROC FAR ASSUME CS:CODE1,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX CALL FAR PTR ARY_SUM RET MAIN ENDP CODE1 ENDS COD
58、E2 SEGMENT ASSUME CS:CODE2 ARY_SUM PROC FAR;數(shù)組求和子程序數(shù)組求和子程序 PUSH AX;保存寄存器保存寄存器 PUSH CX PUSH SI LEA SI,ARY;取數(shù)組起始地址取數(shù)組起始地址 MOV CX,COUNT;取元素個數(shù)取元素個數(shù) XOR AX,AX;清清0累加器累加器 NEXT: ADD AX,SI;累加和累加和 ADD SI,TYPE ARY;修改地址指針修改地址指針 LOOP NEXT MOV SUM,AX;存和存和 POP SI;恢復寄存器恢復寄存器 POP CX POP AX RET ARY_SUM ENDP CODE2 END
59、S END MAIN 通過通過地址表地址表傳遞參數(shù)地址傳遞參數(shù)地址 適用于參數(shù)較多的情況。具體方法是先建立適用于參數(shù)較多的情況。具體方法是先建立 一個地址表,該表由參數(shù)地址構(gòu)成。然后把一個地址表,該表由參數(shù)地址構(gòu)成。然后把 表的首地址通過寄存器或堆棧傳遞給子程序。表的首地址通過寄存器或堆棧傳遞給子程序。 例編寫一個數(shù)組求和子程序,其數(shù)組元素例編寫一個數(shù)組求和子程序,其數(shù)組元素 及結(jié)果均為字型數(shù)據(jù)。另定義兩個數(shù)組,并及結(jié)果均為字型數(shù)據(jù)。另定義兩個數(shù)組,并 編寫一個主程序,通過調(diào)用數(shù)組求和子程序編寫一個主程序,通過調(diào)用數(shù)組求和子程序 分別求出兩個數(shù)組的和。分別求出兩個數(shù)組的和。 STACKSG S
60、EGMENT STACK STK DW 32 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 ;數(shù)組數(shù)組1 COUNT DW ($-ARY)/2;數(shù)組數(shù)組1的元素個數(shù)的元素個數(shù) SUM DW ?;數(shù)組數(shù)組1的和地址的和地址 NUM DW 10,20,30,40,50;數(shù)組數(shù)組2 CT DW ($-NUM)/2;數(shù)組數(shù)組2的元素個數(shù)的元素個數(shù) TOTAL DW ?;數(shù)組數(shù)組2的和地址的和地址 TABLE DW 3 DUP(?);地址表地址表 DATA ENDS CODE1SEGMENT MAINPROC FAR ASSUM
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃廠房合同協(xié)議
- 招標文件評審的實踐操作與評審標準
- 家庭護理家政工雇傭合同
- 土地居間合作合同書
- 現(xiàn)金贖樓服務合同還款還款監(jiān)管政策
- 借款保證協(xié)議模板
- 個人社會救助借款合同范本
- 河砂礫石采購協(xié)議
- 林業(yè)采伐合作合同
- 抗洪項目論證招標
- 2024年廉潔經(jīng)營承諾書2篇
- 《如何培養(yǎng)良好心態(tài)》課件
- 《中醫(yī)養(yǎng)生腎》課件
- 2024年二級建造師考試建筑工程管理與實務試題及解答參考
- 生產(chǎn)車間關(guān)鍵崗位培訓
- 鄉(xiāng)鎮(zhèn)(街道)和村(社區(qū))應急預案編制管理百問百答
- 醫(yī)院培訓課件:《乳腺癌解讀》
- 中國高血壓防治指南(2024年修訂版)核心要點解讀
- 湖州師范學院《中學歷史教學論》2023-2024學年第一學期期末試卷
- 2024年人教版八年級語文上冊期末考試卷(附答案)
- 汽車乘員仿真RAMSIS操作指南
評論
0/150
提交評論