已閱讀5頁,還剩157頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章 匯編語言程序設計,一. EXE文件編程格式 允許源程序使用多個邏輯段,適合編寫大型程序,最 終能生成 .EXE文件,例:將N1和N2兩個單字節(jié)數(shù)以28為模求和SUM單元,5.1 匯編源程序的編程格式,. 486 DATA SEGMENT USE16 N1 DB x x N2 DB x x SUM DB ? DATA ENDS STACK_ SEGMENT STACK STACK USE16 DB 128 DUP (?) STACK_ ENDS,BEG: MOV AX, DATA MOV DS, AX MOV AX,STACK_ MOV SS, AX MOV SP, 128 MOV AL,N1 ADD AL,N2 MOV SUM, AL MOV AH, 4CH INT 21H CODE ENDS END BEG,可省,CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA ,SS:STACK_,說明: . EXE文件中堆棧段的設置 本例以“STACK_”為段名的邏輯段,選用了 “STACK” 鏈接參數(shù),DOS自動認為“ STACK_”段為堆棧段。 所以, DOS將自動給SS:SP賦初值 因此,源程序給SS:SP賦初值的三條語句是多余的。, 鏈接程序要求: . EXE文件中的源程序必須有堆棧段, 否則鏈接時將給出警告信息 Warning no stack segment 但這不代表源程序有錯,僅僅是警告而已, 如果源程序中不設置堆棧段(在鏈接時,會給出錯誤 信息), DOS將自動給程序分配最少128 字節(jié)的堆棧 區(qū),故源程序中,如果沒有大量數(shù)據(jù)壓棧的話,可以不 設置堆棧段,從而簡化程序。,二 . COM文件的編程格式 1. 匯編語言規(guī)定: COM文件的源程序只能有一個段: 代碼段, 不允許 有堆棧段 在代碼段偏移地址=100H處, 必須是程序的啟動指令 程序中使用的數(shù)據(jù)可以放在代碼段的開始或結尾,. 486 . 486 CODE SEGMENT USE16 CODE SEGMENT USE16 ASSUME CS: CODE ASSUME CS: CODE ORG 100H ORG 100H BEG: JMP START BEG: MOV AL, N1 N1 DB XX ADD AL, N2 N2 DB XX MOV SUM, AL SUM DB ? MOV AH, 4CH START: MOV AL, N1 INT 21H ADD AL, N2 N1 DB XX MOV SUM, AL N2 DB XX MOV AH, 4CH SUM DB ? INT 21H CODE ENDS CODE ENDS END BEG END BEG,2. 例: 上例, 寫成COM格式源程序,3. COM文件的生成 設上例的文件名為 N1ADDN2. ASM 編輯生成 N1ADDN2. ASM 調用 TASM. EXE 生成 N1ADDN2. OBJ TASM N1ADDN2 調用 TLINK. EXE 生成 N1ADDN2. COM TLINK N1ADDN2 / t 注意:鏈接參數(shù)為小寫字母 t,三. EXE 文件、COM文件的內存映像,INT 20H,.,數(shù)據(jù)段,代碼段,堆棧段,DS=ES,CS:IP,SS:SP,PSP,用戶程序,EXE文件內存映像,EXE文件的內存映像 DOS把EXE文件調入 內存之后,自動在目標程 序上方(低地址處)生成一 個有256字節(jié)的數(shù)據(jù)塊 程序段前綴(PSP) DOS令 DS=ES=PSP段基址, 即DS用戶數(shù)據(jù)段段基址, ES用戶附加段段基址 DOS令CS:IP=代碼段啟 動指令的邏輯地址,三. EXE 文件、COM文件的內存映像,INT 20H,.,數(shù)據(jù)段,代碼段,堆棧段,DS=ES,CS:IP,SS:SP,PSP,用戶程序,EXE文件內存映像,EXE文件的內存映像 DOS令SS:SP=用戶堆 棧段(如果有堆棧段的話) 棧頂?shù)倪壿嫷刂?所以: 用戶程序必須給DS賦 值,使DS=用戶數(shù)據(jù)段段 基址;用戶程序必須給 ES賦值,使ES=用戶附加 段段基址 FS=GS=0,如果用戶程 序使用了FS、GS附加段, 則必須給FS、GS賦初值,三. EXE 文件、COM文件的內存映像,INT 20H,.,代碼段,堆棧段,00 H,00 H,CS=DS =ES=SS,IP=100H,SP,PSP,64K-256,COM文件內存映像,2. COM文件內存映像 COM文件調入內存后,DOS也在其上方生成一個PSP CS=DS=SS=ES=PSP段基址,即用戶程序的代碼段、數(shù)據(jù)段、ES附加段和堆棧區(qū)都在一個64k的邏輯段中 DOS自動使IP=100H,自動執(zhí)行偏移地址為100H處的那條指令,三. EXE 文件、COM文件的內存映像,INT 20H,.,代碼段,堆棧段,00 H,00 H,CS=DS =ES=SS,IP=100H,SP,PSP,64K-256,COM文件內存映像,2. COM文件內存映像 DOS自動使SP=FFFEH,且SS:SP=SS:SP+1=0,這就意味在COM文件中代碼段以下,FFFEH以上這一片存儲單元都是用戶的堆棧區(qū) FS=GS=0,四.程序段前綴 PSP PSP是一個有256字節(jié)的數(shù)據(jù)塊,由DOS在裝載可執(zhí)行文件時自動生成。DOS通過PSP向用戶程序傳遞數(shù)據(jù),PSP是程序運行不可缺少的部分 每一個可執(zhí)行文件都伴隨有自己的PSP,五. 返回DOS的基本方法 對于EXE文件和COM文件,返回DOS最常用的方法 是調用“INT 21H ”的4CH功能。除此之外: 1.對于COM文件還有以下3種方法可以返回DOS,即: 直接執(zhí)行INT 20H;, 調用INT 21H的0號功能; 執(zhí)行RET指令。如果此時SP仍然等于FFFEH的話 (程序中規(guī)范的使用堆棧,在執(zhí)行RET之前把進棧的 數(shù)據(jù)全部彈出,則SP必然等于FFFEH),CPU將無條件 轉入PSP的首單元,執(zhí)行那里的INT 20H,返回DOS。 2. 對于EXE文件的編程格式,還有一種返回DOS的方法, 就是在需要返回DOS的時候,設法使CPU轉到PSP首 單元,執(zhí)行那里的INT 20指令。為此,源程序必須采取 下面的3項措施,缺一不可: 把代碼段包含在一個遠過程之中; 在給DS賦初值之前,用下列3條指令把PSP首單元的 物理地址壓入棧頂,即:,PUSH DS MOV AX, 0 PUSH AX 在采取了以上兩條措施之后,程序在需要返回DOS的地 方執(zhí)行一條RET指令即可返回DOS。因為這條RET指令 是遠過程中的返回指令,它將從棧頂彈出4個字節(jié),即把 PSP首單元的物理地址反彈到CS:IP之中,從而使CPU轉 移到PSP首單元,執(zhí)行那里的INT 20H,再返回DOS。 綜上所述,雖然返回DOS有好幾種方法,但是調用 INT 21H 的4CH功能,是返回DOS的最常用的方法,它的 優(yōu)點是簡單、通用,而且有利于組織批處理文件。,BIOS/DOS調用模式: MOV AH,功能號 設置入口參數(shù) INT n 分析出口參數(shù),BIOS/DOS功能調用,子程序調用結束后一般都有出口參數(shù),這些出口參數(shù)常放在寄存器中,通過出口參數(shù)可以知道功能調用的成功與否。,其中n值因子程序不同而可能不同,比如:ROM BIOS有n=51FH,DOS有n=20H,21H,232AH,2EH,2FH,33H和67H等幾種情況。有的n只對應一個子程序,有的n對應很多子程序,,.2 DOS系統(tǒng)I/O功能調用,在DOS功能子程序調用中,我們把通過INT21H來實現(xiàn)的子程序調用成為DOS系統(tǒng)功能調用。,調用模式: MOV AH,功能號 設置入口參數(shù) INT 21H 分析出口參數(shù),功能號01H 等待鍵入一個字符,有回顯,響應Ctrl_C 入口參數(shù): 無。 出口參數(shù): AL=按鍵的ASC碼,若AL=0,表明按鍵是功 能鍵、光標鍵,需再次調用此功能,才能返回按鍵的擴 展碼。,功能號02H 顯示一個字符, 響應Ctrl_C 入口參數(shù): DL=待顯字符的ASC碼。 出口參數(shù):無。 本功能在屏幕的當前位置顯示一個字符,光標右移一 格,如果是在一行末尾顯示字符,則光標返回下一行的開 始格。如果是在屏幕的右下角顯示字符,光標返回時屏 幕 要上滾一行。試驗表明,該項功能要破壞AL寄存器的 內容。 功能號07H 等待鍵入一個字符,無回顯,不響應Ctrl_C。 入口參數(shù):無。 出口參數(shù): AL=按鍵的ASC碼,若AL,需再次調用 該功能才能在AL中得到按鍵的擴展碼。,功能號09H 顯示字符串,響應Ctrl_C。 入口參數(shù): DS:DX=字符串首地址,字符串必須以$ (即ASC碼24H)為結束標志。 出口參數(shù): 無。 該項功能從屏幕當前位置開始,顯示字符串,遇到結束標 志$時停止,$字符并不顯示。實驗表明,9號功能也破 壞AL寄存器的內容。,功能號08H 等待鍵入一個字符,無回顯,響應Ctrl_C。 入口參數(shù): 無。 出口參數(shù): AL=按鍵的ASC碼,若AL0,需再次調用 該功能才能在AL中得到按鍵的擴展碼。,功能號0AH 等待鍵入一串字符,送用戶程序數(shù)據(jù)緩沖區(qū) 入口參數(shù)、出口參數(shù)如圖所示。, 0AH要求鍵入的字符串以“回車”作為結束標志,換句話說,按下回車鍵后,此功能調用結束,光標返回當前行始格?!盎剀嚒狈粼诰彌_區(qū)當中。 對數(shù)據(jù)緩沖區(qū)的格式有如下要求: 緩沖區(qū)要設置在用戶程序數(shù)據(jù)段,調用前,緩沖區(qū)首址偏移量應賦給DX寄存器。 緩沖區(qū)首單元應預置“允許接受的字符個數(shù)”(包括回車符在內)。 用戶鍵入回車后,由0AH功能把實際鍵入的字符個數(shù) (不包括回車符)寫入BUF+1單元。 鍵入的字符串從BUF+2單元開始依次存放。 因此,緩沖區(qū)的容量要大于或等于鍵入串的長度+2(注意:鍵入的字符串長度應包括回車符) 。 緩沖區(qū)不接受超長字符,并發(fā)出聲響以示警告, 0AH在接收字符的過程中,有回顯,響應Ctrl_C,按下退 格鍵可刪除屏幕及緩沖區(qū)中的當前字符。 下面的程序段給出了0AH功能調用的示范,它允許用戶 鍵入15個字符(包括回車鍵)。 假設 數(shù)據(jù)段 BUF DB 15 DB ? DB 15 DUP(?) 代碼段 . MOV AH, 0AH MOV DX, OFFSET BUF INT 21H .,功能號0CH清除鍵盤緩沖區(qū),然后調用由AL指定的功能。 入口參數(shù): AL允許是: 01H 鍵入一個字符,有回顯,響應Ctrl_C。 06H 字符 I/O。 07H 鍵入一個字符,無回顯,不響應Ctrl_C。 08H 鍵入一個字符,無回顯,響應Ctrl_C。 0AH 鍵入一串字符,寫入用戶數(shù)據(jù)區(qū)。 其他入口參數(shù)應根據(jù)相關的功能,另行設置。,功能號4CH 該功能是指,終止當前程序的運行,并 把控制權交給調用它的程序。由被終止程序打開的全 部文件都被關閉,該項功能還把程序占用的內存空間 交還給DOS另行分配。該項功能允許被終止的程序傳 送一個“返回碼”給調用它的程序。假若被終止的程序 是由DOS 命令調入的,那么返回碼可以被DOS批處理 命令中的“ IF ERRORLEVEL ”子命令識別。 入口參數(shù): AL=返回碼(或者不設置)。 出口參數(shù): 無。 說明:當用戶程序執(zhí)行1,2,8,9,0AH,0BH,OCH功能調用 時,如果鍵入Ctrl_C或者Ctrl_Break,DOS將自動調用INT 23H中斷處理程序,從而強行使用戶程序中斷,我們稱 為響應Ctrl_C。,例: 人機會話程序。 問題: 如何設置程序運行所需的數(shù)據(jù)?有以下幾種方法 數(shù)據(jù)設置在程序的數(shù)據(jù)段 程序運行時通過人機會話臨時鍵入 程序裝入時通過命令行參數(shù)給出 本例學習前兩種方法,并以此學習DOS功能調用。,Li mai?(Y/N),What is your name?,1.會話內容及設計思路,Li nai ;前者是程序給出的詢問信息, 后者是用戶鍵入的回答,N ;程序復制的姓名和回答提示,Li mai ;再次問答,Li nai?(Y/N),What is your name?,Y,2. 框圖:,N,DATA SEGMENT USE16 MESG1 DB 0DH,0AH DB What is your name ?$ MESG2 DB ?(Y/N)$ BUF DB 30 DB ? DB 30 DUP(? ) DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DA:DATA BEG: MOV AX,DATA MOV DS,AX AGAIN: MOV AH,9 MOV DX,OFFSET MESG1 INT 21H ;詢問姓名 MOV AH,0AH MOV DX,OFFSET BUF INT 21H ;接收鍵入字符串 MOV BL,BUF+1 MOV BH,0,. 486,;實際鍵入的字符個數(shù)BX MOV SI,OFFSET BUF+2 MOV BYTE PTRBX+SI,$ ;用 $作為串結束符 MOV AH,2 MOV DL,0AH INT 21H ;光標下移一行 MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H ;復制鍵入的字符串 MOV AH,9 MOV DX,OFFSET MESG2 INT 21H ;給出認可信息 MOV AH,1 INT 21H ;等待鍵入 CMP AL,Y;比較 JNE AGAIN MOV AH,4CH INT 21H ;返回 DOS CODE ENDS END BEG,.3 BIOS鍵盤輸入功能調用,主板EPROM中固化有基本I/O系統(tǒng)程序BIOS,它是最接近硬件的驅動程序,BIOS中的許多子程序可被用戶程序調用,調用這些子程序稱為BIOS功能調用。,調用模式: MOV AH,功能號 設置入口參數(shù) INT 16H 分析出口參數(shù),BIOS常用的鍵盤輸入功能調用如下:(調用指令INT 16H) 功能號00H讀取鍵入的一個字符,無回顯,響應Ctrl_C, 無鍵入則等待。 入口參數(shù): 無。 出口參數(shù): AL=鍵入字符的ASCII碼. 若AL=0,則AH=輸入鍵的擴展碼。,功能號01H 查詢鍵盤緩沖區(qū)。 入口參數(shù): 無。 出口參數(shù): Z標志=0,表示有鍵入,此時AL=鍵入字符的碼, AH=鍵入字符的擴展碼。 注意: 該功能調用結束后,鍵代碼仍留在鍵盤緩沖區(qū)中。 Z標志=1,表示無鍵入。,功能號02H 讀取當前轉換鍵狀態(tài)。 入口參數(shù): 無。 出口參數(shù): AL=鍵盤狀態(tài)字。狀態(tài)字各位定義如下: AL7位置1 表示Insert鍵有效(被奇數(shù)次按下)。 AL6位置1 表示Caps Lock鍵有效(相應的指示燈亮)。 AL5位置1 表示Num Lock鍵有效(相應的指示燈亮)。 AL4位置1 表示Scroll Lock鍵有效(相應的指示燈亮)。 AL3位置1 表示按下了Alt鍵。 AL2位置1 表示按下了Ctrl鍵。 AL1位置1 表示按下了左Shift鍵。 AL0位置1 表示按下了右Shift鍵。,功能號10H 讀擴展鍵盤,無回顯,響應Ctrl_C。 入口參數(shù): 無。 出口參數(shù): AL=鍵入字符的ASC碼, 若AL=0,則AH=鍵入字符的擴展碼。 功能號11H 查詢擴展鍵盤緩沖區(qū)。 入口參數(shù): 無。 出口參數(shù): Z標志=0,表示有鍵入,此時AL=鍵入字符的ASC碼, AH=鍵入字符的擴展碼。 注意: 該功能調用結束后,鍵代碼仍留在鍵盤緩沖區(qū)中。 Z標志=1,表示無鍵入。,功能號12H讀取擴展鍵盤的轉換鍵狀態(tài)。 入口參數(shù): 無。 出口參數(shù): AL=擴展鍵盤狀態(tài)字, AL7 AL0的置位條 件同功能號02H。,例如: SCAN: MOV AH ,1 INT 16H JZ SCAN MOV AH,0 INT 16H ;按鍵的鍵代碼AL,.4 CRT顯示器與BIOS文本顯示功能調用,顯示器是輸出設備,顯示適配器是CRT與主機的接口電路,CRT和CRT適配器共同組成了顯示系統(tǒng),文本方式: 顯示數(shù)字 ,字符 圖形方式: 顯示點,由點(像點)組成圖形,2.顯示存儲區(qū)與顯示屏,單顯8025 文本方式,彩顯8025文本方式,0頁,1頁,2頁,3頁,B000,B800,B900,BA00,BB00,ASC碼,屬性,.,ASC碼,屬性,:0000 :0001,:0F9E :0F9F,079列,024行,顯示存儲區(qū)與屏幕字符的對應關系, 顯示存儲區(qū)是系統(tǒng)RAM的一部分,其中存放待顯字符 的 ASC碼和它的屬性字。 工作在8025文本方式下,屏幕被“劃分”為2000個“方 格”,每一個方格顯示一個“點陣字符”,列號0 79,行號 0 24。 顯示器一個小方格對應顯示存儲區(qū)的兩個單元,所以 2000個方格對應4000個單元。 彩顯適配器,文本顯示存儲區(qū)有16K,分為4頁(0 3) 段基址為 B800H,B900H,BA00H,BB00H。,3.當前頁 系統(tǒng)啟動時,BIOS自動完成顯示適配器的初始化,顯示器自動工作在8025黑白文本方式,并且默認第0頁為“當前頁”。CRT控制器按50屏/秒的速度從0頁 顯示區(qū)取字符屏幕顯示,重復不斷,故能收到穩(wěn)定顯 示的效果。 調用5#功能,可以選擇其他顯示存儲區(qū)(1 3)為“當前頁”。,4.文本方式屬性字 彩顯屬性字:,5. 屏顯的編程方法 DOS功能調用(如:2#,9#) BIOS功能調用(0EH#,13H#) 直接對顯示存儲區(qū)進行寫操作,6. BIOS屏顯功能調用的調用模式 MOV AH, 功能號 預置入口參數(shù) INT 10H 分析出口參數(shù),7.文本方式BIOS屏顯子功能 調用指令INT 10H。 功能號00H 設置屏幕顯示方式(兼有清屏功能) 入口參數(shù): AL=0 4025 黑白文本方式 AL=1 4025 彩色文本方式 AL=2 8025 黑白文本方式 AL=3 8025 彩色文本方式 出口參數(shù): 無。,功能號02H 預置光標位置。 入口參數(shù): BH=顯示頁號,DH=行號,DL=列號。 出口參數(shù): 無。 功能號05H 設置當前顯示頁。 入口參數(shù): AL=顯示存儲器頁號(在80 列方式中為03)。 出口參數(shù): 在屏幕上顯示出指定顯示頁的字符(只對文 本方式有效)。,功能號06H 窗口上滾。 入口參數(shù): AL=窗口上滾的行數(shù), BH=底部空白行屬性字, CH、CL=窗口左上角的行、列號, DH、DL =窗口右下角的行、列號。 出口參數(shù): 無。 說明: 該功能允許在屏幕上定義一個窗口,并使窗口信息上 滾AL行。 窗口是屏幕上一個局部的顯示框,窗口上滾一行,即:窗 口頂部信息移出窗口之外而消失,窗口底部自動留出一 行空白,底部空白行的屬性由BH中屬性字決定。 若AL =0,則窗口信息全部移出。,功能號0EH 顯示一個字符。 入口參數(shù): AL=待顯字符的ASC碼。 出口參數(shù): 無。 說明: 該功能在光標的當前位置顯示一個字符,隨后光標 前進一格,滿一行后自動換行,滿一頁則整屏信息上滾一 行。與DOS系統(tǒng)的2號功能調用具有相同的效果。,功能號13H 顯示字符串。 入口參數(shù): AL=03, BH=顯示頁號, BL=屬性字(當AL=0,1時有效), CX=串長度, DH,DL=字符串顯示的起始行、列號, ES:BP=待顯字符串首地址。 出口參數(shù): 無。,說明: 僅286以上微機BIOS有此功能,該功能從屏幕的指定 位置開始顯示一串彩色字符。 待顯字符串需放在附加段,首地址偏移量需寫入BP寄 存器 。 AL=0表示: 待顯字符串中僅包含字符的ASC碼,串中 各字符的屬性由BL中的屬性字決定,串顯示結束后,光 標返回到調用前的位置。 AL=1表示: 待顯字符串中僅包含字符的ASC碼,串中 各字符的屬性由BL中的屬性字決定,串顯示結束后,光 標停留在字符串的末尾。,AL=2表示: 待顯字符串中包含有各個字符的ASC碼 和屬性字,格式為ASC碼,屬性, , ASC碼,屬性。 串顯示結束后,光標返回到調用前的位置。 AL=3表示: 待顯字符串中包含有各個字符的ASC碼 和屬性字,格式同上,串顯示結束后,光標停留在字符串 的末尾。 當AL選擇2或3的時候,CX中的串長度不包括各字符的 屬性字節(jié)。,8.什么是“窗口上滾”? 窗口:屏幕上任意位置的一個巨型區(qū)域稱為一個“窗口” 號功能可以在屏幕上定義一個窗口,并使窗口中 的信息向上“平移”若干行,這稱為“窗口上滾”,上滾后頂 部行信息移出窗口而消失,底部留出一空白行,空白行的 屬性可由用戶選擇。,注意:13H功能是唯一能顯示彩色字符的子功能 例:在屏幕左上角顯示HELLO 黑底灰白字符 在屏幕中央顯示 I AM A STUDENT 紅底白字,思路: 顯示HELLO,用DOS功能# 要求待顯字符串放在數(shù)據(jù)段,串尾用$作結束符, 顯示I AM A STUDENT,用 BIOS 13H 功能 它要求待顯字符串在附加段 這意味著源程序至少要有三個邏輯段,我們令數(shù)據(jù) 段與附加段“重疊”,這樣源程序僅設置兩個邏輯段 即可。,. 486 DATA SEGMENT USE16 MESG1 DB HELLO $ MESG2 DB I AM A STUDENT LL = $MESG2 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE ASSUME DS:DATA ASSUME ES:DATA BEG: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, 0003H INT 10H,MOV AH, 9 MOV DX,OFFSET MESG1 INT 21H MOV AX, 1301H MOV BH, 0 MOV BL, 01001111B MOV CX, LL MOV DH,12 MOV DL, (80-LL)/2 MOV BP, OFFSET MESG2 INT 10H MOV AH, 4CH INT 21H CODE ENDS END BEG,5.5 分支程序,例. 二進制數(shù)顯示 將BX寄存器中的內容以二進制數(shù)格式屏顯, DOS功能調用 BIOS功能調用: (本例令BX=5678H),1,數(shù)BX,16次CX,C標=?,1AL,調BIOS.0EH CX-1CX,CX=0,0AL BX左移一位,0,N,Y,返DOS,解: 486 CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H MOV CX,16 LAST: MOV AL,0 ROL BX,1 JNC NEXT MOV AL,1 NEXT: MOV AH,0EH INT 10H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG,例. 復合分支舉例(書例自學) 某科室9人,統(tǒng)計月收入在800900間的人數(shù),并用十進制數(shù)顯示。,解:月收入是無符號數(shù),對一批數(shù)處理應該用間址。,解: 486 DATA SEGMENT USE16 NUM DW XX,XX DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV BX,OFFSET NUM MOV CL,9 MOV DL,0 LAST: CMP WORD PTR BX,800 JC NEXT ;800時轉 CMP WORD PTR BX,900,JA NEXT;900轉 INC DL NEXT: INC BX INC BX DEC CL JNZ LAST ADD DL,30H ;DL=09ASC碼 MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG,例.多分支段內轉移 要求:鍵入0,轉P0程序段 鍵入1,轉P1程序段 鍵入9,轉P9程序段,思路:用比較指令配合直接轉移指令實現(xiàn) CMP 鍵入字符,0 JE P0 CMP 鍵入字符,1 JE P1 ,用轉移地址表配合間接轉移指令實現(xiàn),解: 486 DATA SEGMENT USE16 TAB DW P0,P1,P9 ;匯編后自動裝入相應的偏移地址 MESG DB 0DH,0AH,strike 09:$ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX AGA: MOV AH,9 MOV DX,OFFSET MESG INT 21H MOV AH,1 INT 21H CMP AL,0 JC AGA,CMP AL,9 JA AGA SUB AL,30H MOVZX BX,AL ADD BX,BX;2BXBX MOV SI,OFFSET TAB JMP BX+SI ;DS:BX+SI IP P0: P1: P9: CODE ENDS END BEG,1. 循環(huán)程序的結構,5.6 循環(huán)程序,2.結束循環(huán)的技巧(編程技巧) 用寄存器做循環(huán)計數(shù)器 用內存單元做循環(huán)計數(shù)器 用循環(huán)結束標志結束循環(huán),例.設從BUF單元開始,存有若干字節(jié)的ASC碼,找出其中的最大數(shù)屏幕顯示。 思路:ASC碼數(shù)為無符號數(shù),無符號數(shù)的最小數(shù)為0,Y,N,N,數(shù)據(jù)區(qū)首址DS:BX 無符號最小數(shù)AL 數(shù)據(jù)個數(shù)CX,BX AL,BX=AL?,BX+1 BX CX-1 CX,顯示結果 返回DOS,CX=0?,Y,解法1 486 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $ -BUF;統(tǒng)計串長度 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ù) 0 AL LEA BX,BUF ;串首址偏移量BX MOV CX,COUNT ;串長度CX,LAST: CMP BX,AL;比較 JC NEXT MOV AL,BX;大數(shù)AL NEXT: INC BX LOOP LAST ;循環(huán)計數(shù) MOV MAX+4,AL ;最大數(shù)MAX+4 單元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;顯示結果 MOV AH,4CH INT 21H ;返回 DOS CODE ENDS END BEG,解法2 486 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ù) 0 AL LEA BX,BUF ;串首址偏移量BX LAST: CMP BYTE PTR BX, -1 ;BX=串結束標志 ?,JE DISP ;是,轉 CMP BX,AL JC NEXT MOV AL,BX ;大數(shù)AL NEXT: INC BX JMP LAST DISP: MOV MAX+4,AL ;最大數(shù)MAX+4 單元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;顯示結果 MOV AH,4CH INT 21H ;返回 DOS CODE ENDS END BEG,5.7 子程序及其調用,子程序是相對獨立的程序,當程序中要多次完成某一操作時,為了簡化整體程序,增強程序可讀性,常常把“完成某一操作”設計成一個子程序,供調用。,向子程序傳遞參數(shù)的方法 通過寄存器傳遞參數(shù) 利用堆棧區(qū)傳遞參數(shù) 利用內存單元傳遞參數(shù),子程序用PROC/ENDP定界,子程序分為:段內子程序、段間子程序、無參數(shù)子程序、有參數(shù)子程序,例.無參數(shù)子程序,CODE SEGMENT CALL CRLF CALL CRLF ,CRLF PROC MOV AH,2 MOV DL,0DH INT 21H MOV AH,2 MOV DL,0AH INT 21H RET CRLF ENDP CODE ENDS,例.用寄存器傳遞參數(shù),數(shù)據(jù)段:MESG1 DB Please Enter 09:$ MESG2 DB Strike any key,0DH,0AH,$,例.設N1=1122H,N2=3344H,N3=5566H 用子程序調用的方法實現(xiàn)3個數(shù)的累加和,解法1: 編程技巧:把數(shù)據(jù)單元的偏移地址傳送給計算累 加和的子程序,CODE SEGMENT USE16 ASSUME CS:CODE ASSUME DS:DATA,SS:STACK_ BEG: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;參數(shù)指針SI CALL COMPUTE XYZ: CALL DISP EXIT: MOV AH,4CH INT 21H ;- COMPUTE PROC MOV BX,0 ADD BX,SI+0 ;BX+N1BX ADD BX,SI+2 ;BX+N2BX ADD BX,SI+4 ;BX+N3BX,RET ;返斷點XYZ COMPUTE ENDP ;- DISP PROC;顯示BX內容 MOV CX,16 LAST: MOV DL,0 RCL BX,1 JNC NEXT MOV DL,1 NEXT: MOV AH,2 INT 21H LOOP LAST RET ;返斷點EXIT DISP ENDP CODE ENDS END BEG,解法2: 編程技巧:調用前先把數(shù)據(jù)壓棧,計算累加和的子程序從堆棧中取數(shù),完成累加和。,BEG: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM ;N1 ,N2,N3壓棧 PUSH WORD PTR SI+0 PUSH WORD PTR SI+2 PUSH WORD PTR SI+4 CALL COMPUTE XYZ: CALL DISP EXIT: MOV AH,4CH INT 21H ;- COMPUTE PROC MOV BP,SP ;棧針BP MOV BX,0 ADD BX,BP+2 ;BX+N3BX ADD BX,BP+4 ;BX+N2BX ADD BX,BP+6 ;BX+N1BX,RET 6 ;返斷點XYZ,清棧 COMPUTE ENDP ;- DISP PROC ;顯示BX內容 MOV CX,16 LAST: MOV DL,0 RCL BX,1 ADC DL,0 MOV AH,2 INT 21H LOOP LAST RET ;返斷點EXIT DISP ENDP CODE ENDS END BEG,解法3: 編程技巧:數(shù)據(jù)放在代碼段,利用內存單元傳遞數(shù)據(jù),COMPUTE PROC MOV BP,SP ;棧針BP ;斷口地址NUMSI MOV SI,BP+0 MOV BX,0 ;BX+N1BX ADD BX,CS:SI+0 ;BX+N2BX ADD BX,CS:SI+2 ;BX+N3BX ADD BX,CS:SI+4 ;彈出原來的斷口地址 POP AX MOV AX,OFFSET XYZ PUSH AX RET ;返回斷點XYZ COMPUTE ENDP,;顯示BX內容 DISP PROC MOV CX,16 LAST: MOV AL,0 RCL BX,1 ADC AL,0 MOV AH,0EH INT 10H LOOP LAST ;返回斷點EXIT RET DISP ENDP CODE ENDS END BEG,6.8 宏指令與條件匯編,子程序調用可以簡化程序,但是如果子程序的參數(shù)太多,調用時太麻煩,匯編語言提供了另一種簡化的途徑宏指令。,宏指令是匯編語言提供的偽指令! 是用戶自行定義的若干指令的集合,宏指令有:無參數(shù)宏指令、有參數(shù)宏指令,宏指令應該先定義后調用”“,宏指令的定義,可以不在任何邏輯段之中,習慣 上放在源程序首部,1.宏定義語句的格式: 宏指令名字 MACRO 宏體 ENDM,一.無參數(shù)宏指令的定義與調用:,2.宏指令調用: 宏指令先行定義之后,在代碼段的任何位置, 書寫“宏指令名字”即完成了調用。,3.宏指令的“匯編”: 匯編時,匯編程序自動用宏體取代宏調用。,例: 486 CRLF MACRO ;實現(xiàn)回車換行 MOV AH,0EH MOV AL,0DH INT 10H MOV AL,0AH INT 10H ENDM CODE SEGMENT USE16 ASSUME CS:CODE BEG: MOV AH,2 MOV DL,A INT 21H CRLF ,匯編時,自動用宏體替換宏指令拷貝一份到這兒,二.有參數(shù)的宏指令及其調用 格式: 宏指令名字 MACRO 用逗號(或空格)間隔的啞元表 宏體 ENDM,調用格式: 宏指令名字 實元表,注意: 實元表是一串用逗號(或空格)間隔的立即數(shù), 寄存器操作數(shù)或者是沒有PTR說明符的存儲器操作數(shù)。 匯編時,匯編程序自動地把實元一一對應的賦給 啞元。,例.定位顯示彩色字符串 要求置顯示器為彩色文本方式,并在: 0行5列 顯示 黑底綠色 HELLO 12行36列 顯示 黑底紅色 WELCOME! 24行66列 顯示 黑底黃色 BYE_BYE,解: . 486 DISP MACRO Y, X, VAR, LENGTH, COLOR MOV AH,13H MOV AL,1 MOV BH,0 ;選擇0頁顯示屏 MOV BL,COLOR ;屬性字(顏色值) BL MOV CX,LENGTH ;串長度 CX MOV DH,Y ;行號 DH MOV DL,X ;列號 DL MOV BP,OFFSET VAR ;串有效地址BP INT 10H ENDM,EDATA SEGMENT USE16 SS1 DB HELLO SS2 DB WELCOME ! SS3 DB BYE_BYE EDATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,ES:EDATA MOV AX,EDATA MOV ES,AX MOV AX,3 INT 10H DISP 0, 5, SS1, 5, 2 ;0行5列顯示綠色HELLO,DISP 12, 36, SS2, 8, 4 ;12行36列顯示紅色WELCOME DISP 24, 66, SS3, 7, 0EH ;24行66列顯示黃色BYE_BYE SCAN: MOV AH,1 INT 16H JZ SCAN ;等待用戶鍵入,無鍵入轉 MOV AX,2 INT 10H ;恢復8025黑白文本方式 MOV AH,4CH INT 21H CODE ENDS END BEG,分析: BIOS INT 10H的13H子功能,要求待顯字符串在附加段,串首址ES:BP 對啞參數(shù)的賦值是在調用指令中完成的 子程序調用能減小目標程序的體積,而宏指令調用則不能減小目標程序的體積 宏指令可以嵌套,三.LOCAL偽指令 如果宏體中有分支、轉移,則必然有標號,2次以上調用這樣的宏體,就會出現(xiàn)標號重復定義的錯誤,為此匯編語言又提供了一條LOCAL偽指令。,應用: 用LOCAL定義的標號稱為“局部標號”,它是宏體中所有標號的集合。局部標號可以和代碼段中其他標號重名。 宏指令僅被調用1次時,不必使用LOCAL偽指令。,例.分組顯示8,16,32 位二進制數(shù),解: . 486 CRLF MACRO ;光標返回下一行始格 MOV AH,0EH MOV AL,0DH INT 10H MOV AL,0AH INT 10H ENDM,格式:LOCAL 用逗號間隔的標號名,;分組顯示VAR中的NN位 二進制數(shù) DISP MACRO VAR,NN LOCAL L1, L2 MOV CH,NN/4 L1: MOV CL,4 L2: MOV AL, 0 ROL VAR,1 ADC AL,0 MOV AH,0EH INT 10H DEC CL JNZ L2 MOV AL, INT 10H DEC CH JNZ L1 CRLF ENDM,CODE SEGMENT USE16 ASSUME CS:CODE NUM DB 88H BEG: MOV EBX,12345678H DISP BH,8 ;顯示BH中的8位數(shù) DISP BX,16 ;顯示BX中的16位數(shù) DISP EBX,32 ;顯示EBX中的32位數(shù) DISP NUM,8 ;顯示NUM單元中的8位數(shù) MOV AH,4CH INT 21H CODE ENDS END BEG,四.條件匯編語句: 條件匯編是匯編語言提供的偽指令、偽語句。高版本的匯編語言提供了許多格式的條件語句,此處僅介紹最常用、最基本的格式。,格式1:IF 條件 指令集合1 ELSE 指令集合2 ENDIF,格式2: IF 條件 指令集合 ENDIF,說明:IF/ENDIF是一對定界語句,“條件”為邏輯表達式或關系表達式。,格式1功能:如果條件成立,匯編指令集合1; 如果不成立,匯編指令集合2。 格式2功能:如果條件成立,匯編指令集合, 否則不匯編。,A,6.9 代碼轉換,常見的代碼轉換有: 二進制數(shù)顯示,二進制數(shù)十進制數(shù)顯示, 二進制數(shù)十六進制數(shù)顯示,BCD碼數(shù)二進制數(shù),Please Enter,Please Enter,9,=00001001B,思路: 鍵盤緩沖區(qū)中是鍵入字符的ASC碼。 09的ASC碼為30H39H。 二進制數(shù)每一位代碼的判斷:,本程序采用兩種格式設計源程序: 一種是EXE文件編程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年DevOps工程師實踐操作考核指南試題沖刺卷
- 2025年文物鑒定與年代測定技能測驗試卷
- 2026年獸醫(yī)公共衛(wèi)生應急考核試題及答案
- 北京師范大學出版社2026年初中歷史人物評價試題
- 中考生物試卷解析與知識點考點梳理
- 2026年武漢市物理學科實驗操作考核要求試卷
- 商會年度工作總結與發(fā)展規(guī)劃
- 2025年醫(yī)師結業(yè)理論考試模擬題試題及真題
- 高一化學必修一金屬知識點總結
- 2026年法律行業(yè)律師實務能力評價試卷及答案
- DB3401∕T 242-2022 孤獨癥兒童康復服務規(guī)范
- 正念認知療法實證研究-洞察及研究
- GJB2489A2023航空機載設備履歷本及產品合格證編制要求
- 2025年云南省中考英語試卷真題(含標準答案及解析)
- 海運集貨倉庫管理制度
- 熱點話題18 航天新征程:神舟二十號引領科技創(chuàng)新與傳統(tǒng)突破-2025年高考語文作文主題預測+素材+模擬范文
- 2024年3月浙江省高中生物競賽試卷 含解析
- DBJ50-T-274-2017 重慶市軌道交通客運服務標志標準
- 五年級數(shù)學(小數(shù)除法)計算題專項練習及答案匯編
- 人教版八年級下冊物理期末考試試卷含答案
- 妊娠期乳腺癌護理
評論
0/150
提交評論