版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第六章微型計算機程序設(shè)計第一頁,共一百二十四頁,編輯于2023年,星期四匯編語言程序舉例查找關(guān)鍵字
第二頁,共一百二十四頁,編輯于2023年,星期四過程定義偽操作
格式
過程名PROC類型、、、過程名ENDP過程定義由偽操作PROC開始、ENDP結(jié)束。其中:PROC和ENDP必須成對出現(xiàn),且語句前必須有過程名,過程名必須相同。PROC和ENDP語句之間為子程的指令序列。程序中可以定義多個過程。程序經(jīng)匯編、連接及裝入內(nèi)存后,過程名為一具體的內(nèi)存地址,指示子程入口。第三頁,共一百二十四頁,編輯于2023年,星期四過程名常用作CALL調(diào)用指令的操作數(shù),
子程的最后安排RET返回指令,使執(zhí)行完子程后能返回調(diào)用處。過程有兩種類型:NEAR和FAR
無類型項時,默認為NEAR類型。當(dāng)過程與調(diào)用指令不在同一段時,應(yīng)將過程定義為FAR類型。過程類型決定子程中RET的返回類型第四頁,共一百二十四頁,編輯于2023年,星期四例1displayPROC、、、、C3H
、、RET;NEAR屬性的過程對應(yīng)段內(nèi)返回displayENDP例2displayPROCFAR、、、、CBH、、RET;FAR屬性的過程對應(yīng)段間返回displayENDP第五頁,共一百二十四頁,編輯于2023年,星期四;匯編語言程序結(jié)構(gòu)例二(子程結(jié)構(gòu));用二進制顯示中斷向量表中數(shù)據(jù)D0H的個數(shù)keyEQU0D0H;用符號表示常量(關(guān)鍵字)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;調(diào)用顯示子程
MOVAH,4CH;返回DOS
INT21H;用二進制顯示BX內(nèi)容子程displayPROC
MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP
codeENDS;代碼段結(jié)束ENDbegin;指示程序結(jié)束和;程序入口第六頁,共一百二十四頁,編輯于2023年,星期四等值定義偽操作
格式
符號名EQU需等值的表達式作用是用符號名等值指定的表達式其中表達式可以是任何有效的操作數(shù)匯編時用語句中的表達式代替程序中符號所在的地方。應(yīng)用:1.定義符號常量,方便修改程序。2.某表達式多次出現(xiàn)時,用等值偽操作可以方便編程。第七頁,共一百二十四頁,編輯于2023年,星期四;匯編語言程序結(jié)構(gòu)例二(子程結(jié)構(gòu));用二進制顯示中斷向量表中數(shù)據(jù)D0H的個數(shù)keyEQU0D0H
;用符號表示常量(關(guān)鍵字)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0
MOVAL,key
next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;調(diào)用顯示子程
MOVAH,4CH;返回DOS
INT21H;用二進制顯示BX內(nèi)容子程displayPROC
MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP
codeENDS;代碼段結(jié)束ENDbegin;指示程序結(jié)束和;程序入口第八頁,共一百二十四頁,編輯于2023年,星期四例三用二進制顯示中斷向量表中數(shù)據(jù)
D0H的個數(shù)。分析:中斷向量表指內(nèi)存0:0~0:3FFH
大小400H(即1K)字節(jié)空間;查找關(guān)鍵字D0H;將關(guān)鍵字的個數(shù),存放在BX中,采用二進制顯示BX內(nèi)容,16個字符;
采用子程調(diào)用結(jié)構(gòu)。第九頁,共一百二十四頁,編輯于2023年,星期四主程序流程圖子程序流程圖第十頁,共一百二十四頁,編輯于2023年,星期四;匯編語言程序結(jié)構(gòu)例二(子程結(jié)構(gòu));用二進制顯示中斷向量表中數(shù)據(jù)D0H的個數(shù)keyEQUD0H;用符號表示常量(關(guān)鍵字)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,key
next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;調(diào)用顯示子程MOVAH,4CH;返回DOSINT21H;用二進制顯示BX內(nèi)容子程displayPROC
MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP
codeENDS;代碼段結(jié)束ENDbegin;指示程序結(jié)束和;程序入口第十一頁,共一百二十四頁,編輯于2023年,星期四匯編源程序scans.asmD:\MASM\MASMscans;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.scans.ASM(1):errorA2009:Symbolnotdefined:D0Hscans.ASM(9):errorA2009:Symbolnotdefined:KEY49924+419241Bytessymbolspacefree0WarningErrors2SevereErrorsD:\masm>匯編程序提示出錯的行號,據(jù)此可修改程序中的語法錯誤。第十二頁,共一百二十四頁,編輯于2023年,星期四;匯編語言程序結(jié)構(gòu)例二(子程結(jié)構(gòu));用二進制顯示中斷向量表中數(shù)據(jù)D0H的個數(shù)keyEQU0D0H;用符號表示常量(關(guān)鍵字)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,key
next:CMP[SI],ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;調(diào)用顯示子程MOVAH,4CH;返回DOSINT21H;用二進制顯示BX內(nèi)容子程displayPROC
MOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDP
codeENDS;代碼段結(jié)束ENDbegin;指示程序結(jié)束和;程序入口思考:如何用SCANSB改寫此程序?第十三頁,共一百二十四頁,編輯于2023年,星期四匯編、連接后,執(zhí)行程序:D:\masm>scans;在DOS下運行程序0000000000000100D:\masm>debug;利用DEBUG檢測結(jié)果-S0:0L400D00000:00230000:00430000:00730000:009C-QD:\masm>請上機自己調(diào)試該程序。第十四頁,共一百二十四頁,編輯于2023年,星期四例在中斷向量表中查找從鍵盤輸入的字符,并將其個數(shù)用二進制形式顯示出來。(scanskey.asm)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000H;設(shè)置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;設(shè)置查找長度MOVBX,0;計算值初值
MOVAH,01H;從鍵盤輸入
INT21H;輸入關(guān)鍵字在AL中next:CMP[SI],ALJNZpointINCBXpoint:INCSI
CALLdisplay;調(diào)用顯示子程
MOVAH,4CH
;調(diào)用4CH功能
INT21H
;返回DOS;用二進制顯示BX內(nèi)容子程
displayPROC
MOVCX,16;顯示位數(shù)rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30H
MOVAH,2HINT21H
LOOProtate
RET;子程返回
displayENDP
codeENDS;代碼段結(jié)束ENDbegin第十五頁,共一百二十四頁,編輯于2023年,星期四例在中斷向量表中查找從鍵盤輸入的字符,并將其個數(shù)用二進制形式顯示出來。(scanskey.asm)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000H;設(shè)置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;設(shè)置查找長度MOVBX,0;計算值初值
MOVAH,01H;從鍵盤輸入
INT21H;輸入關(guān)鍵字
MOVDL,AL;保存在DL中next:LODSB;從串取CMPAL,DL;與關(guān)鍵字比較JNZpointINCBX;計算值加1point:LOOPnext;查找結(jié)束?CALLdisplay;調(diào)用顯示子程MOVAH,4CH;調(diào)用4CH功能INT21H;返回DOS;用二進制顯示BX內(nèi)容子程displayPROCMOVCX,16;顯示位數(shù)rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代碼段結(jié)束ENDbegin用LODSB改寫程序第十六頁,共一百二十四頁,編輯于2023年,星期四數(shù)值回送操作符:(自學(xué))課前5分鐘TYPE,LENGTH,SIEE,OFFSET,SEG5種。把一些特征或存貯器地址的一部分作為數(shù)值回送?!YPE格式:TYPEvariable變量則回送該變量的以字節(jié)數(shù)表示的類型(DB為1,DW為2,DD為4,DQ為8,DT為10)或label標號回送標號類型數(shù)值(NEAR為-1,F(xiàn)AR為-2)例:ARRAYDW1,2,3ADDSI,TYPEARRAY匯編程序其形式:ADDSI,2第十七頁,共一百二十四頁,編輯于2023年,星期四·LENGTH格式:LENGTHvariable對于變量中使用DUP匯編回送分配給變量單元數(shù),其他情況回送1。例:FESSDW100DUP(0) 對于MOVCX,LENGTHFEES 匯編程序?qū)⑵湫问剑篗OVCX,100 其他情況例:ARRAYDW1,2,3 對于指令MOVCX,LENGTHARRAY 匯編程序?qū)⑹蛊湫问綖椋篗OVCX,1例:TABLEDB‘ABCD’ 對于指令MOVCX,LENGTHTABLE匯編程序使其形式為:MOVCX,1第十八頁,共一百二十四頁,編輯于2023年,星期四·SIEE格式:SIEEvariable
回送分配給該變量的字節(jié)數(shù)LENGTH*TYPE例:FEESDW100DUP(0)
MOVCX,SIZEARRAY 將形成:MOVCX,200例:TABLEDB‘ABCD’
MOVCX,SIEETABLE 將形成MOVCX,1例:ARRAYDW1,2,3
MOVCX,SIEEARRAY 形式MOVCX,2 LENGTH*TYPE=2第十九頁,共一百二十四頁,編輯于2023年,星期四其中:TYPE變量的返回值是類型的字節(jié)數(shù): DB為1,DW為2,DD為4,DQ為8,DT為10; TYPE標號的返回值是:NEAR為-1,F(xiàn)AR為-2。
LENGTH變量返回DUP分配的單元數(shù),對于其他情況則返回1。
SIZE返回值是:LENGTH和TYPE值的乘積,即變量的字節(jié)數(shù)。第二十頁,共一百二十四頁,編輯于2023年,星期四第五節(jié)BIOS和DOS中斷功能調(diào)用
一、概述
1.BIOS和DOS中斷子程層次特點2.中斷類型分類3.調(diào)用方法二、BIOS功能調(diào)用1.設(shè)置顯示方式(10H類型,00H功能)2.置光標位置(10H類型,02H功能)3.清屏、清窗口(10H類型,06H或07H功能)三、
DOS系統(tǒng)功能調(diào)用(21H類型中斷調(diào)用)1.顯示單字符(02H功能)2.顯示字符串(09H功能)3.單字符輸入(01H、07H、08H功能)4.字符串輸入(0AH功能)5.檢測鍵盤狀態(tài)(0BH功能)6.保存中斷向量(35H功能)(第六章介紹)7.設(shè)置中斷向量(25H功能)第二十一頁,共一百二十四頁,編輯于2023年,星期四maxDB11,?,4DUP(?)dataSEGMENTstringDB‘HelloWorld!’,’$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AH;調(diào)用0AH輸入功能INT21HLEADX,stringMOVAH,09H;調(diào)用09H顯示功能INT21HMOVAH,4CHINT21H;返回DOScodeENDSENDstart第二十二頁,共一百二十四頁,編輯于2023年,星期四第三節(jié)BIOS和DOS中斷功能調(diào)用
一、概述
二、BIOS功能調(diào)用三、
DOS系統(tǒng)功能調(diào)用(21H類型中斷調(diào)用)第二十三頁,共一百二十四頁,編輯于2023年,星期四一、概述1.BIOS和DOS中斷子程層次特點2.中斷類型分類3.調(diào)用方法第二十四頁,共一百二十四頁,編輯于2023年,星期四1.BIOS和DOS中斷子程層次特點用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令DOS系統(tǒng)層次結(jié)構(gòu)第二十五頁,共一百二十四頁,編輯于2023年,星期四層次特點:ROMBIOS中的中斷子程使用IN/OUT指令直接控制外設(shè),實現(xiàn)與外設(shè)之間的輸入/輸出操作,以軟件形式向其上層提供服務(wù)。IO.SYS中的中斷子程(稱基本輸入/輸出BIOS模塊)
調(diào)用ROMBIOS的基本I/O功能,向MSDOS.SYS提供設(shè)備驅(qū)動服務(wù)。用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令第二十六頁,共一百二十四頁,編輯于2023年,星期四
MSDOS.SYS中的中斷子程(稱DOS內(nèi)核模塊)調(diào)用IO.SYS,實現(xiàn)對外設(shè)的控制。與標準外設(shè)有兩層隔離:IO.SYS和ROMBIOS。其中21H類型的中斷子程提供了豐富的系統(tǒng)服務(wù),稱21類型的中斷調(diào)用為DOS系統(tǒng)(功能)調(diào)用。用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令第二十七頁,共一百二十四頁,編輯于2023年,星期四用戶編程原則①盡可能使用DOS的系統(tǒng)功能調(diào)用,提高程序可移植性。②在DOS功能不能實現(xiàn)情況下,考慮用BIOS功能調(diào)用。③在DOS和BIOS的中斷子程不能解決問題時,使用IN/OUT指令直接控制硬件。用戶程序磁盤管理模塊(DOS內(nèi)核)MSDOS.SYS系統(tǒng)功能基本輸入/輸出BIOS模塊IO.SYS設(shè)備驅(qū)動ROMBIOS基本I/O系統(tǒng)硬件裝入命令處理模塊COMMAND.COM用戶命令第二十八頁,共一百二十四頁,編輯于2023年,星期四2.中斷類型分類向量表中的中斷類型分為七類:①處理CPU特殊操作(除0、溢出)的00H、04H類型。②
為DEBUG調(diào)試程序設(shè)置的單步(01H)、斷點(03H)類型。③
處理CPU的NMI引腳信號的02H類型。非屏蔽硬中斷子程④
處理CPU的INTR引腳信號的08~0FH類型??善帘晤愋陀仓袛嘧映挞?/p>
用INT指令調(diào)用的中斷子程
BIOS功能調(diào)用(如10~1AH)DOS功能調(diào)用(如21H)NMIINTR8088第二十九頁,共一百二十四頁,編輯于2023年,星期四⑥
保留類型為DOS系統(tǒng)保留
1)指現(xiàn)在未用到,以后系統(tǒng)可能會用到。
2)已用到,但不向用戶公開。為用戶保留
1)被系統(tǒng)子程嵌套調(diào)用了的類型(如1BH、1CH)。使用戶在系統(tǒng)功能基礎(chǔ)上擴充功能。
2)系統(tǒng)未占用類型(如60H~67H)。⑦非中斷向量類型對應(yīng)向量表中的4個單元存放的不是中斷向量。(如1DH、1EH、1FH、41H、46H、22H)通常是一些參數(shù)表的地址信息.第三十頁,共一百二十四頁,編輯于2023年,星期四
中斷向量分配表第三十一頁,共一百二十四頁,編輯于2023年,星期四第三十二頁,共一百二十四頁,編輯于2023年,星期四第三十三頁,共一百二十四頁,編輯于2023年,星期四3.調(diào)用方法設(shè)置入口參數(shù)在AH設(shè)置功能號m執(zhí)行中斷指令I(lǐng)NTN分析、應(yīng)用出口參數(shù)第三十四頁,共一百二十四頁,編輯于2023年,星期四例1單字符顯示功能調(diào)用MOVDL,‘A’;設(shè)置入口參數(shù)MOVAH,02H;設(shè)置功能號INT21H;執(zhí)行中斷調(diào)用
例2單字符輸入功能調(diào)用MOVAH,01H;設(shè)置功能號
INT21H;執(zhí)行中斷調(diào)用CMPAL,0DH;分析、應(yīng)用出口參數(shù)JZexit、、、第三十五頁,共一百二十四頁,編輯于2023年,星期四二、BIOS功能調(diào)用基本輸入/輸出模塊BIOS:實現(xiàn)對輸入/輸出設(shè)備的控制,內(nèi)含0–1CH等類型中斷子程,包括顯示器、磁盤、鍵盤、打印機等標準外設(shè)的驅(qū)動程序。(參看中斷類型分配表)
BIOS功能調(diào)用指對BIOS模塊中的中斷子程的調(diào)用。第三十六頁,共一百二十四頁,編輯于2023年,星期四有關(guān)顯示器①顯示器通過顯卡(顯示適配器)連接到計算機上。②單色顯示器只能顯示黑白兩色。彩色顯示器能顯示多種顏色。第三十七頁,共一百二十四頁,編輯于2023年,星期四③屏幕上各象素的顯示信息,存放在顯示緩沖區(qū)(顯存)中。640KBRAM基本內(nèi)存0000:00000040:00000050:00000070:0000
A000:0000B000:0000
C800:0000F600:0000FE00:0000FE00:1FFF顯示緩存區(qū)(顯存)硬盤驅(qū)動器控制ROM32KBROMBASIC8KBROMBIOSIO.SYS模塊COMMAND.COM常駐模塊MSDOS.SYS模塊用戶程序空間COMMAND.COM暫駐模塊256KBROMDOS工作區(qū)ROMBIOS工作區(qū)128KBRAM保留區(qū)1KB中斷向量表第三十八頁,共一百二十四頁,編輯于2023年,星期四④顯示器有兩種顯示方式:
圖形方式:將屏幕劃分為m×n的點陣,在每個點的位置顯示象素,一個點是一個象素。文本方式將屏幕劃分為若干行和列,在每個網(wǎng)格位置上顯示象素,一個字符是一個象素。第三十九頁,共一百二十四頁,編輯于2023年,星期四文本方式將屏幕劃分為m列和n行(m×n),在每個網(wǎng)格位置上顯示象素,一個字符是一個象素。80×25文本方式A~~~~~~~~~~~~~~~~0列0行79列24行BC第四十頁,共一百二十四頁,編輯于2023年,星期四~~~~640×480圖形方式640點480點圖形方式:將屏幕劃分為m×n的點陣,在每個點的位置顯示象素,一個點是一個象素。第四十一頁,共一百二十四頁,編輯于2023年,星期四在文本方式下,對應(yīng)屏幕上的每個字符,在顯示緩沖區(qū)中占用兩個單元:一個存放ASCII碼,一個存放顯示屬性。41H07H42H07H61H70H62H70H、、、顯示緩沖區(qū)(顯存)字符A,黑底白字字符B,黑底白字字符a,白底黑字字符b,白底黑字第四十二頁,共一百二十四頁,編輯于2023年,星期四例10000111B或87H表示黑底白字,閃爍
01110000B或70H表示白底黑字,不閃爍16種0000黑1000灰
0010綠1010淺綠0100紅1100淺紅0111灰白1111白BLRGBIRGB閃爍背景前景765432108種000黑010綠
100紅111白0不閃爍1閃爍屬性字節(jié)的含義:第四十三頁,共一百二十四頁,編輯于2023年,星期四
據(jù)顯存大小,可存儲若干頁的字符象素。
例16KB顯存能存儲:80×25方式,4頁(0~3),80×25×2×4=1600040×25方式,8頁(0~7),40×25×2×8=16000第四十四頁,共一百二十四頁,編輯于2023年,星期四1.設(shè)置顯示方式入口參數(shù)AL=顯示方式值
0040×25黑白文本方式
0140×25彩色文本方式
0280×25黑白文本方式
0380×25彩色文本方式
04320×320彩色圖形方式功能號
AH=00H類型號
10H出口參數(shù)無實現(xiàn)功能將顯示方式設(shè)置為指定形式例將顯示方式設(shè)置為80×25彩色文本方式MOVAL,03HMOV
AH,00
INT10H第四十五頁,共一百二十四頁,編輯于2023年,星期四2.
清屏、清窗口功能入口參數(shù)AL=0CH=窗口左上角行號CL=窗口左上角列號DH=窗口右下角行號DL=窗口右下角列號BH=窗口屬性功能號
AH=06H或AH=07H類型號
10H出口參數(shù)無實現(xiàn)功能按給定屬性清除指定的窗口內(nèi)容第四十六頁,共一百二十四頁,編輯于2023年,星期四例清除屏幕顯示,將其屬性置為反白(白底黑字)顯示。MOVAL,0;清屏功能MOVBH,70H;白底黑字MOVCH,0;左上角行號MOVCL,0;左上角列號MOVDH,24;右下角行號MOVDL,79;右下角列號MOVAH,6;功能號INT10H;中斷調(diào)用第四十七頁,共一百二十四頁,編輯于2023年,星期四3.置光標位置光標控制開始顯示的位置,計算機有專門的硬件控制光標的顯示大小、位置。光標只在文本方式中出現(xiàn),在圖形方式下光標消失。~~~~~~~~~~~~~~~~0列0行79列24行5列1列1行2行第四十八頁,共一百二十四頁,編輯于2023年,星期四置光標位置入口參數(shù)DH=行號DL=列號BH=頁號
功能號
AH=02H
類型號
10H
出口參數(shù)無
實現(xiàn)功能將光標設(shè)置在指定的位置第四十九頁,共一百二十四頁,編輯于2023年,星期四例將光標設(shè)置在2行5列的位置MOVDH,2MOVDL,5MOVBH,0MOVAH,2INT10H~~~~~~~~~~~~~~~~0列0行79列24行5列1列1行2行第五十頁,共一百二十四頁,編輯于2023年,星期四三、DOS系統(tǒng)功能調(diào)用(21H類型中斷調(diào)用)1.顯示單字符(02H功能)2.顯示字符串(09H功能)3.單字符輸入(01H、07H、08H功能)4.字符串輸入(0AH功能)5.檢測鍵盤狀態(tài)(0BH功能)6.保存中斷向量(35H功能)(第六章介紹)7.設(shè)置中斷向量(25H功能)第五十一頁,共一百二十四頁,編輯于2023年,星期四1.顯示單字符(02H功能)
入口參數(shù)DL=要顯示字符的ASCII碼功能號
AH=02H類型號
INT21H出口參數(shù)無實現(xiàn)功能顯示指定字符,光標隨動。例顯示字符AMOVDL,‘A’MOVAH,02HINT21H第五十二頁,共一百二十四頁,編輯于2023年,星期四例使光標回到下一行的行首。MOVDL,0DH
;顯示回車符MOVAH,02HINT21HMOVDL,0AH
;顯示換行符MOVAH,02HINT21H~~~~~~~~~~~~~~~~HelloWorld
第五十三頁,共一百二十四頁,編輯于2023年,星期四2.顯示字符串(09H功能)入口參數(shù)①定義要顯示的字符串,
字符串尾應(yīng)為’$’,作為結(jié)束顯示的標志。②DS:DX=字符串的首地址功能號
AH=09H類型號
21H出口參數(shù)無實現(xiàn)功能顯示字符串,遇’$’停止顯示,光標隨動。第五十四頁,共一百二十四頁,編輯于2023年,星期四例編程顯示字符串’TsinghuaUniversity’dataSEGMENT
;定義顯示的子符串striDB‘TsinghuaUniversity’,‘$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data
;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,stri
MOVAH,09H;調(diào)顯示功能
INT21HMOVAH,4CH;返回DOS
INT21HcodeENDS
ENDstart第五十五頁,共一百二十四頁,編輯于2023年,星期四有關(guān)鍵盤①鍵盤通過鍵盤接口電路與計算機連接。②鍵盤上的鍵有三種類型:字符鍵A~Z,0~9等功能鍵F1~F12,PageUp等組合控制鍵Shift,Ctrl,Alt等③
鍵盤上的每個鍵都有一個掃描碼。◢◢據(jù)掃描碼可確定操作的是哪個鍵、是按下鍵還是釋放鍵;◢◢掃描碼用一個字節(jié)表示。低7位是掃描碼的數(shù)字編碼,與鍵盤上的鍵一一對應(yīng);最高位D7位表示鍵的操作狀態(tài):當(dāng)按下鍵時,D7=0;當(dāng)釋放鍵時,D7=1第五十六頁,共一百二十四頁,編輯于2023年,星期四⑤
鍵盤中斷子程功能(09H類型中斷子程)
◢從鍵盤接口讀取操作鍵的掃描碼;
◢將掃描碼轉(zhuǎn)換成字符碼;大部分鍵的字符碼為ASCII碼,無ASCII碼鍵(如組合鍵Shift、Ctrl等)的字符碼為0。◢將鍵的掃描碼、字符碼存放在鍵盤緩沖區(qū),供其它有關(guān)鍵盤的中斷子程應(yīng)用。④鍵盤接口對按下鍵和釋放鍵均向計算機發(fā)出中斷申請,如果中斷響應(yīng)條件滿足,CPU轉(zhuǎn)去執(zhí)行鍵盤中斷子程。
鍵盤中斷子程類型號為09H。第五十七頁,共一百二十四頁,編輯于2023年,星期四3.單字符輸入(01H、07H、08H功能)①入口參數(shù)無
功能號
AH=01H
類型號
21H
出口參數(shù)AL=鍵入字符的ASCII碼
實現(xiàn)功能
等待從鍵盤輸入一個字符,并在屏幕上回顯,光標移動,檢測Ctrl-Break鍵第五十八頁,共一百二十四頁,編輯于2023年,星期四例利用鍵盤輸入的字符產(chǎn)生分支:MOVAH,1;等待從鍵盤輸入INT21H
CMPAL,‘Y’
;是’Y’?JZyes
CMPAL,‘y’
;是’y’?
JZyesno:......JMPexityes:......exit:...第五十九頁,共一百二十四頁,編輯于2023年,星期四例在中斷向量表中查找從鍵盤輸入的字符,并將其個數(shù)用二進制形式顯示出來。(scanskey.asm)codeSEGMENT;代碼段開始ASSUMECS:codebegin:MOVAX,0000H;設(shè)置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;設(shè)置查找長度MOVBX,0;計算值初值
MOVAH,01H;從鍵盤輸入
INT21H;輸入關(guān)鍵字
MOVDL,AL;保存在DL中next:LODSB;從串取CMPAL,DL;與關(guān)鍵字比較JNZpointINCBX;計算值加1point:LOOPnext;查找結(jié)束?CALLdisplay;調(diào)用顯示子程MOVAH,4CH;調(diào)用4CH功能INT21H;返回DOS;用二進制顯示BX內(nèi)容子程displayPROCMOVCX,16;顯示位數(shù)rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代碼段結(jié)束ENDbegin第六十頁,共一百二十四頁,編輯于2023年,星期四②入口參數(shù)無功能號
AH=07H類型號
21H出口參數(shù)AL=鍵入字符的ASCII碼實現(xiàn)功能
等待從鍵盤輸入一個字符,不在屏幕上回顯,不檢測Ctrl-Break鍵第六十一頁,共一百二十四頁,編輯于2023年,星期四例用不帶回顯功能輸入密碼時:input:MOVAH,07H
;等待從鍵盤輸入
INT21HMOV[DI],AL;存入緩沖區(qū)
CMPAL,0DH;是回車符?JNZinput;不是,繼續(xù)輸入check:、、、、、、第六十二頁,共一百二十四頁,編輯于2023年,星期四4.字符串輸入(0AH功能)
入口參數(shù)DS:DX=緩沖區(qū)的首地址(DS:DX)=限制最多輸入的字符數(shù)
功能號
AH=0AH
類型號
21H
出口參數(shù)(DS:DX+1)=實際鍵入的字符(不含回車符)從(DS:DX+2)開始順序存放鍵入的字符串,回車符0DH為串尾最后一字符。
實現(xiàn)功能等待從鍵盤輸入字符串,并存入設(shè)定的緩沖區(qū)內(nèi),同時回顯字符串,光標隨著移動,
回車符使光標回到行首。
注意事項:應(yīng)按要求先定義緩沖區(qū),再調(diào)用。第六十三頁,共一百二十四頁,編輯于2023年,星期四例應(yīng)用0AH功能輸入字符串。
dataSEGMENT;定義緩沖區(qū)maxDB11;定義限制最多輸入個數(shù)lenthDB?;用于存放實際輸入個數(shù)striDB11DUP(?);用于存放輸入的字符串dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,max
MOVAH,0AHINT21H;調(diào)0A輸入功能
MOXCH,0MOVCL,lenth;取字符串長度放CX中
LEABX,stri;取字符串首址于BX中MOVAL,[BX];應(yīng)用輸入字符、、、、、codeENDS第六十四頁,共一百二十四頁,編輯于2023年,星期四dataSEGMENT;定義緩沖區(qū)maxDB11;定義限制最多輸入個數(shù)lenthDB?;用于存放實際輸入個數(shù)striDB11DUP(?);用于存放輸入的字符串dataENDS從鍵盤輸入‘ABCD’,回車,內(nèi)存的存放結(jié)果:0B04414243440D00max07000000000000000080a0b0f12345690c0d0elenthstri地址內(nèi)容DS:DX第六十五頁,共一百二十四頁,編輯于2023年,星期四如下編程與上例相同:dataSEGMENT
maxDB11等價于:
DB?
maxDB11,?,11DUP(?)
DB11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,max
MOVAH,0AH;調(diào)輸入功能
INT21H
MOXCH,0MOVCL,max+1;取字符串長度放CX中
LEABX,max+2;取字符串首址于BX中MOVAL,[BX];應(yīng)用輸入字符、、、codeENDS第六十六頁,共一百二十四頁,編輯于2023年,星期四dataSEGMENTmaxDB11DB?DB11DUP(?)dataENDS從鍵盤輸入‘ABCD’,回車,內(nèi)存的存放結(jié)果:等價于maxDB11,?,11DUP(?)0B04414243440D00max07000000000000000080a0b0f12345690c0d0e地址內(nèi)容DS:DX第六十七頁,共一百二十四頁,編輯于2023年,星期四0AH功能執(zhí)行過程:①若(DS:DX)字節(jié)單元的值為0,則不等待從鍵盤輸入,結(jié)束調(diào)用。②若(DS:DX)字節(jié)單元的內(nèi)容大于0,則等待從鍵盤輸入,并把輸入鍵的ASCII碼順序存放在DS:DX+2開始的單元,按回車鍵表示結(jié)束輸入。當(dāng)按下鍵的個數(shù)超過(DS:DX)中值,發(fā)出警告聲’嘟嘟’,不再接收輸入的數(shù)據(jù),直到輸入回車鍵。③將實際輸入的字符個數(shù)(不包括回車鍵)填入(DS:DX+1),結(jié)束調(diào)用。DS:DX00000000000000000000000000000000第六十八頁,共一百二十四頁,編輯于2023年,星期四0AH功能注意事項:◢輸入的字符均帶回顯,且光標隨字符移動。當(dāng)輸入回車符結(jié)束時,也回顯回車符。表現(xiàn)為功能調(diào)用結(jié)束后,光標回到了行首。◢
回車符0DH作為一個輸入的字符存放在字符串尾,但計數(shù)輸入個數(shù)時,不包括回車鍵。實際最多能輸入的字符數(shù)=限制的最多數(shù)-1(回車符占一個)◢
執(zhí)行完0AH功能后,DS和DX的值不變,DS:DX仍指向緩沖區(qū)的首地址。◢
整個緩沖區(qū)的大小應(yīng)為:限制的最多數(shù)+2maxDB11,?,11dup(?)第六十九頁,共一百二十四頁,編輯于2023年,星期四例利用DEBUG查看0A功能輸入結(jié)果。dataSEGMENTmaxDB11,?,11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,max
MOVAH,0AH;調(diào)輸入功能
INT21H
MOVCH,0MOVCL,max+1;取輸入長度到CX中MOVAH,4CH;返回DOSINT21HcodeENDSENDstart第七十頁,共一百二十四頁,編輯于2023年,星期四D:\MASM>DEBUGTEST0a.exe
;裝入執(zhí)行文件-U
;反匯編程序
129E:0000B89D12MOVAX,129D129E:00038ED8MOVDS,AX129E:00058D160000LEADX,[0000]129E:0009B40AMOVAH,0A129E:000BCD21INT21129E:000DB500MOVCH,00129E:000F8A0E0100MOVCL,[0001]129E:0013B44CMOVAH,4C129E:0015CD21INT21、、、-D129D:0L10
;查看程序執(zhí)行前緩沖區(qū)內(nèi)容
129D:00000B00000000000000-0000000000000000-G
000D
;執(zhí)行程序
Hello
;從鍵盤輸入字符串
Programterminatednormally-D129D:0L10
;查看程序執(zhí)行后緩沖區(qū)內(nèi)容
129D:00000B
05
48656C6C6F0D-0000000000000000..Hello-第七十一頁,共一百二十四頁,編輯于2023年,星期四思考:1.若將程序改為如下形式,設(shè)想程序執(zhí)行的結(jié)果。dataSEGMENTmaxDB100HDUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,max
MOVAH,0AH;調(diào)輸入功能INT21HMOVAH,4CH;返回DOSINT21HcodeENDSENDstart第七十二頁,共一百二十四頁,編輯于2023年,星期四結(jié)果是:不等待輸入,結(jié)束0AH功能調(diào)用。0000000000000000max07000000000000000080a0b0f12345690c0d0e地址內(nèi)容DS:DX注意:由于DS:DX限制輸入最大字符數(shù)為0,
所以不等待輸入,結(jié)束0AH功能調(diào)用。原因是:第七十三頁,共一百二十四頁,編輯于2023年,星期四2.若將程序改為如下形式,設(shè)想程序執(zhí)行的結(jié)果。dataSEGMENTmaxDW100H,?,100HDUP(?);定義為字類型dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置緩沖區(qū)地址于DS:DXMOVDS,AXLEADX,max
MOVAH,0AH;調(diào)輸入功能INT21HMOVAH,4CH;返回DOSINT21HcodeENDSENDstart第七十四頁,共一百二十四頁,編輯于2023年,星期四結(jié)果是:不等待輸入,結(jié)束0AH功能調(diào)用。0001000000000000max07000000000000000080a0b0f12345690c0d0e地址內(nèi)容DS:DX注意:0AH功能以字節(jié)類型應(yīng)用DS:DX指向的緩沖區(qū)。并不隨緩沖區(qū)類型定義的變化而變化。原因是:第七十五頁,共一百二十四頁,編輯于2023年,星期四例編程從鍵盤輸入字符串,給出顯示提示’Pleaseinput:’dataSEGMENTstriDB‘PleaseInput:’,’$’maxDB11,?,11DUP(?)dataENDScodeSEGMENTASSUME
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年職場能力綜合測試(職場競爭力考核)試題及答案
- 未來五年商業(yè)營業(yè)用房經(jīng)營租賃企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年小額貸款科技服務(wù)企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 未來五年農(nóng)林牧漁業(yè)機械設(shè)備修理企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年投資與資產(chǎn)管理企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年建筑用砂、巖地質(zhì)堪查服務(wù)企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略分析研究報告
- 未來五年軌道交通機車車輛設(shè)備企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略分析研究報告
- 駕駛員計時培訓(xùn)管理制度
- 鋼結(jié)構(gòu)制作焊接關(guān)鍵工序操作手冊
- AI圖像識別技術(shù)解析
- 數(shù)字孿生方案
- 金融領(lǐng)域人工智能算法應(yīng)用倫理與安全評規(guī)范
- 2026長治日報社工作人員招聘勞務(wù)派遣人員5人備考題庫及答案1套
- 機動車駕校安全培訓(xùn)課件
- 河道清淤作業(yè)安全組織施工方案
- 2025年役前訓(xùn)練考試題庫及答案
- 2026年七臺河職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案
- 2023-2024學(xué)年廣東省廣州市小學(xué)數(shù)學(xué)二年級上冊期末自我評估試題
- YS/T 971-2014鈦鎳形狀記憶合金絲材
- 鈷冶金概述課件
- 方小丹建筑地基基礎(chǔ)設(shè)計的若干問題課件
評論
0/150
提交評論