




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1DOS和BIOS調(diào)用DOS(DiskOperationSystem)和BIOS(BasicInputandOutputSystem)是為用戶提供的兩組系統(tǒng)服務(wù)程序。BIOS是IBMPC/XT的基本I/O系統(tǒng),負(fù)責(zé)管理系統(tǒng)的測試程序、初始化引導(dǎo)程序、一部分中斷矢量裝入程序及外部設(shè)備的服務(wù)程序。由于這些程序固化在ROM中,用戶可以直接調(diào)用。DOS是IBMPC/XT的操作系統(tǒng),負(fù)責(zé)管理系統(tǒng)的所有資源,協(xié)調(diào)微機(jī)的操作,其中包括大量的可供調(diào)用的服務(wù)子程序,完成設(shè)備的管理和磁盤文件的管理。用戶控制PC機(jī)硬件的方法:
高級語言調(diào)用DOS程序使用BIOS程序直接訪問硬件2DOS和BIOS調(diào)用不用CALL指令。采用軟中斷指令I(lǐng)NTn。用戶程序不必與服務(wù)程序的代碼連接。3DOS調(diào)用DOS功能調(diào)用類型號中斷功能類型號中斷功能20H程序結(jié)束21H請求DOS功能調(diào)用22H結(jié)束退出23H中止(Ctrl-Break)處理24H關(guān)鍵性錯(cuò)誤處理25H磁盤順序讀26H磁盤順序?qū)?7H程序結(jié)束且駐留內(nèi)存28HDOS內(nèi)部使用29~2EHDOS內(nèi)部保留2FHDOS內(nèi)部使用30~3FHDOS內(nèi)部保留4INT21H調(diào)用方法
1、系統(tǒng)功能調(diào)用號送AH2、子程序規(guī)定的入口參數(shù)送指定的寄存器
3、INT21H4、分析出口參數(shù)功能號查表方法:5INT21H字符輸入
1、利用0AH功能從鍵盤輸一個(gè)字符串入內(nèi)存。 要求:(AH)=0AH,(DX)=輸入緩沖區(qū)首址 數(shù)據(jù)段中的輸入緩沖區(qū):第一個(gè)字節(jié)為所能保存的最大字符數(shù)第二個(gè)字節(jié)為實(shí)際接收的字符個(gè)數(shù)保留的單元第三個(gè)字節(jié)為所輸入的第一個(gè)字符的ASCII碼
…….6INT21H
例 DATASEGMENT
INBUFFERDB81 ACTCHARDB? CHARTEXTDB80DUP(?)
………. DATAENDS ………. CODESEGMENT ASSUMEDS:DATA,SS:STACK,CS:CODE ……….
MOV DX,OFFSETINBUFFER
MOV AH,0AH;
INT 21H ………..
CODEENDSEND ……..7INT21H2、利用09H功能在CRT上顯示一個(gè)字符串 要求:(AH)=09H,(DX)=欲輸出字符串的首址,字符串以‘$’結(jié)束。 例 DATA SEGMENT STRING DB‘HELLOEVERYBODY!$’ ………. DATAENDS ………. CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE ……….
MOV DX,OFFSETSTRING MOV AH,09H INT 21H
………..
CODEENDSEND ……..顯示0AH鍵盤輸入的字符串時(shí),DX指向用戶定義的緩沖區(qū)的第三個(gè)字節(jié)8INT21H字符輸出
1、利用02H功能在CRT上顯示一個(gè)字符。 要求:(AH)=02H,(DL)=欲輸出字符的ASCII碼 例: MOV DL,41H MOV AH,02H INT 21H9 ;----調(diào)用DOS功能輸出回車、換行符------
MOV DL,0AH ;換行符的ASCII碼為0AH
MOV AH,02H;顯示字符
INT 21H
MOV DL,0DH ;回車符的ASCII碼為0DH
MOV AH,02H
INT 21H
INT21H10INT21H程序返回
利用4CH功能返回DOS。 要求:(AH)=4CH, CODESEGMENT …………
MOVAH,4CH INT 21H CODEENDS11常用DOS功能調(diào)用通常把DOS提供的INT21H中斷服務(wù)程序稱為DOS功能調(diào)用,調(diào)用時(shí)根據(jù)AH的值來選擇子功能。AH=1
鍵盤鍵入并回顯,輸入字符的ASCII碼在AL中返回例:MOVAH,1INT21HAH=2顯示輸出字符,輸出字符的ASCII碼放入DL中例:MOVAH,2 MOVDL,‘A’INT21HINT21H12AH=7鍵盤輸入無回顯,輸入字符的ASCII碼在AL中返回例:MOVAH,7INT21HAH=9顯示字符串,字符串以‘$’結(jié)束,開始位置用DS:DX指示AH=0AH輸入字符串,開始位置用DS:DX指示,分配存儲(chǔ)空間為n+2AH=0BH檢測鍵盤輸入,有鍵按下AL=0FFH,否則AL=00HAH=4CH程序運(yùn)行結(jié)束,返回操作系統(tǒng),返回碼由AL給出例:MOVAX,4C00HINT21HINT21H13分析問題,建立數(shù)學(xué)模型確定最佳算法合理分配存儲(chǔ)單元和寄存器繪制流程圖編寫程序調(diào)試程序程序設(shè)計(jì)方法14順序程序設(shè)計(jì) 指令指針I(yè)P值線性增加分支(條件)程序設(shè)計(jì)
IP值受標(biāo)志位的影響而跳變循環(huán)程序設(shè)計(jì)
IP值受計(jì)數(shù)器CX中的值不為零而循環(huán)設(shè)計(jì)方法15順序結(jié)構(gòu)(直線型結(jié)構(gòu))例1編程計(jì)算表達(dá)式Z=X^2-Y/5的值,其中A、B為帶符號字節(jié)整數(shù),Z為帶符號字整數(shù)。(BX)<=X*X(AX)<=Y/5Z<=(BX)-(AX)開始結(jié)束MOV AX,DATMOV DS,AXMOV AL,XIMUL ALMOV BX,AXMOV AL,YCBW MOV CL,5IDIV CL CBWSUB BX,AXMOV Z,BXRET16;--數(shù)據(jù)段定義---------------------------------- DAT SEGMENT
X DB 10 Y DB -20 Z DW ? DAT ENDS順序結(jié)構(gòu)(直線型結(jié)構(gòu))17;--代碼段定義----------------------------------COD SEGMENT
ASSUMEDS:DAT,CS:COD
MAIN PROCFARSTART:PUSH DS ;
保存返回地址
SUB AX,AX PUSHAX MOV AX,DAT MOV DS,AX
;初始化DS
順序結(jié)構(gòu)(直線型結(jié)構(gòu))18;----------------------------------------------------------------------------MOV AL,XIMUL ALMOV BX,AX
;(BX)<=X*X;-----------------------------------------------MOV AL,YCBW
;將被除數(shù)擴(kuò)展為字?jǐn)?shù)據(jù)MOV CL,5IDIV CL CBW
;(AX)<=Y/5;------------------------------------------------SUB BX,AXMOV Z,BX
;Z<=(BX)-(AX)順序結(jié)構(gòu)(直線型結(jié)構(gòu))19;---------------------------------------------------- RET
;返回
MAIN ENDP;---------------------------------------------------- COD ENDSEND START順序結(jié)構(gòu)(直線型結(jié)構(gòu))20例2
從鍵盤輸入一個(gè)小寫字母,轉(zhuǎn)換成大寫字母輸出。;3_8_1.asmdatasegmentparapublic‘data’string1db‘Pleaseinput(a–z):$’string2db0dh,0ah,‘Theresultis:$’dataendsss_segsegmentparastackdb256dup(?)ss_segends順序結(jié)構(gòu)程序設(shè)計(jì)21codesegmentparapublic‘code’assumecs:code,ss:ss_seg,ds:datamainprocfarStart:pushds xorax,ax pushax movax,data mov ds,ax leadx,string1 movah,9 ;顯示提示符1 int 21h mov ah,1 ;輸入小寫字符
int 21h;ASCII碼保存ALsubal,20hpushaxleadx,string2movah,9;顯示提示符2int21hpopaxmovah,2;輸出大寫字符
movdl,alint21hret ;返回DOSmainendpcodeendsendStart順序結(jié)構(gòu)程序設(shè)計(jì)22例3以16進(jìn)制形式顯示存儲(chǔ)器中一個(gè)字節(jié)的無符號數(shù)VAR。例如:11010101顯示D5;3_8_3.asmdatasegmentpara var db100dataendssta_segsegmentstack db 256dup(?)sta_segendscode segmentassumecs:code,ds:data,ss:sta_seg順序結(jié)構(gòu)程序設(shè)計(jì)23mainprocfar pushdsmovax,0pushaxmovax,datamovds,axmoval,var movdh,al movcl,4 shral,cl callubasc callpchar moval,dhcallubasc
callpchar
retmainendp;顯示一個(gè)字符pcharproc
movah,02h
movdl,al
int21h
ret
pcharendp;將AL的低4位轉(zhuǎn)換為ASCII碼
ubascprocandal,0fh
addal,30h
cmpal,‘9’
jnaubasc1
addal,07h
ubasc1:retubascendp順序結(jié)構(gòu)程序設(shè)計(jì)24JZL1L1:………...L2:…...L3:…...JMPL3TESTAX,1程序段1程序段2條件后繼程序YN分支結(jié)構(gòu)程序設(shè)計(jì)25JZL1L1:………...…...TESTAX,1程序段1后繼程序條件YN分支結(jié)構(gòu)程序設(shè)計(jì)26條件轉(zhuǎn)移指令就是一個(gè)分支結(jié)構(gòu),常用數(shù)據(jù)比較指令:無符號數(shù)比較指令JB/JNAE/JCJNB/JAE/JNCJBE/JNAJNBE/JA有符號數(shù)比較指令JL/JNGEJNL/JGEJNLE/JGJLE/JNG分支結(jié)構(gòu)程序設(shè)計(jì)27二分支結(jié)構(gòu)例4在數(shù)據(jù)段中有兩個(gè)16位二進(jìn)制無符號數(shù)DATA1和DATA2,找出其中較小數(shù),并存于MIN中。datasegmentdata1dw2000hdata2dw3f80hmindw?dataendsss_segsegmentstack db256dup(?)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_segmainprocfarpushdsmovax,0pushaxmovax,datamovds,ax
movax,data1cmpax,data2jnaenextmovax,data2next:movmin,axretmainendpcodeendsendmain分支結(jié)構(gòu)程序設(shè)計(jì)28三分支結(jié)構(gòu)例5判斷變量var中的值,若為正數(shù),在result中存入0001H;為負(fù)數(shù),在result中存入FFFFH;為零,在result中存入0000H。datasegmentvardw2000hresultdw0dataendsss_segsegmentstack dw100dup(0)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_seg分支結(jié)構(gòu)程序設(shè)計(jì)29main procfar pushds movax,0pushaxmovax,datamovds,ax
movax,varcmpax,0jllessjggreatmovax,0jmpshortnextless: movax,0ffffh jmpshortnextgreat: movax,0001hnext:movresult,axretmainendpcodeendsendmain分支結(jié)構(gòu)程序設(shè)計(jì)30多分支機(jī)構(gòu)例
根據(jù)內(nèi)存字節(jié)變量control被置位的情況控制程序轉(zhuǎn)移到8個(gè)子程序中的一個(gè)。datasegment
brn_tabdwsubr1,subr2,subr3,dwsubr4,subr5,subr6,dwsubr7,subr8controldb40hdataendsss_segsegmentstackdb100dup(0)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_seg變量control轉(zhuǎn)入子程序00000001subr100000010subr200000100subr300001000subr400010000subr500100000subr601000000subr710000000subr8分支結(jié)構(gòu)程序設(shè)計(jì)31mainprocfar …
leabx,brn_tabmoval,controlgtbit:rcral,1jcgetagaddbx,2jmpshortgtbitgetag:call[bx]retmainendpsubr1proc…retsubr1endp…subr8proc…retsubr8endpcodeendsendmain分支結(jié)構(gòu)程序設(shè)計(jì)32先執(zhí)行、后判斷初始化部分循環(huán)體修改部分條件循環(huán)結(jié)構(gòu)程序設(shè)計(jì)先判斷、后執(zhí)行初始化部分循環(huán)體修改部分條件后繼程序33單重循環(huán)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)34多重循環(huán):氣泡排序法
例在數(shù)據(jù)段中以buffer單元開始連續(xù)存放10個(gè)16位二進(jìn)制有符號數(shù),將這些數(shù)按由小到大順序排列。開始初始化數(shù)組起始地址SI內(nèi)循環(huán)次數(shù)N-1CX外循環(huán)次數(shù)N-1DXi=0地址加2數(shù)i<=數(shù)i+1?內(nèi)循環(huán)計(jì)數(shù)CX-1CX=0?Y二數(shù)位置交換N外循環(huán)計(jì)數(shù)DX-1YNDX=0?NY結(jié)束各重循環(huán)的初始控制條件及程序?qū)崿F(xiàn)內(nèi)循環(huán)可以嵌套在外循環(huán)中,也可以幾個(gè)內(nèi)循環(huán)并列在外循環(huán)中,但各層循環(huán)之間不能交叉,可以從內(nèi)循環(huán)跳到外循環(huán),不可以從外循環(huán)直接跳到內(nèi)循環(huán)防止出現(xiàn)死循環(huán),即不能讓循環(huán)回到初始條件,引起死循環(huán)35codesegmentassumecs:code,ds:data,ss:ss_segmainprocfar pushds movax,0 pushax movax,data movds,ax movsi,countsort1: movdi,1 movcx,di leabx,buffercircle: movax,[bx] incbxincbx cmpax,[bx] jlenext xchgax,[bx] mov[bx-2],ax movdi,cxnext:inccxcmpcx,si;比完
jlcircle;1遍
decsicmpdi,1jnesort1retmainendpcodeendsendmain循環(huán)結(jié)構(gòu)程序設(shè)計(jì)36冒泡法的第二種實(shí)現(xiàn) mainprocfar cmp ax,[bx] pushds jle next xor ax,ax xchg ax,[bx];交換數(shù)據(jù)
pushax mov [bx-2],ax mov ax,data next: loop main2 ;內(nèi)循環(huán)
mov ds,ax pop cx movcx,count–1 loop main1;外循環(huán)main1: mainendp lea bx,buffer pushcxmain2: mov ax,[bx] inc bxinc bx循環(huán)結(jié)構(gòu)程序設(shè)計(jì)37子程序(過程)調(diào)用程序設(shè)計(jì)(參數(shù)傳遞、保護(hù)現(xiàn)場)子程序設(shè)計(jì)38子程序設(shè)計(jì)子程序的描述(注釋用)子程序的功能描述入口參數(shù)的描述出口參數(shù)的描述斷點(diǎn)保護(hù)子程序中用到的寄存器應(yīng)用堆棧進(jìn)行保護(hù) 例:subr1proc pushax …… popax ret subr1endp39
子程序的參數(shù)傳遞通過寄存器傳遞參數(shù)通過全局變量傳遞參數(shù)通過堆棧傳遞參數(shù)其它子程序設(shè)計(jì)40子程序設(shè)計(jì)(一)無參子程序設(shè)計(jì)在子程序中無傳入?yún)?shù),也不返回參數(shù)例延時(shí)子程序DELAYPROC
PUSHCXDELAY1:MOVCX,0LOOPDELAY1POPCXRETDELAYENDP41子程序設(shè)計(jì)(二)帶參數(shù)子程序設(shè)計(jì)使用寄存器傳遞參數(shù)例ASCII轉(zhuǎn)換為16進(jìn)制子程序(0-0FH)入口條件:(AL)存放ASCII碼;出口條件:(AL)存放16進(jìn)制;
atohexproc subal,30hcmpal,10
jlatohex1 subal,7
atohex1:
ret
atohexendp42子程序設(shè)計(jì)使用全局變量傳遞參數(shù)
主程序與子程序共用一組變量,這種結(jié)構(gòu)獨(dú)立性較差
例
在數(shù)據(jù)段中,data1存放4位壓縮BCD碼(低位在前),將其轉(zhuǎn)化成二進(jìn)制數(shù),再存回data1中。
分析:二進(jìn)制數(shù)=(((BCD3*10+BCD2)*10+BCD1)*10+BCD0BCD1BCD0BCD3BCD2data1低8位高8位datasegment
data1dw?dataendsss_segsegmentstackdb100dup(0)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_seg43子程序設(shè)計(jì)startprocfarpushdsmovax,0pushaxmovax,datamovds,ax
movdata1,4356hcallbcdhexretstartendpbcdhexprocpushaxpushcxpushdx pushsipushdimovsi,data1
……movdata1,axpopdipopsipopdxpopcxpopaxretbcdhexendpcodeendsendstart44子程序設(shè)計(jì)通過堆棧傳遞參數(shù)在子程序調(diào)用之前將入口參數(shù)壓入堆棧。子程序根據(jù)當(dāng)前堆棧指針找到參數(shù)。
此種方法程序獨(dú)立性強(qiáng),高級語言編譯程序多采用該種方法。
例
在數(shù)據(jù)段data1和data2中存放兩個(gè)16位二進(jìn)制有符號數(shù),將其中較大數(shù)找出來存放于result中。datasegmentdata1dw3000data2dw-500resultdw?dataends45子程序設(shè)計(jì)ss_segsegmentstack db256dup(?)ss_segendscodesegmentassumecs:code,ds:data,ss:ss_segmainprocfar pushdssubax,axpushaxmovax,datamovds,ax
movax,data1pushax movax,data2pushax
callmaxpopcxpopcxmovresult,axretmainendpmaxproc
pushbpmovbp,sp
movdx,[bp+4]movax,[bp+6]cmpax,dxjgshortmax1movax,dxmax1:;movsp,bppopbpretmaxendpcodeends
endmain46子程序設(shè)計(jì)通過代碼段傳遞參數(shù)例在數(shù)據(jù)段中有一個(gè)16位二進(jìn)制無符號數(shù)var,計(jì)算下列表達(dá)式:var*10+600并把結(jié)果存于result單元中。datasegment vardw32767 resultdd?dataendsssegsegmentstack db100dup(?)ssegendscodesegmentassumecs:code,ds:data,ss:ss_seg47子程序設(shè)計(jì)startprocfar pushds movax,0 pushax movax,data movds,ax movax,var
callfunc dw10 dw600 leabx,r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五人投資合同范本
- 加盟裝修公司合同范本
- 化工煤炭采購合同范本
- 關(guān)鍵崗位用工合同范本
- 產(chǎn)權(quán)車位交易合同范本
- 乙方專利合同范本
- 企標(biāo)編制合同范本
- 業(yè)主施工安全合同范例
- 代加工木門合同范本
- 重大緊急情況的報(bào)告模板
- 二人合伙開寵物店協(xié)議書(5篇)
- 十字相乘法解一元二次方程專題練習(xí)
- 汽車維修競標(biāo)報(bào)價(jià)表格范本
- 2023年3月普通高等學(xué)校招生全國統(tǒng)一考試英語聽力天津卷A(聽力音頻+試題+答案+聽力原文)
- 坐標(biāo)紙(A4紙直接打印就可用)
- OGC網(wǎng)絡(luò)服務(wù)公共執(zhí)行規(guī)范課件
- 抖音博主在線寫電腦配置同款表格
- 中央空調(diào)基礎(chǔ)知識及發(fā)展史
- 品質(zhì)基礎(chǔ)及品質(zhì)意識培訓(xùn)資料
- 電力工程竣工驗(yàn)收報(bào)告
評論
0/150
提交評論