版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、,4.6 匯編語言程序設(shè)計及舉例,4.6.1 概述,編寫匯編語言程序的步驟 數(shù)學(xué)模型確定算法流程圖分配內(nèi)存寄存器編制程序 判斷程序質(zhì)量的標(biāo)準(zhǔn) 執(zhí)行時間,所占內(nèi)存,語句行數(shù) 程序流程圖,程序流程圖,順序程序結(jié)構(gòu),條件程序結(jié)構(gòu),分支程序結(jié)構(gòu),Y,N,一般語句,If else 語句,Switch 語句,工作框,判斷框,箭頭表示程序走向,程序流程圖,循環(huán)控制結(jié)構(gòu) 1,循環(huán)控制結(jié)構(gòu) 2,N,N,Y,Y,while 語句,do -while 語句,編寫完整的匯編語言程序,用8086的16位無符號數(shù)乘法指令實現(xiàn)兩個32位無符號數(shù)的乘法運算。,算法分析:8086沒有32位無符號數(shù)乘法指令,需借助于16位無符號
2、數(shù)乘法指令做4次乘法,然后把部分積相加,如下圖所示。,4.6.2 算術(shù)運算程序設(shè)計,完整的匯編語言程序如下:,NAME MULTIPLY_32BIT DATA SEGMENT MULNUM DW 8000H,0001H, 0FFFH, 0001H,4 DUP(?) DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS,CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK START PROC FAR BEGIN: PUSH DS ; DS中包含的是程序段前綴的段地址 MOV AX
3、,0 PUSH AX ; 設(shè)置返回至DOS的段值和偏移量 MOV AX, DATA MOV DS, AX ; 置段寄存器初值 LEA BX, MULNUM MULU32: MOV AX, BX ; BAX MOV SI, BX+4 ; DSI MOV DI, BX+6 ; CDI,MUL SI ; BD MOV BX + 8, AX ; 保存部分積1 MOV BX + 0AH, DX MOV AX, BX+2 ; AAX MUL SI ; AD ADD AX, BX + 0AH ADC DX, 0 ; 部分積2的一部分與部分 ; 積1的相應(yīng)部分相加 MOV BX + 0AH, AX MOV B
4、X + 0CH, DX ; 保存 MOV AX, BX ; BAX MUL DI ; BC ADD AX, BX + 0AH ;與部分積3的相應(yīng)部分相加 ADC DX, BX + 0CH,MOV BX + 0AH, AX MOV BX + 0CH, DX PUSHF ; 保存后一次相加的進(jìn)位標(biāo)志 MOV AX, BX + 0AH ; AAX MUL DI ; AC POPF ADC AX, BX + 0CH ; 與部分積4的相應(yīng)部分相加 ADC DX, 0 MOV BX + 0CH, AX MOV BX + 0EH, DX RET START ENDP CODE ENDS END BEGIN,
5、例 試編寫程序段,實現(xiàn)符號函數(shù)。,4.6.3 分支程序設(shè)計,相應(yīng)的程序段為;,一段程序有時重復(fù)執(zhí)行多次,就牽涉到循環(huán)程序結(jié)構(gòu),其組成部分為:,4.6.4 循環(huán)程序設(shè)計,(1) 用計數(shù)器控制循環(huán),DATA SEGMENT ARRAY DW 8 ; 元素個數(shù) DW 230, -1437, 26, -31, 0, 3458, 0, 10 POST DW 0 NEGA DW 0 ZERO DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX XOR AX, AX ; 用AX作為正數(shù)的計數(shù)器
6、XOR BX, BX ; 用BX作為負(fù)數(shù)的計數(shù)器 XOR DX, DX ; 用DX作為零的計數(shù)器,MOV CX, ARRAY ; 用CX來進(jìn)行循環(huán)計數(shù) JCXZ DONE ; 考慮數(shù)組的元素個數(shù)為0的情況 LEA DI, ARRAY+2 ; 用指針DI來訪問整個數(shù)組 AGAIN: CMP WORD PTRDI, 0 ; 與0做比較 JG HIGH ; 大于0,為正數(shù) JE EQUAL ; 等于0 INC BX ; 小于0,為負(fù)數(shù),負(fù)數(shù)個數(shù)增1 JMP NEXT HIGH: INC AX ; 正數(shù)個數(shù)增1 JMP NEXT EQUAL: INC DX ; 0的個數(shù)增1 NEXT: INC DI
7、INC DI LOOP AGAIN,DONE: MOV POST, AX ; 把各類的統(tǒng)計數(shù)保存到內(nèi)存單元中 MOV NEGA, BX MOV ZERO, DX MOV AX, 4C00H ; 結(jié)束程序返回DOS INT 21H CODE ENDS END START,(2) 按問題的條件控制循環(huán),程序段如下: MOV CX,16 ; 16次循環(huán) MOV SI,0 ; SI中存放0的個數(shù) MOV DI,0 ; DI中存放1的個數(shù) MOV AX,VAL AGAIN: SHL AX, 1 JC NOZERO ; 為1,轉(zhuǎn)走 INC SI ; 為0,SI加1 JMP NEXT NOZERO: INC
8、 DI ; 為1,DI加1 NEXT: LOOP AGAIN MOV X, SI MOV Y, DI,4.5.4 字符串處理程序設(shè)計,計算機(jī)經(jīng)常要處理字符,常用的字符編碼是ASCII碼。在使用ASCII碼字符時,要注意以下幾點: (1) ASCII碼的數(shù)字和字符形成一個有序序列。例如數(shù)字09的ASCII碼為30H39H,大寫字母 AZ的ASCII碼為41H5AH等。 (2) 計算機(jī)并不區(qū)分可打印的和不可打印的字符,只有I/O裝置(例如顯示器、打印機(jī))才加以區(qū)分。 (3) 一個I/O裝置只按ASCII碼處理數(shù)據(jù)。例如要打印數(shù)碼7,必須向它送7的ASCII碼37H,而不是響鈴符07H。若按數(shù)字鍵9
9、,鍵盤送至主機(jī)的是9的ASCII碼39H。,(4) 許多ASCII裝置(例如鍵盤、顯示器、打印機(jī)等)并不用整個ASCII字符集。例如,有的忽略了許多控制字符和小寫字母。 (5) 不同的設(shè)備對ASCII控制字符的解釋往往不同,在使用中需要注意。 (6) 一些廣泛使用的控制字符為: 0AH 換行(LF) 0DH回車(CR) 08H退格 7BH刪除字符(DEL) (7) 基本ASCII字符集的編碼為7位,在微型計算機(jī)中就用一個字節(jié)(最高位為零)來表示。,1. 確定字符串的長度 系統(tǒng)中字符串的長度是不固定的。通常以某個特殊字符作為結(jié)束標(biāo)志,例如有的用回車符(CR),有的用字符。在對字符串操作時往往要確
10、定它的長度。 例4-3從頭搜索字符串的結(jié)束標(biāo)志,統(tǒng)計搜索的字符個數(shù),其流程圖如圖4-6所示。,namelength_of_string datasegment stringdbabcduvwxyz, 0dh count equ $ - string lldb? crequ0dh dataends stacksegment parastackstack db100 dup(?) stackends codesegment assumecs:code,ds:data,es:data,ss:stack,Startprocfar begin: pushds movax,0 pushax movax,d
11、ata movds,ax moves,ax leadi, string;設(shè)串的地址指針 movdl,0;置串長度初值為0 moval, cr;串結(jié)束標(biāo)志AL mov cx, count + 10 cld again: scasb;搜索串,jedone;找到結(jié)束標(biāo)志,停止 incdl;串長度加1 dc cx jne again jmperror done: leabx, ll movbx,dl ret error : hlt startendp codeends endbegin,例,將表中數(shù)據(jù)從亂序 25、46 、3 、75 、5 、30 到升序 3 、5 、25 、30 、46 、75,4.
12、5.6 排序,方法一 全比較法 若表數(shù)據(jù)項為 N,要進(jìn)行 N-1 次排序操作 第一次,經(jīng)比較將最小數(shù)放入表頂 第二次,經(jīng)比較將次小數(shù)放入表次頂 . 第N-2次,經(jīng)比較將次大數(shù)放入表次底 第N-1次,經(jīng)比較將最大數(shù)放入表底,注:每次找最小的數(shù)為內(nèi)循環(huán),比較 N 1 次, 共需處理 N 1 次為外循環(huán)。,方法二 標(biāo)志位識別法 設(shè)排序標(biāo)志 F 若標(biāo)志 F = -1 進(jìn)入比較排序程序 (冒泡法) 若標(biāo)志 F = 0 數(shù)己排好,退出比較排序程序 注: 對 N 項數(shù),外循環(huán)次數(shù) N-1,汽泡圖 (從下向上比大?。?原數(shù)據(jù),第一次,第二次,第三次,重排一次,內(nèi) 循 環(huán),外循環(huán),流程圖,標(biāo)志(BL) = -1
13、,開 始,(BL) = 0,結(jié)束,(BL) = 0 標(biāo)志 (CX) = N 1 計數(shù) (SI) = N 1 指針,j-1 j,j-1 j,(BL) = -1,(SI)=(SI)-1 (CX)=(CX)-1,(CX) = 0,Y,Y,Y,數(shù)據(jù)段定義 DAT SEGMENT ;段名 DAT BUF DB 25,46,3,75,5,30 COUNT EQU $ - BUF ;數(shù)據(jù)個數(shù) DAT ENDS,代碼段編程 COD SEGMENT ;段名為 CODE ASSUME CS: COD, DS: DAT SORD PROC FAR ;過程名為 SORD START: PUSH DS MOV AX,
14、0 PUSH AX MOV AX,DAT MOV DS,AX ;過程定義標(biāo)準(zhǔn)寫法,代碼段編程 MOV BL,0FFH ;標(biāo)志( BL ) = -1 AG0:CMP BL,0 ;AG0 為外循環(huán) JZ EXIT MOV BL,0 ;假定此次排序無數(shù)據(jù)交換 MOV CX,COUNT - 1 ;( CX ) = N 1 MOV SI,COUNT - 1 ;SI 指向表底,代碼段編程 AG1:MOV AL, SI ;AG1 為內(nèi)循環(huán) CMP AL, SI - 1 ;兩相鄰單元比較 JAE UNCH ; SI SI-1 不交換 XCHG AL, SI - 1 ; SI-1 SI 交換 MOV SI,AL
15、 ; SISI-1交換 MOV BL,0FFH ; 有交換, 未排好, ; 重排,(BL)= -1 UNCH:,代碼段編程 UNCH:DEC SI ;內(nèi)循環(huán)中下一個相鄰數(shù)比較 DEC CX JNZ AG1 ;一個數(shù)排好(內(nèi)循環(huán)) JMP AG0 ; 所有數(shù)排好(外循環(huán)) EXIT: RET ; 過程返回 SORD ENDP ; 過程結(jié)束 COD ENDS ; 代碼段結(jié)束 END START ; 匯編結(jié)束,5.6.4 子程序設(shè)計,子程序是程序設(shè)計中經(jīng)常使用的程序結(jié)構(gòu),通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計的效率和可靠性。,在主程序與子程序中
16、經(jīng)常要進(jìn)行參數(shù)傳遞。參數(shù)傳遞一般有三種方法: 利用寄存器。這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。 利用存儲單元。主程序把參數(shù)放在公共存儲單元,子程序則從公共存儲單元取得參數(shù)。 利用堆棧。主程序?qū)?shù)壓入堆棧,子程序運行時則從堆棧中取參數(shù)。,DATA SEGMENT NUMBIN DB 0E7H ; 待轉(zhuǎn)換的單字節(jié)二進(jìn)制數(shù) STRING DB 10 DUP(20H) ; 定義顯示緩沖區(qū) DB 0DH, 0AH ; 定義回車換行符 DB $ ; 定義結(jié)束符 DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?
17、) STACK ENDS CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK START PROC FAR,BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA MOV DS, AX ; 置段寄存器初值 LEA DI, STRING XOR AH, AH ; AH清零 MOV AL, NUMBIN MOV BL, 100D DIV BL ; AX除以BL,商在AL中,余數(shù)在AH中 CALL BCDTOASC ; 調(diào)用轉(zhuǎn)換程序,入口參數(shù): ; AL=BCD數(shù) MOV AL, AH ; 取余數(shù)送AL XOR AH, AH,
18、MOV BL, 10D DIV BL CALL BCDTOASC MOV AL, AH CALL BCDTOASC CALL DISPASC ; 調(diào)用顯示程序 RET START ENDP BCDTOASC PROC ; BCD碼到ASCII碼轉(zhuǎn)換程序 ADD AL, 30H MOV DI, AL ; 保存ASCII字符 INC DI ; 指向下一個單元 RET BCDTOASC ENDP,DISPASC PROC ; 顯示子程序 LEA DX, STRING MOV AH, 09H INT 21H RET DISPASC ENDP CODE ENDS END BEGIN,5.5 匯編語言程序
19、與DOS的接口,5.5.1 DOS和BIOS的功能調(diào)用,1DOS系統(tǒng)功能調(diào)用的一般步驟,DOS為磁盤操作系統(tǒng)(Disk Operating System)的簡稱。DOS提供了極為豐富的子程序,能夠?qū)崿F(xiàn)控制鍵盤、顯示器、讀寫文件、串行通信等一系列功能。,使用DOS系統(tǒng)功能調(diào)用的一般過程:見下圖所示。,系統(tǒng)功能調(diào)用的方法,(1)鍵盤輸入 (1號調(diào)用),功能:等待從鍵盤輸入一個字符并將輸入字符的ASCII碼送入寄存器AL中,同時在顯示器上顯示該字符,碰到CTRL+Break則退出。,2DOS系統(tǒng)功能調(diào)用的一般步驟,(2)顯示單個字符 (2號調(diào)用),功能:將DL中的字符送顯示器顯示,若為CTRL+Br
20、eak的ASCII碼則退出。,(3) 顯示字符串 (9號調(diào)用),功能:將當(dāng)前數(shù)據(jù)區(qū)中以 $結(jié)尾的字符串送顯示器顯示。,(4) 鍵盤輸入字符串 (10號調(diào)用),功能:從鍵盤上往指定緩沖區(qū)中輸入字符串并送顯示器顯示。,例1 在CRT上連續(xù)輸出字符09,nameoutput_char_0_9 stacksegmentpara stackstack db100 dup(?) stackends codesegment assumecs: code,ss: stack startprocfar begin: pushds movax,0 pushax movbl,0 pushbx goon: movd1
21、,20h;把空格字符DL movah,2,int21h;輸出空格字符 popbx moval,bl incal daa;增量后進(jìn)行十進(jìn)制調(diào)整 andal,0fh movbl,al pushbx oral,30h;轉(zhuǎn)換為ASCII碼 movd1,al movah,2 int21h;輸出一個09之間的字符 movcx,0ffffh;為便于觀察,插入一定的延時,again:deccx jneagain jmpgoon start endp codeends endbegin,2. 在CRT上連續(xù)顯示0059,nameoutput_char_00_59 stacksegmentpara stackst
22、ack db100 dup(?) stackends datasegment bufferdb3 dup(?) dataends codesegment assumecs: code,ds: data,ss: stack startprocfar begin: pushds movax,0 pushax movax,data,movds,ax movcx,1000;設(shè)置最大的循環(huán)次數(shù) movbl,0 leasi,buffer pushbx goon: movdl,0dh movah,2;輸出回車符 int21h movdl,0ah movah,2 int21h popbx moval,bl,i
23、ncal daa cmpal,60h;AL增加到60了嗎 jcnext;未達(dá)到,轉(zhuǎn)去顯示 moval,0;已到60,置為0 next: movbl,al pushbx movdl,al pushcx movcl,4 shral,cl oral,30h;把AL中十位數(shù),轉(zhuǎn)換為ASCII碼 movsi,al,incsi moval,dl andal,0fh oral,30h;把AL中的個位數(shù),轉(zhuǎn)換為ASCII碼 movsi,al incsi moval, movsi,al movdx,offset buffer movah,9 int21h;輸出字符串 movcx,0ffffh again: de
24、ccx,jneagain popcx deccx jedone movsi,offset buffer jmpgoon done:ret startendp codeends endbegin,1. 宏指令的用途 (1) 在匯編語言的源程序中,若有的程序段要多次使用,為了使在源程序中不重復(fù)書寫這個程序段,可以用一條宏指令來代替。由宏匯編程序在匯編時產(chǎn)生所需要的代碼。,4.6.9 宏匯編,MACRO、ENDM 宏定義偽指令,宏定義 宏調(diào)用,宏名標(biāo)識符 MACRO 宏體 ENDM,宏名標(biāo)識符 ,4.6.9 宏匯編,宏定義偽指令的應(yīng)用,用宏指令代替需要重復(fù)書寫的程序段 具有接收參量的能力 形式參量不
25、僅可出現(xiàn)在操作數(shù)部分,也可以出現(xiàn)在操作碼部分,宏定義偽指令的應(yīng)用,無參數(shù)宏定義及宏調(diào)用 有參數(shù)宏定義及宏調(diào)用,定義: SHIF MACRO MOV CL,4 SHL AX,CL ENDM,調(diào)用: MOV DX,2000H SHIF MOV BX ,AX,定義: SHIF MACRO CN,R MOV CL,CN SHL R,CL ENDM,調(diào)用: MOV DX,2000H SHIF 4,AX SHIF 5,BL MOV BX ,AX,主要宏定義偽指令,(1) MACRO、ENDM,宏名標(biāo)識符 MACRO 宏體 ENDM,(2) PURGE,PURGE 宏名標(biāo)識符,,一個宏定義名,可以用偽指令P
26、URGE來取消,一個PURGE可以取消多個宏定義,主要宏定義偽指令,(3) LOCAL,LOCAL 形參表,宏定義體內(nèi)允許使用標(biāo)號。例如,在AL中有1位十六進(jìn)制數(shù)碼要轉(zhuǎn)換為ASCII碼,則可以用以下宏定義: CHANGE MACRO CMPAL,10 JLADD_0 ADDAL,A-0-10 ADD_0ADDAL,0 ENDM,若在一個程序中多次使用這條宏指令,則在匯編展開時,標(biāo)號ADD_0就會出現(xiàn)重復(fù)定義的錯誤,這是不允許的。 CHANGE MACRO LOCAL ADD_0 CMPAL,10 JLADD_0 ADDAL,A-0-10 ADD_0ADDAL,0 ENDM 注意: LOCAL必須是MACRO偽操作后的第一個語句,MACRO與LOCAL之間不允許有注釋和分號標(biāo)志。,主要宏定義偽指令,(4) REPT,REPT 宏體 ENDM,這個偽指令可以重復(fù)執(zhí)行在它的指令體部分所包含的語句。重復(fù)執(zhí)行的次數(shù),由表達(dá)式的值所決定,功能,例如: 把110分配給十個連續(xù)的存儲單元。 X = 0 REPT10 X = X+1 DBX ENDM 利用這個偽指令可以對某個存儲區(qū)賦值(建立一個表)。,主要宏定
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深度解析(2026)《GBT 34165-2017油氣輸送管道系統(tǒng)節(jié)能監(jiān)測規(guī)范》
- 2026年八年級道德與法治上冊期末考試試卷及答案(三)?
- 博山區(qū)人民醫(yī)院2025年度勞務(wù)派遣制專業(yè)技術(shù)人員招聘備考題庫及1套參考答案詳解
- 云南金江滄源水泥工業(yè)有限公司2026年專業(yè)技術(shù)崗招聘備考題庫及一套完整答案詳解
- 中國鐵路南寧局集團(tuán)有限公司招聘2026年高校畢業(yè)生516人備考題庫完整答案詳解
- 安陽市新一中學(xué)招聘2026屆部屬公費師范生30人備考題庫有答案詳解
- 2026年揭陽市引進(jìn)基層醫(yī)療衛(wèi)生急需緊缺人才招聘備考題庫及一套參考答案詳解
- 2026年德陽市財政會計學(xué)會招聘備考題庫完整參考答案詳解
- 2026年北京協(xié)和醫(yī)院心內(nèi)科合同制科研助理招聘備考題庫及完整答案詳解1套
- 2026年深圳證券交易所人才引進(jìn)備考題庫及參考答案詳解
- 智慧社區(qū)建設(shè)項目施工方案
- 2025版32375電石生產(chǎn)安全技術(shù)規(guī)范
- 供熱管網(wǎng)施工技術(shù)規(guī)范
- 海南檳榔承包協(xié)議書
- 阿扎胞苷課件
- 建筑工程智能防火系統(tǒng)設(shè)計與應(yīng)用考核試卷
- 仿古建筑概念方案設(shè)計說明
- 可持續(xù)采購培訓(xùn)
- 競選村支委演講稿
- DB32-T 1086-2022 高速公路建設(shè)項目檔案管理規(guī)范
- 核心員工留任與薪酬激勵方案
評論
0/150
提交評論