程序設計高級匯編技術待修改_第1頁
程序設計高級匯編技術待修改_第2頁
程序設計高級匯編技術待修改_第3頁
程序設計高級匯編技術待修改_第4頁
程序設計高級匯編技術待修改_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、程序設計高級匯編技術待修改3.5 匯編語言程序設計匯編語言程序設計 指令或語句就是告訴計算機為完成某一計算步驟指令或語句就是告訴計算機為完成某一計算步驟需要執行的操作。程序是為了求解某個問題所必需要執行的操作。程序是為了求解某個問題所必須的完整的指令序列或語句串加上必要的數據。須的完整的指令序列或語句串加上必要的數據。程序設計是編寫程序的過程程序設計是編寫程序的過程。當在設計一個程序時,應該考慮滿足以下目標:當在設計一個程序時,應該考慮滿足以下目標: 1)程序的正確性。)程序的正確性。 2)增強程序的可讀性。)增強程序的可讀性。 3)所寫程序應該是結構化的,易修改,易調試,)所寫程序應該是結構

2、化的,易修改,易調試,即程序的可維護性。即程序的可維護性。程序設計高級匯編技術待修改2程序的基本結構程序的基本結構 程序是指令(語句)的有序集合,是對系統任務處理步驟的描述。程程序是指令(語句)的有序集合,是對系統任務處理步驟的描述。程序的執行是有一定順序的,依據執行順序可將程序分為如下基本結序的執行是有一定順序的,依據執行順序可將程序分為如下基本結構:構: 順序結構、順序結構、 分支(選擇)結構、分支(選擇)結構、 循環結構和循環結構和 子程序結構。子程序結構。(1)順序結構:按語句先后次序執行一系列順序操作。(2)分支結構:也叫條件選擇結構,根據不同情況做出判斷和選擇,以便執行不同的程序段

3、。(3)循環結構:循環實際上是分支結構的一種擴展,循環是否繼續是依靠條件判斷語句來完成的。按照條件判斷的位置,可以把循環分為“當型循環”和“直到型循環”。每個結構只有一個入口和出口,每個結構只有一個入口和出口,3種結構可以任意組合和嵌種結構可以任意組合和嵌套構成結構化的程序套構成結構化的程序。程序設計高級匯編技術待修改3 3.5.1 順序結構程序設計順序結構程序設計l順序結構程序從執行開始到最后一條指令為止,指令指針IP中的內容呈線性增加;l設計這種程序只要遵照算法步驟依次寫出相應的指令即可。l順序結構程序設計時,主要考慮如何選擇簡單有效的算法,如何選擇存儲單元和工作單元。程序設計高級匯編技術

4、待修改4 例例 從鍵盤輸入一個小寫英文字母,將其轉換成大寫英文從鍵盤輸入一個小寫英文字母,將其轉換成大寫英文字母后在屏幕上顯示出來。字母后在屏幕上顯示出來。 分析:利用DOS功能調用INT 21H指令實現。鍵盤輸入一個字符可用01H調用,屏幕上顯示字符可用02H調用。 從ASCII碼表中可知,將小寫字母轉換成大寫字母只要將其ASCII碼減去32即可。 為簡化程序設計,假設從鍵盤輸入的字符一定是小寫字母。 程序設計高級匯編技術待修改5STACK SEGMENT STACK;定義堆棧段;定義堆棧段 DB 100 DUP(?);開辟;開辟100個存儲單元個存儲單元STACK ENDS;堆棧段結束;堆

5、棧段結束CODE SEGMENT;定義代碼段;定義代碼段 ASSUME CS:CODE , SS:STACKSTART: MOV AH ,01H ;1號調用,從鍵盤輸入一字符存入號調用,從鍵盤輸入一字符存入AL INT 21H SUB AL ,20H ;將;將AL中字符的中字符的ASCII碼減去碼減去20H變成大寫字母變成大寫字母 MOV DL ,AL;結果送;結果送DL MOV AH ,02H ;2號調用,在屏幕上顯示號調用,在屏幕上顯示DL中的內容中的內容 INT 21H MOV AH ,4CH;返回;返回DOS INT 21H CODE ENDS;代碼段結束;代碼段結束 END STAR

6、T;程序匯編結束;程序匯編結束 注意注意 : 復制時候復制時候 標點符號修改,英文輸入法標點符號修改,英文輸入法程序設計高級匯編技術待修改6 3.5.2 分支結構程序設計分支結構程序設計 分支程序的結構可以有兩種形式:l雙分支結構l多分支結構程序設計高級匯編技術待修改 【例 】已知在內存中有一個字節單元X,存有帶符號數據,要求計算出它的絕對值后,放入RESULT單元中。分析:根據數學中絕對值的概念知道,一個正數的絕對值是它本身,而一個負數的絕對值是它的相反數;要計算一個數的相反數,需要完成減法運算,即用0減去這個數。8086指令系統中有專門的求相反數的指令NEG。 源程序設計如下:程序設計高級

7、匯編技術待修改DATASEGMENT X DB -25;定義變量;定義變量 RESULT DB ?;定義結果保存單元;定義結果保存單元DATAENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV AL,X ;X取到取到AL中中 TESTAL,80H ;測試;測試AL正負正負 JZ NEXT ;為正,轉;為正,轉NEXT NEG AL ;否則;否則AL求補求補NEXT: MOV RESULT,AL ;送結果;送結果 MOV AH,4CH INT 21H ;返回;返回DOSCODE END

8、S END START ;匯編結束;匯編結束程序設計高級匯編技術待修改9 【例】設變量X為帶符號整數,試編寫一個程序,完成下面的分段函數計算: 題目分析:為實現分段函數計算,先利用上一個例題求出X的絕對值,然后根據X絕對值判斷Y取值。 程序段如下。5|15|0 xxxyAL送Y單元1-X送AL0送AL AL大于等于5開始將X取到AL中AL中的內容求絕對值結束程序設計高級匯編技術待修改10DATASEGMENT X DB -36 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE;DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL

9、,X CMP AL,0 JGE NEXT ;為正,轉;為正,轉NEXT NEG AL ;AL中的內容求補中的內容求補NEXT: CMP AL,5 ;|X|和和5比較比較 JGE P1 ;5,轉,轉P1 MOV AL,1 ;否則;否則1送送AL MOV BL,X ;X送送BL中中 SUB AL,BL ;結果送;結果送AL中中 JMP EXIT ;轉;轉EXITP1: MOV AL,0 ;0送送AL中中EXIT: MOV Y,AL ;結果送;結果送Y單元單元 MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS END START ;匯編結束;匯編結束 程序設計高級匯編技術待

10、修改 【例】設計一個程序,統計在內存W單元保存的無符號字變量中有多少個二進制“1”,統計結果送內存N單元保存。 分析:要統計內存W單元保存的無符號字變量中有多少個二進制“1”,可以將該數據送寄存器AX中,通過移位指令將AX中的每一位依次移入進位標志CF中,若CF=1則計數器CL的值加1,這樣就可以統計出AX中1的個數。設計源程序如下:。 程序設計高級匯編技術待修改DATA SEGMENT W DW 00FFH;定義字數據 N DB ?;定義結果保存單元DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DATA;初始化DS MO

11、V DS,AX MOV CL,0;計數器清零 MOV AX,W ;取數到AX AA:AND AX,AX ;邏輯與,判AX=0? JZ CC ;結果為0轉移到CC SHL AX,1;邏輯左移1位 JNC BB;無進位轉BB INC CL;有“1”則計數 BB:JMP AA;無條件轉AA CC:MOV N,CL;結果送N單元 MOV AH,4CH;返回DOS INT 21HCODE ENDS END START;匯編結束 程序設計高級匯編技術待修改13 3.5.3 循環結構程序設計循環結構程序設計 1. 循環程序的基本組成循環程序的基本組成循環結構程序主要由以下4個部分組成:(1)初始化部分(2)

12、循環體(3)參數修改部分(4)循環控制部分程序設計高級匯編技術待修改142. 單循環程序設計單循環程序設計【例】編程完成求150之間自然數中奇數之累加和,結果送RESULT單元中。 該題屬于循環次數已知,即將50以內的25個奇數進行累加和計算,可采用遞增計數法來實現求累加和。 程序設計如下。程序設計高級匯編技術待修改15DATASEGMENT RESULT DW ?;定義結果保存單元;定義結果保存單元 CN EQU 25;定義計數次數變量;定義計數次數變量DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART: MOV AX,DATA MOV DS,

13、AX ;初始化;初始化DS MOV AX,0;循環初始化;循環初始化 MOV CX,CN MOV BX,1NEXT: ADD AX,BX ;求累加和;求累加和 ADD BX,2;(;(BX)(BX)+2 LOOP NEXT ;(;(CX)-10轉轉NEXT MOV RESULT,AX ;計算完畢保存結果;計算完畢保存結果 MOV AH,4CH INT 21H ;程序結束;程序結束CODE ENDS END START ;匯編結束;匯編結束程序設計高級匯編技術待修改16 【例】編制程序完成求1+2+3+N的累加和,直到累加和超過1000為止。統計被累加的自然數的個數送CN單元,累加和送SUM單元

14、。 該題的循環次數預先是不確定的,只能按照循環過程中的某個特定條件來決定循環是否繼續執行。可通過測試條件是否成立來實現對循環的控制。 程序設計如下。 程序設計高級匯編技術待修改17DATA SEGMENT SUM DW ? CN DW ?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX;初始化;初始化DS MOV AX,0;0送送AX MOV BX,0;0送送BXLP: INC BX ;BX加加1 ADD AX,BX ;求累加和;求累加和 CMP AX,1000 ;比較;比較 JBE LP ;結果;結果

15、1000轉轉LP MOV SUM,AX MOV CN,BX ;送結果;送結果 MOV AH,4CH INT 21H ;返回;返回DOSCODEENDS END START ;匯編結束;匯編結束 程序設計高級匯編技術待修改18 3. 多重循環程序設計多重循環程序設計(1)內循環應完整包含在外循環內,內外循環不能交叉。(2)內循環在外循環中位置可根據需要任意設置。(3)內循環可嵌套在外循環中,也可幾個循環并列存在。(4)防止出現死循環。(5)每次完成外循環再次進入內循環時初始條件須重新設置。程序設計高級匯編技術待修改 【例】數據段中有一組帶符號數據,存放在從A單元開始的區域中,試編程序實現將它們按

16、從小到大的順序排序。要求排序后依然放在原來的存儲區中。 我們采用冒泡法來設計該程序。 從第一個數開始依次對兩兩相鄰的兩個數進行比較,如果次序符合要求(即第i個數小于第i+1個數),不做任何操作;否則兩數交換位置。這樣經過第一輪的兩兩比較(N-1次),最大數放到了最后。第二輪對前N-1個數做上面的工作,則把次大數放到了倒數第二個單元依次類推,做N-1輪同樣的操作,就完成了從小到大排序。 通過上述分析可以知道,該算法要用雙重循環實現。外循環次數為N-1次,內循環次數分別為N-1次、N-2次、N-3次2次、1次。所以內循環的循環次數和外循環的計數器值有關,即等于外循環計數器的值。 程序設計高級匯編技

17、術待修改20DATA SEGMENT A DB 23,-15,34,67,-19, 0,-12,89,120,55 CN EQU $-ADATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV CX,CN-1 ;外循環次數送計數器;外循環次數送計數器CXLP1: MOV SI,OFFSET A ;賦指針;賦指針 PUSH CX ;外循環計數器入棧;外循環計數器入棧LP2: MOV AL, SI CMP AL, SI+1 ;相鄰兩個數比較;相鄰兩個數比較 JLE NEXT ;小于或

18、等于轉;小于或等于轉NEXT XCHG AL,SI+1 ;否則;否則ASI和和ASI+1交換交換 MOV SI,AL NEXT:INC SI ;指針加;指針加1 LOOP LP2 ;CX-1不為不為0轉轉LP2 POP CX ;否則退出內循環,將;否則退出內循環,將CX出出棧棧 LOOP LP1 ;CX-1不為不為0轉轉LP1 MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS END START ;匯編結束;匯編結束 程序設計高級匯編技術待修改213.5.4 子程序設計子程序設計 程序設計中,常把多處用到的同一個程序段或具有一定功能程序段單獨存放在某一存儲區域中,需要

19、執行的時候,使用調用指令轉到這段程序執行調用指令轉到這段程序執行,執行完再返回原來程序執行完再返回原來程序,這個程序段就稱為子程序。 調用子程序的程序段稱為主程序。主程序中調用指令的調用子程序的程序段稱為主程序。主程序中調用指令的下一條指令的地址稱為返回地址。下一條指令的地址稱為返回地址。程序設計高級匯編技術待修改22 1. 主主子程序調用及功能分析子程序調用及功能分析【例【例 】設計一個子程序,完成統計一組設計一個子程序,完成統計一組字數據字數據中的正數和中的正數和0的個數。的個數。DATASEGMENT ARR DW -123,456,67,0,-34,-90,89,67,0,256 CN

20、 EQU ($-ARR)/2 ZER DW ? PLUS DW ?DATAENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV SI,OFFSET ARR ;數組首地址送;數組首地址送SI MOV CX,CN ;數組元素個數送;數組元素個數送CX CALL PZN ;調用近過程;調用近過程PZN MOV ZER,BX ;0的個數送的個數送ZER MOV PLUS,AX ;正數的個數送;正數的個數送PLUS MOV AH,4CH INT 21H ;返回;返回DOS 程序設計高級匯編技術待

21、修改23 ;子程序名:;子程序名:PZN ;子程序功能:統計一組字數據中的正數和;子程序功能:統計一組字數據中的正數和0的個數的個數 ;入口參數:數組首地址在;入口參數:數組首地址在SI中,數組個數在中,數組個數在CX中中 ;出口參數:正數個數在;出口參數:正數個數在AX中,中,0的個數在的個數在BX中中 ;使用寄存器:;使用寄存器:AX、BX、CX、DX、SI及及PSWPZNPROC NEAR PUSH SI PUSH DX PUSH CX ;保護現場;保護現場 XOR AX,AX XOR BX,BX ;計數單元清;計數單元清0PZN0: MOV DX,SI ;取一個數組元素送;取一個數組元

22、素送DX CMP DX,0 ;DX中內容和中內容和0比較比較 JL PZN1 ;小于;小于0轉轉PZN1 JZ ZN ;等于;等于0轉轉ZN INC AX ;否則為正數,;否則為正數,AX中內容加中內容加1 JMP PZN1 ;轉;轉PZN1ZN: INC BX ;為;為0,BX中內容加中內容加1PZN1:ADD SI,2 ;數組指針加;數組指針加2調整調整 LOOP PZN0 ;循環控制;循環控制 POP CX POP DX POP SI ;恢復現場;恢復現場 RET ;返回主程序;返回主程序 PZN ENDP ;子程序定義結束;子程序定義結束CODEENDS ;代碼段結束;代碼段結束 EN

23、D START ;匯編結束;匯編結束 程序設計高級匯編技術待修改從本例可以看出子程序的基本結構包括以下幾個部分:(1)子程序說明:)子程序說明:用來說明子程序的名稱、功能、入口參數、出口參數、占用工作單元的情況,明確該子程序的功能和調用方法。(2)現場保護及恢復:)現場保護及恢復:由于匯編語言所處理的對象主要是CPU寄存器或內存單元,主程序在調用子程序時已經占用了一定的寄存器,子程序執行主程序在調用子程序時已經占用了一定的寄存器,子程序執行時又要用到這些寄存器,執行完畢返回主程序后,為了保證主程序按原有時又要用到這些寄存器,執行完畢返回主程序后,為了保證主程序按原有的狀態繼續正常執行,需要對這

24、些寄存器的內容加以保護,這就是保護現的狀態繼續正常執行,需要對這些寄存器的內容加以保護,這就是保護現場;場;子程序執行完畢后再恢復這些被保護的寄存器的內容,稱為恢復現場。現場保護及恢復通常采用堆棧操作。(3)子程序體)子程序體:這一部分內容用來實現相應的子程序功能。(4)子程序返回:)子程序返回:子程序的返回語句RET和主程序中的調用語句CALL相互對應,才能正確實現子程序的調用和返回。返回指令用來恢復被中斷位置的地址。 程序設計高級匯編技術待修改匯編語言中子程序實現參數傳遞的方法主要有匯編語言中子程序實現參數傳遞的方法主要有3種:種:(1)寄存器傳遞:寄存器傳遞:適合于需要傳遞的參數較少的情

25、況。在調用子程序之前把參數放到規定的寄存器中,由這些寄存器將參數帶入子程序中,執行子程序結束后的結果也放到規定的寄存器中帶回主程序。(2)堆棧傳遞:堆棧傳遞:通過堆棧這個臨時存儲區來實現參數傳遞,主程序將入口參數壓入堆棧,子程序從堆棧中取出參數;子程序將出口參數壓入堆棧,主程序從堆棧中取出參數。(3)存儲器傳遞:存儲器傳遞:若調用程序和子程序在同一個程序模塊內,采用存儲器傳遞參數是最簡單的方法。通常在數據段內定義出要傳送的數據變量,也稱為數據緩沖區,子程序對這些定義的變量直接訪問即可。程序設計高級匯編技術待修改26 DOS調用程序設計調用程序設計【例【例 】編程實現用編程實現用DOS功能調用完

26、成屏幕光標的回車和換行處理功能。功能調用完成屏幕光標的回車和換行處理功能。分析:采用子程序調用分析:采用子程序調用DOS功能,先在功能,先在AH寄存器中設置系統功能調用號;其次在寄存器中設置系統功能調用號;其次在指定寄存器中設置入口參數;最后采用中斷調用指令來實現功能調用。指定寄存器中設置入口參數;最后采用中斷調用指令來實現功能調用。源程序:源程序:CRLF PROCFAR ;定義過程名為定義過程名為CRLFPUSH AX;保護現場保護現場PUSH DXMOV DL,0DH ;入口參數入口參數,回車回車CR的的ASCII碼碼MOV AH,02H ;設置系統子功能號設置系統子功能號INT 21H

27、 ;DOS調用調用,顯示單個字符顯示單個字符MOV DL,0AH;入口參數入口參數,換行換行LR的的ASCII碼碼MOV AH,02H;設置系統子功能號設置系統子功能號INT 21H;DOS調用調用,顯示單個字符顯示單個字符POP DX;恢復現場恢復現場POP AXRET ;子程序返回子程序返回CRLF ENDP ;過程結束過程結束 程序設計高級匯編技術待修改27 【例【例 】在屏幕上給出在屏幕上給出“輸入一個字符串輸入一個字符串”的提示信息,要求從鍵盤輸的提示信息,要求從鍵盤輸入相應字符串,并在屏幕上顯示輸出。入相應字符串,并在屏幕上顯示輸出。源程序:源程序:DATA SEGMENT STR

28、 DB please input a string :$ ;定義字符串定義字符串 BUF DB 20 DB ? DB 20 DUP(?) CRLF DB 0AH,0DH,$ ;回車及換行的回車及換行的ASCII碼碼DATA ENDSSTACK SEGMENT STACK ;定義堆棧區定義堆棧區 DB 20 DUP(?)STACK ENDS程序設計高級匯編技術待修改28 CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA MOVDS,AX LEADX,STR ;取字符串首地址取字符串首地址 MOVAH,09H ;DOS調用顯示字符串調用顯示字符串 INT21HMOVAH,0AH ;DOS調用輸入字符串調用輸入字符串LEADX,BUF ;取內存預留字符串首地址取內

溫馨提示

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

評論

0/150

提交評論