![微型計(jì)算機(jī)原理及接口技術(shù)第4章-匯編語言程序設(shè)計(jì)課件_第1頁](http://file4.renrendoc.com/view/2228857fb68a53282405805abf55e90b/2228857fb68a53282405805abf55e90b1.gif)
![微型計(jì)算機(jī)原理及接口技術(shù)第4章-匯編語言程序設(shè)計(jì)課件_第2頁](http://file4.renrendoc.com/view/2228857fb68a53282405805abf55e90b/2228857fb68a53282405805abf55e90b2.gif)
![微型計(jì)算機(jī)原理及接口技術(shù)第4章-匯編語言程序設(shè)計(jì)課件_第3頁](http://file4.renrendoc.com/view/2228857fb68a53282405805abf55e90b/2228857fb68a53282405805abf55e90b3.gif)
![微型計(jì)算機(jī)原理及接口技術(shù)第4章-匯編語言程序設(shè)計(jì)課件_第4頁](http://file4.renrendoc.com/view/2228857fb68a53282405805abf55e90b/2228857fb68a53282405805abf55e90b4.gif)
![微型計(jì)算機(jī)原理及接口技術(shù)第4章-匯編語言程序設(shè)計(jì)課件_第5頁](http://file4.renrendoc.com/view/2228857fb68a53282405805abf55e90b/2228857fb68a53282405805abf55e90b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第 4 章 匯編語言程序設(shè)計(jì)本章主要內(nèi)容4.1 匯編語言的基本語法4.2 偽指令4.3 系統(tǒng)功能調(diào)用4.4 匯編程序的功能及匯編過程4.5 匯編語言程序設(shè)計(jì)及舉例4.1.1 偽指令的語句格式4.1 匯編語言的基本語法特點(diǎn):不同于指令語句,偽指令語句(又稱命令語句)中的偽指令本身不產(chǎn)生對應(yīng)的機(jī)器目標(biāo)代碼功能:僅僅是告訴匯編程序,對后面的指令語句和偽指令語句的操作數(shù)應(yīng)該如何產(chǎn)生機(jī)器目標(biāo)代碼偽指令:稱為助記符或偽操作字段,這是偽指令語句不可省略的主要成分。 4.1.1 偽指令的語句格式操作數(shù):本字段是否需要,需要幾個(gè),需要什么樣的操作數(shù)等都由偽指令字段中偽指令來確定 。注釋:這是一個(gè)任選字段,它必須
2、以分號(hào)為開始,它的作用與指令語句的注釋字段相同 。 標(biāo)號(hào):又稱為標(biāo)號(hào)名字段,它是任選字段。目標(biāo)名后面不能用冒號(hào)“:”,這是與指令語句的突出區(qū)別 1.常數(shù) 是沒有任何屬性的純數(shù)值。在匯編期間,它的值已能完全確定,且在程序運(yùn)行中,它也不會(huì)發(fā)生變化 4.1 匯編語言的基本語法4.1.2 常數(shù)、變量和標(biāo)號(hào)2.變量 是代表存放在某些存儲(chǔ)單元的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)行期間隨時(shí)可以修改。 常常以變量名的形式出現(xiàn)在程序中,它可以認(rèn)為是存放數(shù)據(jù)存儲(chǔ)單元的符號(hào)地址。 (1)變量的定義與預(yù)置:定義變量就是給變量分配存儲(chǔ)單元,且對這個(gè)存儲(chǔ)單元賦予一個(gè)符號(hào)名變量名,同時(shí)將這些存儲(chǔ)單元預(yù)置初值。4.1.2 常數(shù)、變量和標(biāo)
3、號(hào)段屬性:表示變量存放在哪一個(gè)邏輯段中。 偏移量屬性:表示變量在邏輯段中離段起始點(diǎn)的字節(jié)數(shù)。 類型屬性:表示變量占用存儲(chǔ)單元的字節(jié)數(shù)。這一屬性是由數(shù)據(jù)定義偽指令DB,DW,DD來規(guī)定的。 VAR_DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW5678HVAR_DATAENDS(2)數(shù)據(jù)定義偽指令:這種偽指令主要為數(shù)據(jù)項(xiàng)分配存儲(chǔ)單元并預(yù)置初值。 4.1.2 常數(shù)、變量和標(biāo)號(hào)數(shù)值表達(dá)式。例如: DA_BYTEDB50H, 50 DA_WORDDW0A3F1H, 4981H?表達(dá)式:不帶引號(hào)的?表示可預(yù)置任何內(nèi)容。例如:DA_BDB?,?DA_WDW?,?4.1.2 常
4、數(shù)、變量和標(biāo)號(hào)字符串表達(dá)式:對于DB偽指令,為字符串中每一個(gè)字符分配一個(gè)字節(jié)單元。字符串必須是用引號(hào)括起來且不超過255個(gè)字符。字符串自左至右以字符的ASCII碼按地址遞增的排列順序依次存放。 例如: STRING1DBABCDEF4.1.2 常數(shù)、變量和標(biāo)號(hào)STRING2DWAB, CD, EFSTRING3DDAB, CD 帶DUP表達(dá)式:DUP是定義重復(fù)數(shù)據(jù)操作符 4.1.2 常數(shù)、變量和標(biāo)號(hào)其中表達(dá)式1是重復(fù)的次數(shù),表達(dá)式2是重復(fù)的內(nèi)容。例如:D_B1 DB20HDUP(?)D_B2 DB10HDUP(ABCD)D_W1 DW 10HDUP(4)3. 標(biāo)號(hào) 是一條指令目標(biāo)代碼的符號(hào)地址
5、,它常作為轉(zhuǎn)移指令(含子程序調(diào)用指令)的操作數(shù)。 4.1.2 常數(shù)、變量和標(biāo)號(hào)例如: LOP1: LOOPLOP1 JNE NEXT NEXT: (1)SEG格式:SEG功能是求符號(hào)名所在段的段基址。4.1 匯編語言的基本語法4.1.3 運(yùn)算符(2)OFFSET格式:OFFSET功能是求符號(hào)名所在段的偏移地址。(3)TYPE格式:TYPE 功能是獲得符號(hào)名類型值。 4.1.3 運(yùn)算符(4)SIZE格式:SIZE 功能是獲得為符號(hào)名分配的字節(jié)數(shù) 。 (5)PTR格式: PTR 功能是定義符號(hào)名為新類型。如,設(shè)內(nèi)存變量D1是字節(jié)屬性,把它的兩個(gè)字節(jié)內(nèi)容送到AX中。4.1.3 運(yùn)算符MOVAX, W
6、ORD PTR D1這里的符號(hào)名可以是間址、變址尋址、基址加變址表示的存儲(chǔ)器操作數(shù)。1. EQU格式: EQU 4.2.1符號(hào)定義偽指令(賦值語句)4.2 偽指令偽指令機(jī)器指令一一對應(yīng)特點(diǎn):偽指令不是由86系列CPU執(zhí)行,而是由MASM-86識(shí)別,并完成相應(yīng)的功能2. 格式: = 4.2.1 符號(hào)定義偽指令(賦值語句)注意:在同一程序中,用EQU語句賦值的符號(hào)名不能被重新賦值,但用“=”號(hào)賦值的符號(hào)名可以被重新賦值。1. 字節(jié)定義偽指令DB格式:名字 DB 功能:表達(dá)式或項(xiàng)表中的每一項(xiàng)是一個(gè)字節(jié)數(shù),他們從符號(hào)名地址開始按字節(jié)連續(xù)存放,直到表中數(shù)據(jù)項(xiàng)結(jié)束如:D1 DB 12H, 12H 12H
7、D1 DB 3 DUP (12H) MOV AX, D14.2.2 內(nèi)存數(shù)據(jù)定義偽指令4.2 偽指令注意: 表達(dá)式或數(shù)據(jù)項(xiàng)表多于一項(xiàng)時(shí),項(xiàng)與項(xiàng)之間用逗號(hào)“,”或空格分隔 表達(dá)式或數(shù)據(jù)項(xiàng)重復(fù)書寫時(shí),可用重復(fù)格式DUP 需考慮符號(hào)名的類型一致4.2.2 內(nèi)存數(shù)據(jù)定義偽指令2. 字定義偽指令DW格式:名字 DW 功能:表達(dá)式或項(xiàng)表中的每一項(xiàng)是兩個(gè)字節(jié)數(shù),其他同DB3. 雙字定義偽指令DD格式:名字 DD 功能:表達(dá)式或項(xiàng)表中的每一項(xiàng)是4個(gè)字節(jié)數(shù),在內(nèi)存中存放時(shí),低位字在前,高位字在后 格式: SEGMENT 定位方式連接方式類別名 ENDS功能:給存儲(chǔ)器在邏輯上分段,它為程序的匯編和連接說明了段名、
8、分段的各種屬性以及分段的開始和結(jié)束定位方式:又稱定位類型,指定段的起始地址邊界PAGEPARAWORDBYTE指定起始地址的低8位是0指定起始地址的低4位是0指定起始地址的最低位是0指定起始地址是任意值4.2.3 段定義偽指令4.2 偽指令1. SEGMENT/ENDS 連接方式:又稱組合類型,告訴連接程序本段與其他段可按某種方式連接PUBLICSTACK空缺(NONE)COMMONMEMORYAT 表達(dá)式把本段與其他同名同類型的段連接起來,共用一個(gè)段的起點(diǎn)地址,形成一個(gè)物理段表示本段是堆棧段,連接方式同PUBLIC表示本段不與任何段連接,是系統(tǒng)隱含連接方式表示本段與同名同類型的段共用同一段的
9、起點(diǎn)地址,即同名同類段相重疊,段的長度是最長段的長度表示本段在連接時(shí)定位在所有段之上,即高地址處表示本段定位在表達(dá)式值指定的段地址處類別名:需用單引號(hào)括起來,凡是類型名相同的段在連接時(shí)均按先后順序連接起來4.2.3 段定義偽指令例4-1 SEGMENT偽操作的定位類型應(yīng)用舉例。STACKSEGMENT STACKDB 100 DUP(?)STACKENDSDATA1SEGMENT BYTESTRINGDB This is an example!DATA1ENDSDATA2SEGMENTWORDBUFFERDW40 DUP(0)DATA2ENDS CODE1SEGMENT PAGE CODE1E
10、NDS4.2.3 段定義偽指令CODE2SEGMENTSTART:MOV AX,DATA1MOV DS,AXCODE2ENDSEND START4.2.3 段定義偽指令2. 段寄存器說明偽指令A(yù)SSUME格式:ASSUME 段寄存器:段定義名1 ,段寄存器:段定義名2, 3. 簡化段定義4.2.3 段定義偽指令簡化段定義格式可使用三種簡單的偽指令:“.CODE”、“.DATA”和“.STACK”來分別對應(yīng)寄存器CS、DS和SS 功能:告訴匯編程序在匯編時(shí),段寄存器CS:DS:SS:和ES:應(yīng)具有的符號(hào)段基址,以便匯編指令時(shí)確定段和建立錯(cuò)誤信息。但是段寄存器實(shí)際值(CS除外)還要有傳送指令在執(zhí)行
11、程序時(shí)賦值例如: .STACK 64 .DATA DATA1 DB 15H DATA2 DB 29H SUM DB ? .CODE MAIN PROC FAR MOV AX, DATA MOV DS, AX 4.2.3 段定義偽指令格式: PROC NEAR (或FAR) ENDP功能:定義過程是為了實(shí)現(xiàn)子程序調(diào)用而設(shè)的調(diào)用格式:CALL 過程由RET指令返回4.2.4 過程(子程序)定義偽指令4.2 偽指令1. 模塊開始偽指令格式:NAME 模塊名功能:指明程序模塊的開始,并指出模塊名,一般取源程序文件名為模塊名2. 模塊結(jié)束偽指令格式:END 啟動(dòng)標(biāo)號(hào)或過程名功能:告訴匯編程序源文件結(jié)束,
12、并給出執(zhí)行程序的入口位置4.2.5 模塊定義與連接偽指令4.2 偽指令1. .LIST 匯編程序遇到偽操作.LIST時(shí),禁止其后的源程序和目標(biāo)代碼在列表文件中輸出,直到下一個(gè).LIST為止。.LIST偽操作規(guī)定將后面的源程序和目標(biāo)代碼列表輸出。 4.2.6 列表偽指令4.2 偽指令2. TITLE格式: TITLE 標(biāo)題名 這個(gè)偽操作的功能是指定列表文件每一頁的標(biāo)題名,標(biāo)題名可以是不超過80個(gè)字符的字符串。4.2.6 列表偽指令3. PAGE格式:PAGE 行數(shù),行字?jǐn)?shù)功能:為列表文件定義每頁行數(shù)(10255)和每行字符數(shù)(60132),默認(rèn)值是66行,80列2. 定位偽指令ORG格式:ORG
13、 功能:把以下語句定義的內(nèi)存數(shù)據(jù)或程序,從表達(dá)式指定的起點(diǎn)(偏移地址)開始連續(xù)存放,直至遇到新的ORG指令。表達(dá)式值是一個(gè)無符號(hào)數(shù)4.2.7 其他偽操作4.2 偽指令1. RADIX格式:.RADIX 表達(dá)式 上述表達(dá)式的值應(yīng)在216之間 功能:設(shè)定基數(shù)DOS(Disk Operation System)和BIOS(Basic Input and Output System)為用戶提供了兩組系統(tǒng)服務(wù)程序。用戶程序可以調(diào)用這些系統(tǒng)服務(wù)程序。但在調(diào)用時(shí)應(yīng)注意:第一,不用CALL命令;第二,不用這些系統(tǒng)服務(wù)程序的名稱,而采用軟中斷指令I(lǐng)NT n;第三,用戶程序也不必與這些服務(wù)程序的代碼連接。 4.3
14、.1 概述4.3 系統(tǒng)功能調(diào)用BIOS是微機(jī)的基本I/O系統(tǒng)。包括系統(tǒng)測試程序、初始化引導(dǎo)程序、一部分中斷矢量裝入程序及外部設(shè)備的服務(wù)程序。 4.3.1 概述DOS是微機(jī)的操作系統(tǒng),負(fù)責(zé)管理系統(tǒng)的所有資源,協(xié)調(diào)微機(jī)的操作,其中包括大量的可供用戶調(diào)用的服務(wù)程序,完成設(shè)備的管理及磁盤文件的管理。1. 用戶與DOS的關(guān)系 4.3.1 概述2. 用戶程序控制微機(jī)硬件的方式 4.3.1 概述目的:為編寫匯編語言源程序提供方便,MS-DOS系統(tǒng)中設(shè)置了幾十個(gè)內(nèi)部子程序,它們可以完成I/O設(shè)備管理、存儲(chǔ)管理、文件管理、作業(yè)管理等功能注意: MS-DOS系統(tǒng)中設(shè)置的幾十個(gè)內(nèi)部子程序,可看成內(nèi)部中斷服務(wù)程序,用
15、軟中斷指令調(diào)用。常用的中斷矢量號(hào)為20H27H4.3.2 DOS系統(tǒng)功能調(diào)用4.3 系統(tǒng)功能調(diào)用4.3.2 DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用的格式: 傳送入口參數(shù)到指定寄存器中(可選項(xiàng)) 功能號(hào)送入AH寄存器 INT 21H4.3.2 DOS系統(tǒng)功能調(diào)用INT 21H是一個(gè)具有近90個(gè)子功能的中斷服務(wù)程序,這些子功能的編號(hào)稱為功能號(hào)。INT 21H的功能大致可以分為四個(gè)方面,即設(shè)備管理、目錄管理、文件管理和其他 (1)鍵盤輸入單字符矢量號(hào)21H功能號(hào):AH=1入口參數(shù):無格式: MOV AH, 1 INT 21H功能:執(zhí)行時(shí),系統(tǒng)等待鍵盤輸入,待程序員按下任何一鍵,系統(tǒng)先檢查是否Ctrl-Bre
16、ak鍵,如果是則退出,否則將該鍵字符的ASCII碼置入AL寄存器中,并在屏幕上顯示該字符注意:沒有入口參數(shù)4.3.2 DOS系統(tǒng)功能調(diào)用(2)鍵盤輸入字符串矢量號(hào)21H功能號(hào):AH=0AH入口參數(shù):內(nèi)存中保存字符串的首地址格式: BUFDB20DB?DB20,DUP(?)MOVDX,OFFSET BUFMOVAH,0AHINT21H功能:將鍵盤輸入的字符串寫入到內(nèi)存緩沖區(qū)中;定義緩沖區(qū);0AH號(hào)系統(tǒng)功能調(diào)用4.3.2 DOS系統(tǒng)功能調(diào)用注意: 必須事先在內(nèi)存儲(chǔ)器中定義一個(gè)緩沖區(qū),其第一字節(jié)給定該緩沖區(qū)中能存放的字節(jié)數(shù),第二字節(jié)留給系統(tǒng)填寫實(shí)際鍵入的字符個(gè)數(shù),從第三個(gè)字節(jié)開始用來存放鍵入的字符串
17、,最后鍵入回車()鍵表示字符串結(jié)束如果實(shí)際鍵入的字符數(shù)不足填滿緩沖區(qū)時(shí),則其余字節(jié)填“0”如果實(shí)際鍵入的字符數(shù)超過緩沖區(qū)的容量,則超出的字符將被丟失,而且響鈴,表示向程序員發(fā)出警告4.3.2 DOS系統(tǒng)功能調(diào)用(3)輸出單字符矢量號(hào)21H功能號(hào):AH=2入口參數(shù):DL中的內(nèi)容為輸出字符格式: MOVDL,A MOVAH,2 INT21H功能: 置入DL寄存器中的字符從屏幕上顯示輸出(或打印機(jī)打印輸出)4.3.2 DOS系統(tǒng)功能調(diào)用(4)輸出字符串矢量號(hào)21H功能號(hào):AH=9入口參數(shù):DX中的內(nèi)容為輸出字符串的首地址格式: BUF DB good bye $MOVDX,OFFSET BUFMOV
18、AH,9INT21H功能:是將指定的內(nèi)存緩沖區(qū)中的字符串從屏幕上顯示輸出來(或打印輸出)注意:緩沖區(qū)中的字符串必須以“$”字符作為結(jié)束標(biāo)志4.3.2 DOS系統(tǒng)功能調(diào)用(5)直接控制臺(tái)輸入/輸出單字符矢量號(hào)21H功能號(hào):AH=6入口參數(shù):DL格式: MOV DL,0FFH MOV AH,6 INT 21H MOV DL,A MOV AH,6 INT 21H;鍵盤輸入單字符送AL中(DL=FFH);將DL中的字符“A”送屏幕顯示(DLFFH)4.3.2 DOS系統(tǒng)功能調(diào)用矢量號(hào) 21H功能號(hào): AH=7入口參數(shù):無4.3.2 DOS系統(tǒng)功能調(diào)用功能:如果(DL)0FFH,則表示是從鍵盤輸入單字符
19、送AL寄存器中 如果(DL)0FFH,則表示是將DL寄存器中內(nèi)容送屏幕顯示輸出(6)無回顯直接控制臺(tái)輸入單字符格式:MOVAH,7 INT21H功能:等待從標(biāo)準(zhǔn)輸入設(shè)備輸入單字符置入AL寄存器中,但不送屏幕顯示。 4.3.2 DOS系統(tǒng)功能調(diào)用矢量號(hào) 21H功能號(hào): AH=8入口參數(shù):無(7)無回顯鍵盤輸入單字符格式: MOVAH,8 INT21H功能:等待從鍵盤輸入單字符,將其ASCII碼置入AL寄存器中,但不送屏幕顯示 4.3.2 DOS系統(tǒng)功能調(diào)用矢量號(hào) 21H功能號(hào): AH=3入口參數(shù):無(8)從串口輸入單字符格式: MOVAH,3 INT21H功能:系統(tǒng)將從異步通信口串行輸入的字符置
20、入AL寄存器中。4.3.2 DOS系統(tǒng)功能調(diào)用矢量號(hào) 21H功能號(hào): AH=4入口參數(shù):DL中的內(nèi)容為串口輸出的字符 (9)從串口輸出單字符格式: MOVDL,$ MOVAH,4 INT21H功能:執(zhí)行結(jié)果將DL寄存器中的字符通過異步通信口串行輸出。 (10)返回操作系統(tǒng)矢量號(hào) 21H功能號(hào): AH=4CH入口參數(shù):無格式: MOV AH, 4CH INT 21H功能: 結(jié)束當(dāng)前正在執(zhí)行的程序,并返回操作系統(tǒng)。屏幕顯示操作系統(tǒng)提示符(N),N為當(dāng)前使用的驅(qū)動(dòng)器名4.3.2 DOS系統(tǒng)功能調(diào)用(11)設(shè)置日期矢量號(hào) 21H功能號(hào): AH=2BH入口參數(shù):CX中的內(nèi)容為設(shè)置年的BCD碼;DH、DL
21、中的內(nèi)容分別為月及日的BCD碼 格式: MOVCX,2010H MOVDH,01H MOVDL,12H MOV AH,2BH INT21H功能:如果沒有設(shè)置成功,則0AL寄存器,否則0FFHAL寄存器。 4.3.2 DOS系統(tǒng)功能調(diào)用(12)取得日期矢量號(hào) 21H功能號(hào): AH=2AH入口參數(shù):無格式: MOV AH, 2AH INT 21H功能:將當(dāng)前有效日期取到CX和DX寄存器中,存放格式與設(shè)置日期時(shí)相同 4.3.2 DOS系統(tǒng)功能調(diào)用(13)設(shè)置時(shí)間矢量號(hào) 21H功能號(hào): AH=2DH入口參數(shù):CH、CL中的內(nèi)容分別為小時(shí)及分鐘的BCD碼;DH、DL中的內(nèi)容分別為秒及百分之一秒的BCD碼
22、。 格式:MOVCX,0815H MOVDX,2050H MOV AH, 2DH INT 21H功能:設(shè)置有效時(shí)間。如果設(shè)置成功,則將AL寄存器內(nèi)容清“0”。否則將AL寄存器置全“1”。 4.3.2 DOS系統(tǒng)功能調(diào)用(14)取得時(shí)間矢量號(hào) 21H功能號(hào): AH=2CH入口參數(shù):無 格式: MOV AH, 2CH INT 21H功能:將當(dāng)前時(shí)間置入CX和DX寄存器中,存放格式與設(shè)置時(shí)間相同。 4.3.2 DOS系統(tǒng)功能調(diào)用(15)檢查鍵盤狀態(tài)矢量號(hào) 21H功能號(hào): AH=0BH入口參數(shù):無 格式: MOV AH, 0BH INT 21H功能:可以檢查是否有字符鍵入。如果有鍵按下使AL=FFH,
23、否則AL=00H。 4.3.2 DOS系統(tǒng)功能調(diào)用4.3.3 BIOS中斷調(diào)用4.3 系統(tǒng)功能調(diào)用特點(diǎn): (1)調(diào)用BIOS程序雖然比調(diào)用DOS程序要復(fù)雜一些,但運(yùn)行速度快,功能更強(qiáng);(2)DOS的中斷功能只是在DOS的環(huán)境下適用,而BIOS功能調(diào)用不受任何操作系統(tǒng)的約束;(3)某些功能只有BIOS具有。 1. 鍵盤服務(wù)程序4.3.3 BIOS中斷調(diào)用鍵盤服務(wù)程序的中斷類型號(hào)為16H,用INT 16H調(diào)用。 2. 打印機(jī)服務(wù)程序 打印機(jī)服務(wù)程序的中斷類型號(hào)為17H,通過指令I(lǐng)NT 17H調(diào)用。軟中斷INT 17H 服務(wù)程序有三個(gè)功能,功能號(hào)為0、1、2,其中打印一字符的功能號(hào)為0,入口參數(shù)是將
24、打印字符的ASCII碼送入AL中,打印機(jī)號(hào)(02)送入DX中。 3.顯示器服務(wù)程序特點(diǎn):顯示器服務(wù)程序的中斷類型號(hào)為10H,通過指令I(lǐng)NT 10H調(diào)用。軟中斷INT 10H服務(wù)程序有16個(gè)功能,功能號(hào)為015。 (1)設(shè)置顯示方式矢量號(hào): 10H功能號(hào): AH0入口參數(shù):AL常用顯示方式號(hào)(06)4.3.3 BIOS中斷調(diào)用 顯示方式號(hào) 顯示方式 0 40列25行黑白文本方式 1 40列25行彩色文本方式 2 80列25行黑白文本方式 3 80列25行彩色文本方式 4 320列200行黑白圖形方式 5 320列200行彩色圖形方式 6 640列200行黑白圖形方式注意:對于高分辨率,只支持黑白
25、顯示例:屏幕設(shè)置成8025彩色文本方式程序: MOVAH,0;設(shè)功能號(hào) MOVAL,3 ;設(shè)顯示方式 INT10H4.3.3 BIOS中斷調(diào)用(2)設(shè)置光標(biāo)位置矢量號(hào): 10H功能號(hào): AH2入口參數(shù): BH頁號(hào),通常取0頁 DH行號(hào),取值024 DL列號(hào),對于40列文本,取值039 對于80列文本,取值079程序:MOVBH, 0MOVDH, 10MOVDL, 30MOV AH, 2INT10H例:將光標(biāo)置在第10行30列4.3.3 BIOS中斷調(diào)用(3)設(shè)置屏幕上/下滾動(dòng)矢量號(hào): 10H功能號(hào): AH6/7入口參數(shù): AL=上/下滾動(dòng)的行數(shù),當(dāng)AL=0時(shí),表示清屏幕 CH=滾動(dòng)區(qū)域左上角的
26、行; CL=滾動(dòng)區(qū)域左上角的列 DH=滾動(dòng)區(qū)域右下角的行; DL=滾動(dòng)區(qū)域右下角的列 BH=上/下滾動(dòng)后空留區(qū)的顯示屬性4.3.3 BIOS中斷調(diào)用(4)在當(dāng)前光標(biāo)處寫字符和屬性 矢量號(hào): 10H 功能號(hào): AH9 入口參數(shù): BH頁號(hào) AL顯示字符的ASCII碼 BL屬性 CX重復(fù)顯示的次數(shù)L位為1時(shí)表示背景閃爍,否則不閃I位為1時(shí)表示前景為高亮度,否則為一般亮度4.3.3 BIOS中斷調(diào)用文本方式16種顏色的組合例4-2:用蘭色清屏,然后在第10行30列顯示20個(gè)紅底白字A程序:MOVAL, 0 ;AL=0時(shí),清屏參數(shù) MOVBL, 10H ;藍(lán)色背景,無閃爍,屬性BL MOVAH, 6
27、;清屏功能號(hào)6 MOVCX, 0 ;從0行到0列4.3.3 BIOS中斷調(diào)用MOVDH, 24 ;到24行MOVDL, 79 ;79列INT10H ;清屏幕MOVAH, 2MOVBH, 0 ;頁號(hào)MOV DH, 10MOVDL, 30INT10H ;光標(biāo)設(shè)置在第10行30列MOVAL, AMOVCX, 20 ;重復(fù)顯示20個(gè)字符AMOVBH, 0 ;頁號(hào)MOVBL, 4FH ;屬性BL,紅底,白字MOVAH, 9INT10H ;顯示20個(gè)字母A4.3.3 BIOS中斷調(diào)用(6)設(shè)置圖形方式顯示的背景和彩色組矢量號(hào):10H功能號(hào):AH0BH入口參數(shù):當(dāng)BH0時(shí),BL背景顏色,范圍015 當(dāng)BH1
28、時(shí),BL顏色組, 范圍01: 0表示綠/紅/黃,1表示青/品紅/白矢量號(hào):10H功能號(hào):AH0AH入口參數(shù):BH=頁號(hào); AL顯示字符的ASCII碼; CX重復(fù)顯示的次數(shù) (5)在光標(biāo)位置寫字符(不改變屬性)4.3.3 BIOS中斷調(diào)用(7)寫光點(diǎn)矢量號(hào):10H功能號(hào):AH0CH入口參數(shù):DX=行號(hào),CX列號(hào),AL彩色值(當(dāng)AL第7位為1時(shí),原顯示彩色與當(dāng)前彩色作按位加運(yùn)算)。 4.3.3 BIOS中斷調(diào)用例4-3 請編寫一個(gè)程序,來實(shí)現(xiàn)以下目標(biāo):(1)清除屏幕(2)把模式設(shè)為分辨率為640200的CGA模式(3)畫一條水平直線,它的起始點(diǎn)位:行=50,列=100;它的終點(diǎn)為行=50,列=20
29、0。4.3.3 BIOS中斷調(diào)用 .MODEL SMALL .STACK 64 .CODE MAIN PROC FARMOVAX,0600H;屏幕翻轉(zhuǎn)MOVBH,07;正常屬性MOVCX,0;從行=0,列=0MOVDX,184FH;到行=18H,列=4FHINT 10H;清屏 MOVAH,0 MOVAL,6;模式為CGA高分辨率 INT10H;設(shè)定模式 MOVCX,100;線起始列=100 MOVDX,50;線起始行=50PlayLine:MOVAH,0CH;畫線 MOVAL,01 INT10H INCCX;列像素加1 CMPCX,200;畫線直到列=200 JNZPlayLine MOVAH
30、,4CH;返回DOS INT 21HMAIN ENDP END4.3.3 BIOS中斷調(diào)用矢量號(hào):14H功能號(hào):AH0H入口參數(shù):AL初始化參數(shù),DX0表示對COM1初 始化;DX=1表示對COM2初始化4.串行服務(wù)程序4.3.3 BIOS中斷調(diào)用(1)串行通信口初始化位7、6、5表示波特率:0 00 110波特0 01 150波特0 10 300波特0 11 600波特1 00 1200波特1 01 2400波特1 10 4800波特1 11 9600波特位4、3表示奇偶校驗(yàn)設(shè)定:00無奇偶校驗(yàn)01奇校驗(yàn)11偶校驗(yàn)位2表示停止位數(shù)設(shè)定01位停止位12位停止位位1、0表示通信數(shù)據(jù)位數(shù)設(shè)定107
31、位數(shù)據(jù)通信118位數(shù)據(jù)通信4.3.3 BIOS中斷調(diào)用(2)串行通信口輸出矢量號(hào):14H功能號(hào):AH1入口參數(shù):AL待輸出數(shù)據(jù) DX0 表示從COM1輸出; DX=1 表示從COM2輸出。矢量號(hào):14H功能號(hào):AH2入口參數(shù):DX0表示COM1從輸入; DX=1表示從COM2輸入。返回參數(shù):成功時(shí),AH第7位0,AL輸入數(shù)據(jù); 失敗時(shí),AH第7位1,AH第0到6位通信口狀態(tài)。(3)串行通信口輸入4.3.3 BIOS中斷調(diào)用位0為1時(shí)表示接收數(shù)據(jù)準(zhǔn)備好;位1為1時(shí)表示超越錯(cuò);位2為1時(shí)表示奇偶錯(cuò);位3為1時(shí)表示幀格式錯(cuò);位4為1時(shí)表示間斷;位5為1時(shí)表示發(fā)送保持器空;位6為1時(shí)表示發(fā)送移位寄存器
32、空;位7為0時(shí)表示正確;為1時(shí)表示錯(cuò)誤。4.3.3 BIOS中斷調(diào)用匯編器的主要功能是將由匯編語言(助記符)編寫的源程序翻譯成用機(jī)器語言(二進(jìn)制代碼)編寫的目標(biāo)程序 。4.4.1 匯編器的功能4.4 匯編器的功能及匯編過程匯編語言的源程序一般要經(jīng)過編輯、匯編(MASM或ASM)、連接(LINK)和調(diào)式(DEBUG)等步驟。4.4.2 程序的編輯、匯編及連接過程 4.4 匯編器的功能及匯編過程1. 建立源程序文件建立源程序文件用編輯軟件完成,常用的編輯軟件有行編輯EDLIN,全屏幕編輯WORDSTAR等。2.匯編(MASM或ASM)源程序 微機(jī)提供了兩種匯編程序版本:一種是全型版本(MASM);
33、另一種是小型版本(ASM)。 (1)提問方式 在MS-DOS下輸入命令行:MASM或ASM4.4.2 程序的編輯、匯編及連接過程(2)命令方式以命令方式啟動(dòng)匯編器時(shí),必須在MS-DOS下輸入下列格式的命令:MASM(或ASM ) ,3. 程序連接 連接器LINK用來連接匯編器生成的目標(biāo)代碼文件(.OBJ)以及指定的庫文件,產(chǎn)生一個(gè)可執(zhí)行的裝入文件(.EXE)。 (1)提問方式 在MS-DOS下輸入命令行:LINK4.4.2 程序的編輯、匯編及連接過程(2)命令方式以命令方式啟動(dòng)連接程序時(shí),必須在MS-DOS下輸入如下格式的命令:LINK ,4. 執(zhí)行程序在DOS提示符下,鍵入連接程序所產(chǎn)生的可
34、執(zhí)行文件的名字后,即可執(zhí)行該程序。例如:A:Exe1(擴(kuò)展名EXE可默認(rèn))4.5.1 程序設(shè)計(jì)步驟及格式(1)分析問題(2)建立數(shù)學(xué)模型(3)確定算法(4)繪制程序流程圖(5)內(nèi)存空間分配(6)編制程序與靜態(tài)檢查(7)程序調(diào)試(實(shí)驗(yàn))開始結(jié)束初始化處理處理分支是否4.5 匯編語言程序設(shè)計(jì)及舉例1. 程序設(shè)計(jì)的步驟DATASEGMENT 存放數(shù)據(jù)項(xiàng)的數(shù)據(jù)段DATAENDSEXTRASEGMENT 存放數(shù)據(jù)項(xiàng)的附加段EXTRAENDSSTACK1SEGMENTPARASTACK 作堆棧用的堆棧段STACK1ENDS4.5.1 程序設(shè)計(jì)步驟及格式2. 匯編語言源程序的格式 COSEGSEGMENTA
35、SSUMECS: COSEG, DS: DATA ASSUMESS: STACK1, ES: EXTRASTART PROC FAR MOVAX, DATAMOVDS, AX 存放指令序列COSEGENDSENDSTART4.5.1 程序設(shè)計(jì)步驟及格式簡化段定義形式 : .MODEL SMALL .STACK ? .DATA 存放數(shù)據(jù)項(xiàng)的數(shù)據(jù)段 .EXTRA 存放數(shù)據(jù)項(xiàng)的附加段 .CODE START PROC FAR MOV AX, DATA MOV DS, AX 存放指令序列 STARTENDP END4.5.1 程序設(shè)計(jì)步驟及格式特點(diǎn):計(jì)算機(jī)執(zhí)行程序的方式是“從頭到尾”逐條執(zhí)行指令語句,
36、直至程序結(jié)束4.5.2 順序結(jié)構(gòu)程序設(shè)計(jì)4.5 匯編語言程序設(shè)計(jì)及舉例例4-4:內(nèi)存中某一單元,其偏移地址為50H。將該單元的內(nèi)容拆成兩段,每段4位,并將它們分別存入偏移地址為51H和52H單元中;即50H單元中的低4位放入51H單元的低4位, 50H單元中的高4位放入52H單元的低4位,而51H和52H單元的高4位均為零。 流程圖:開始暫停邏輯右移得高4位,存入內(nèi)存10052H單元用邏輯與指令將該數(shù)“與”0FH取得低四位,存入內(nèi)存10051H單元初始化用間址方法取數(shù) AL再取出原始數(shù) AL分析題目:假設(shè)內(nèi)存50H單元中的內(nèi)容為7AH,題目要求將7AH拆成07H和0AH兩部分,并把0AH放在5
37、1H單元中,07H放在52H單元中。 4.5.2 順序結(jié)構(gòu)程序設(shè)計(jì)程序: DATA SEGMENT ORG 50H Data1 DB 7AH Data2 DB ? Data3 DB ? DATA ENDS STACK SEGMENT STA1 DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START PROC FAR PUSH DS XOR AX, AX PUSH AX4.5.2 順序結(jié)構(gòu)程序設(shè)計(jì)4.5.2 順序結(jié)構(gòu)程序設(shè)計(jì) MOV AX,DATA MOV DS,AX;DS1000H MOV SI
38、, Data1 ;需拆字節(jié)的指針SI=50H MOV AL,SI;取一個(gè)字節(jié)到AL中 MOV BL,AL; (BL)(AL),內(nèi)容備份 ANDAL,0FH;把AL的前4位清0 MOVSI, Data2;(SI)=51H MOVSI, AL;把得到的后4位(10051H) MOVAL, BL;再取出需拆字節(jié)(AL) MOVCL, 4 SHRAL, CL;邏輯右移4次,前4位補(bǔ)0 MOVSI, Data3;(SI)=52H MOVSI, AL;(10052H)(AL)COSEGENDS ENDSTART 利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根據(jù)條件(即上面運(yùn)算的情況)是否滿足,改變程序執(zhí)行的
39、次序特點(diǎn):先用比較指令、數(shù)據(jù)操作、位測指令等改變標(biāo)志寄存器各個(gè)標(biāo)志位,然后用條件轉(zhuǎn)移指令進(jìn)行分支4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)4.5 匯編語言程序設(shè)計(jì)及舉例例4-5:編程實(shí)現(xiàn)AX累加器和BX寄存器中兩個(gè)無符號(hào)數(shù)之差的絕對值,將其結(jié)果存放在內(nèi)存2800H單元中。 4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)分析題目:此題目中,AX累加器和BX寄存器中的數(shù)是不知道的。對兩個(gè)不知道大小的數(shù)相減并求絕對值,應(yīng)該先判定哪一個(gè)值稍大些,然后再用大數(shù)減去小數(shù)的方法,可求得絕對值。 流程圖:4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)程序: .MODEL SMALL .STACK 64 .DATAORG 2800HAbsData DW ? .
40、CODE ABSPRGPROC FAR MOV AX, DATA MOV DS, AX CLC ;CF=0 MOV DX, AX ;(DX)(AX) SUB AX, BX ;(AX)(AX)(BX)4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì) JCLow;若CF=1轉(zhuǎn)Low去執(zhí)行 MOVBX, AX; (BX)(AX) JMPOut;結(jié)果輸出Low:SUBBX, DX; (BX)(BX)(DX)Out:MOVDI, AbsData;結(jié)果指針(DI)=2800HMOVDI, BXABSPRG ENDP END4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)例4-6:從外設(shè)(其端口號(hào)為71H)中取一個(gè)數(shù)M,判斷其值是否在10和20之
41、間,即10M20。如果M20,則送0FFH給外設(shè)(其端口號(hào)為73H);如果M10,則送00H給該外設(shè);如果10M20,則送88H給該外設(shè)。請編寫程序?qū)崿F(xiàn)。 4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)分析題目:根據(jù)題意,我們可以看出這是一個(gè)需要兩次判斷M大小的問題。我們可以先判M是否大于10,再判M是否大于20。流程圖:4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì) .MODEL SMALL .STACK 64 .DATAPrtAdd1 DB 71HPrtAdd2 DB 73H .CODE PRTPRG PROC FAR MOV AX, DATA MOV DS, AX INAL, PrtAdd1;(AL)71H端口的字節(jié)CLC
42、;CF=0CMPAL, 10;將(AL)與10比較JCValLow10;小于10轉(zhuǎn)ValLow104.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)程序:CMPAL, 20 ;將(AL)與20相比較 JCVal10To20 ;10(AL)20轉(zhuǎn) Val10To20 MOVBL, 0FFH ;(BL)0FFH JMPOutputValLow10: MOVBL, 00 JMPOutputVal10To20:MOVBL, 88HOutput: MOVAL, BL OUTPrtAdd2, AL ;將0FFH輸出到73H端口PRTPRG ENDP END4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)注意:判斷次序!4.5.3 分支結(jié)構(gòu)程序設(shè)計(jì)
43、強(qiáng)制CPU重復(fù)執(zhí)行某一指令系列(程序段)的一種程序結(jié)構(gòu)形式組成:初始化循環(huán)體循環(huán)控制循環(huán)結(jié)束處理4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)4.5 匯編語言程序設(shè)計(jì)及舉例例4-7:設(shè)有兩個(gè)數(shù)位于內(nèi)存數(shù)據(jù)段中,其偏移地址為0050H,且連續(xù)存放,低位在小地址一端。這兩個(gè)多字節(jié)數(shù)均為8個(gè)字節(jié)長。求這兩個(gè)多字節(jié)數(shù)之和,其結(jié)果存放在這兩個(gè)數(shù)之后。請編程實(shí)現(xiàn)。4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)分析題目:這是一個(gè)重復(fù)累加內(nèi)存單元中數(shù)的問題,因此可以采用循環(huán)結(jié)構(gòu)程序解決。因?yàn)?0 x86系列指令系統(tǒng)可以一次性處理16位數(shù),所以循環(huán)次數(shù)為4次。流程圖:程序: .MODEL SMALL .STACK 64 .DATA ORG 50H
44、LopDat1 DB 23H, 56H, 45H, 63H, 78H, 66H, 90H,42HLopDat2 DB 13H, 44H, 86H, 80H, 24H, 64H, 56H, 60HDatSum DB 8 DUP (?) .CODE LOPPRG PROC FAR MOV AX, DATA MOV DS, AX MOVSI, LopDat1;第一個(gè)數(shù)指針(SI)=0050H4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)MOVDI, LopDat2;第二個(gè)數(shù)指針(DI)=0058HMOVBX, DatSum;結(jié)果指針(BX)=0060HMOVCX, 4;循環(huán)(CX)=4CLC;清進(jìn)位CF=0Add4N
45、ums: MOVAX, SI; (AX)(SI),取一個(gè)字ADCAX, DI;(AX)(AX)+(DI)+CFMOVBX, AX;存一個(gè)字到(BX)PUSHF;CF進(jìn)棧保護(hù)ADDSI, 2;修改第一個(gè)數(shù)的地址指針(SI)(SI)+2ADDDI, 2 ;修改第二個(gè)數(shù)的地址指針(DI)(DI)+2ADDBX, 2;修改結(jié)果指針(BX)(BX)+2POPF;修復(fù)標(biāo)志寄存器LOOPAdd4Nums;(CX)(CX)1,若(CX)0轉(zhuǎn)Add4NumsLOPPRG ENDP END4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)例4-8:設(shè)計(jì)一個(gè)軟件延時(shí)程序,要求延時(shí)時(shí)間1ms分析題目:此題是想讓微機(jī)做一些無用的操作,來拖延
46、時(shí)間。我們可以從指令手冊中查得各條指令所需的時(shí)鐘周期,但一般一條指令執(zhí)行時(shí)間只有幾個(gè)時(shí)鐘周期,亦即只有幾個(gè)微秒,為了能用較少的指令來編寫較長時(shí)間的延時(shí),我們可以利用循環(huán)程序結(jié)構(gòu)。 4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 延時(shí)時(shí)間主要取決于循環(huán)體及循環(huán)次數(shù)。從指令表上可以查得PUSHF和POPF指令分別為10和8個(gè)時(shí)鐘節(jié)拍,LOOP BX指令為3.4個(gè)時(shí)鐘節(jié)拍,即此循環(huán)體需要用1083.421.4拍,而每個(gè)時(shí)鐘節(jié)拍是根據(jù)系統(tǒng)的晶振頻率而定的。假設(shè)此系統(tǒng)用的是8MHz的晶振,則每個(gè)時(shí)鐘節(jié)拍需要0.125s,因此可以根據(jù)下列公式算出循環(huán)次數(shù): 流程圖:4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì) .MODEL SMALL .
47、STACK 64 .CODE PRG1MSPROC FAR MOV AX, DATA MOV DS, AXMOVCX, 110H;初始化,設(shè)定循環(huán)次數(shù)(CX)=272Delay1ms:PUSHF;循環(huán)體POPFLOOPDelay1ms;(CX)(CX)1,若(CX)0轉(zhuǎn)Delay1msPRG1MS ENDP END程序:4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)如果想延長1s時(shí)間,則需要執(zhí)行上述程序1000次??梢酝ㄟ^雙循環(huán)的方法來解決 ,程序如下:.MODEL SMALL .STACK 64 .CODE PRG1S PROC FAR MOV AX, DATA MOV DS, AXMOVBX, 3E8H ;
48、(BX)1000延時(shí)1ms程序段Delay1s: MOV CX, 110HDelay1ms: PUSHF POPF LOOPDelay1ms DECBX ;(BX)(BX)1 JNZDelay1s ;ZF=0時(shí),轉(zhuǎn)至Delay1s,即(BX)0時(shí)轉(zhuǎn) PRG1S ENDP END4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)例4-9:假設(shè)有一16位二進(jìn)制數(shù)位于內(nèi)存數(shù)據(jù)段中,其偏移地址為0050H,將其轉(zhuǎn)換為ASCII碼,并將轉(zhuǎn)換結(jié)果存放在該數(shù)據(jù)段中,其偏移地址為0052H,且連續(xù)存放,請編程實(shí)現(xiàn)。 4.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)分析題目:在微機(jī)中,算術(shù)運(yùn)算的結(jié)果是二進(jìn)制的。為了把結(jié)果以十進(jìn)制的方式顯示,它首先被轉(zhuǎn)換
49、為十進(jìn)制,然后各個(gè)位上的數(shù)字被加上30H以轉(zhuǎn)換為ASCII數(shù)據(jù),這樣才能被顯示或打印出來。第一步是把二進(jìn)制的數(shù)字轉(zhuǎn)換為十進(jìn)制。假設(shè)內(nèi)存(0051H)和(0050H)中存放著34DH,按照第1章1.2節(jié)的方法,把34DH轉(zhuǎn)換為十進(jìn)制:34DH 31624161D(即13)160 =325641613845另一種把十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制的方法是把它反復(fù)地除以10(0AH),記錄下各次得到的余數(shù),直到商小于10為止。具體過程如下: 34DH/0AH = 54H余數(shù)5 54H/0A H= 8 余數(shù)4 8(0,則繼續(xù)循環(huán) JA T10toAsc BINToASCPRG ENDP END4.5.4 循環(huán)結(jié)
50、構(gòu)程序設(shè)計(jì)CALLRET4.5.5 子程序設(shè)計(jì)4.5 匯編語言程序設(shè)計(jì)及舉例(1)子程序設(shè)計(jì)與應(yīng)用應(yīng)注意的問題現(xiàn)場保護(hù)與恢復(fù)參數(shù)傳遞子程序說明(2)子程序調(diào)用技巧子程序嵌套子程序遞歸可重入子程序 協(xié)同子程序4.5.5 子程序設(shè)計(jì)例4-11:內(nèi)存中有一個(gè)數(shù)據(jù)塊,找出其中的最大數(shù)。數(shù)據(jù)塊的長度大于1,并且存放在內(nèi)存偏移地址2001H單元中,而數(shù)據(jù)塊本身是從內(nèi)存偏移地址2002H單元開始存放的,最后,把找出的最大值放到內(nèi)存偏移地址2000H單元中。假設(shè)這個(gè)數(shù)據(jù)塊中的數(shù)都是無符號(hào)的8位數(shù)。請編程實(shí)現(xiàn)。 4.5.5 子程序設(shè)計(jì)分析題目:此題應(yīng)是個(gè)循環(huán)程序,而且在處理部分應(yīng)包括判斷分支環(huán)節(jié)。 流程圖:;子
51、程序名:MAX;入口參數(shù):數(shù)據(jù)塊的長度(在LenData單元中)和數(shù)據(jù)塊的首地址(Datas);出口參數(shù):最大值(存放在MaxData單元中) .MODEL SMALL .STACK 64 .CODE MAXPRGPROC FAR MOV AX, DATA MOV DS, AXMAX:PUSHFPUSHAXPUSHCXPUSHSI4.5.5 子程序設(shè)計(jì)程序: MOVSI, LenData ;指針指向數(shù)據(jù)塊長度的單元 MOVCL, SI ;取出數(shù)據(jù)塊長度作為循環(huán)次數(shù) MOVSI, Datas ;指針指向第一個(gè)數(shù) MOVAL, 00 ;設(shè)置最大值00 MOVCH, 00 ;初始化FindMAX:
52、CLC ;清除進(jìn)位位 CMPAL, SI ;取出數(shù)與最大值比較 JC Low ;若(AL)數(shù)小,轉(zhuǎn)到Low JMP High ;若(AL)數(shù)大,跳過去Low:MOVAL, SI ;把大數(shù)放到(AL)中保存High:INC SI ;指針下移 LOOP FindMAX ;次數(shù)減1,判斷循環(huán)結(jié)束否MOV DI, MaxData MOV DI, AL ;把最大值放到指定單元保存4.5.5 子程序設(shè)計(jì)POPSIPOPCXPOPAXPOPFRETMAXPRG ENDP END4.5.5 子程序設(shè)計(jì)例4-12:內(nèi)存中有一數(shù)組,其首地址為ARRAY,求該數(shù)組所有元素之和(不超過16位數(shù))并存于內(nèi)存SUM單元中
53、,請編寫子程序?qū)崿F(xiàn)。;方法一:利用寄存器傳遞參數(shù);子程序名:ArraySum;入口參數(shù):SI中的內(nèi)容為數(shù)組首地址,CX中的內(nèi)容為數(shù)組長度;出口參數(shù):AX中的內(nèi)容為該數(shù)組的和 .MODEL SMALL .STACK 64 .CODEArraySumPRGPROC FAR MOV AX, DATA MOV DS, AX CLC;CF=0CMPCX, 0;判斷是否結(jié)束JZEXITMOVAX, 0;(AX)=0A_Sum:ADDAL, SI;加數(shù)組中的一個(gè)元素ADCAH, 0INCSILOOPA_Sum POPFEXIT:RETArraySumPRG ENDP END4.5.5 子程序設(shè)計(jì);方法二:利
54、用存儲(chǔ)單元傳遞參數(shù);存儲(chǔ)單元傳遞參數(shù)方法有兩種:; 直接存儲(chǔ)單元傳遞:利用事先約定的存儲(chǔ)單元直接進(jìn)行數(shù)據(jù)本身傳遞。這種方法與寄存器傳遞相類似。; 參數(shù)地址表傳遞:在調(diào)用子程序前,把所有參數(shù)的地址送入地址表,然后把地址表的偏移量通過寄存器帶進(jìn)入子程序,子程序從地址表中取出所需參數(shù)的地址,繼而取得參數(shù)。;子程序名:ArraySum;入口參數(shù):BX為地址表首地址,參數(shù)地址在地址表中;出口參數(shù):SUM單元存放累加和4.5.5 子程序設(shè)計(jì) .MODEL SMALL .STACK 64 .CODEArraySumPRG PROC FARMOV AX, DATA MOV DS, AXPUSHFPUSH AX
55、PUSH CXPUSH BPPUSH SIPUSH DIMOVSI, BX; 數(shù)組首地址(BX)+1: (BX)(SI)MOVBP, BX+2; 數(shù)組長度單元地址(BX+3):(BX+2)(BP)MOVCX, DS: BP; 數(shù)組長度(BP)+1: (BP)(CX)MOVDI, BX+4; 存儲(chǔ)和單元地址(BX+5):(BX+4)DIA_Sum:ADDAX, SIADDSI, 2LOOPA_Sum; 循環(huán)求和4.5.5 子程序設(shè)計(jì)MOVDI, AX; 存儲(chǔ)和 POP DI POP SI POP BP POP CX POP AX POPF RETArraySumPRG ENDP END4.5.5
56、 子程序設(shè)計(jì);方法三:利用堆棧傳遞參數(shù);程序執(zhí)行過程中堆棧變化示意如圖4-25所示。;子程序名:ArraySum;入口參數(shù):數(shù)組、數(shù)組長度及其和的單元地址分別進(jìn)棧;出口參數(shù):SUM單元存放累加和4.5.5 子程序設(shè)計(jì) .MODEL SMALL .STACK 64 .CODEArraySumPRGPROC FARMOV AX, DATA MOV DS, AX PUSHFPUSHAX; 保護(hù)現(xiàn)場(AX), (BX), (CX), (BP)PUSHBXPUSHCXPUSHBPMOVBP, SPMOVBX, BP+14;取得數(shù)組長度地址參數(shù)MOVCX, BXMOVBX, BP+12;取累加和的單元地址
57、參4.5.5 子程序設(shè)計(jì)MOVSI, BP+16; 取數(shù)組的單元地址參數(shù)MOVAX, 0A_Sum:ADDAX, SI; 求和ADDSI, 2LOOPA_SumMOVBX, AX; 保存和POPBP; 恢復(fù)現(xiàn)場(BP), (CX), (BX), (AX)POPCXPOPBXPOPAXPOPFRET6; 返回并廢除地址參數(shù)ArraySumPRG ENDP END4.5.5 子程序設(shè)計(jì) 表格是所有微機(jī)可能使用的基本數(shù)據(jù)結(jié)構(gòu)。 當(dāng)計(jì)算或等值時(shí),用機(jī)器碼編寫程序,不但程序十分繁雜,而且微機(jī)所需要計(jì)算的時(shí)間也比較長。這對于實(shí)時(shí)控制,有時(shí)會(huì)感到太慢了。為此采用查表法代替數(shù)據(jù)運(yùn)算的方法。 4.5.6 查表程
58、序設(shè)計(jì)4.5 匯編語言程序設(shè)計(jì)及舉例建表方法:一是表格的起始地址(或稱基地址),二是某函數(shù)值在表中的序號(hào)(或稱索引值)。函數(shù)值的地址值即等于基地址加上索引值。基地址比較好辦,只要找到空白單元區(qū)域,即可考慮開始存放該表。這些單元區(qū)域的第一個(gè)地址即為基地址,而索引值則應(yīng)該和函數(shù)值有直接的對應(yīng)關(guān)系。 例4-13:從鍵盤上輸入任意一個(gè)1位十進(jìn)制數(shù)(09),用移位指令乘10,并將結(jié)果顯示在CRT上,請編程實(shí)現(xiàn)。 4.5.7 綜合應(yīng)用舉例4.5 匯編語言程序設(shè)計(jì)及舉例分析題目:從題目可以看出,主要完成三個(gè)任務(wù):一是從鍵盤獲得1位十進(jìn)制數(shù);二是將這個(gè)數(shù)擴(kuò)大10倍;三是將其顯示出來。第1個(gè)任務(wù)可以通過DOS功
59、能調(diào)用的方式從鍵盤獲得一個(gè)值,需判斷該值是否是1位十進(jìn)制數(shù)。如果是,將其保存在內(nèi)存中BUFF單元中,否則從新輸入;第2個(gè)任務(wù)是將內(nèi)存中BUFF單元的數(shù)擴(kuò)大10倍,并將其個(gè)位和十位分別轉(zhuǎn)換為ASCII碼,并保存在內(nèi)存BUFF+1及BUFF+2單元中;第3個(gè)任務(wù)將內(nèi)存BUFF+1及BUFF+2單元中的數(shù)顯示。因此,這3個(gè)任務(wù)可以通過3個(gè)子過程實(shí)現(xiàn)。 程序:NAME ExelPAGE 50,70DATA SEGMENT PARA DATA BUFF DB 4 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK STAK STA1 DB 100 DUP(?)STACK EN
60、DSCODE SEGMENT PARA CODE ASSUME CS: CODE, DS: DAT ASSUME SS: STAC, ES: DAT4.5.7 綜合應(yīng)用舉例KeyInOut PROC FAR PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV SI, OFFSET BUFF ;建立緩沖區(qū)首址指針 MOV DI, SI INC DI;保存ASCII碼的首地址 CALL P1 ;調(diào)鍵盤輸入子程序 CALL P2 ;調(diào)乘10子程序 CALL P3 ;調(diào)顯示子程序 RET;返回DOS;設(shè)置DS值4.5.7 綜合應(yīng)用舉例P1 PR
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人轉(zhuǎn)介紹合同范本
- 公司過戶合同范本
- 北京家政服務(wù)合同范本
- 代墊付工資合同范本
- 鄉(xiāng)鎮(zhèn)防汛物資購銷合同范本
- 2023-2028年中國等離子手術(shù)刀行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 2025年度住宅小區(qū)工程質(zhì)量監(jiān)控服務(wù)合同
- 加工合同范本版
- 2025年中國船舶裝載機(jī)行業(yè)發(fā)展趨勢及投資前景預(yù)測報(bào)告
- 社會(huì)政策概論課件
- 工程量清單及招標(biāo)控制價(jià)編制服務(wù)采購實(shí)施方案(技術(shù)標(biāo))
- 全國住戶收支調(diào)查業(yè)務(wù)知識(shí)考試復(fù)習(xí)題庫(含答案)
- 復(fù)方氨基酸注射液的匯總
- 2023年上海市秋考語文真題試卷含答案(整理版)
- 2023年心理咨詢師之心理咨詢師基礎(chǔ)知識(shí)考試題庫附完整答案【有一套】
- 一級建造師繼續(xù)教育最全題庫及答案(新)
- 直線加速器專項(xiàng)施工方案
- 聯(lián)苯二氯芐生產(chǎn)工藝及產(chǎn)排污分析
- 儲(chǔ)能設(shè)備項(xiàng)目采購供應(yīng)質(zhì)量管理方案
- 美國房地產(chǎn)市場特征、框架與周期演變
評論
0/150
提交評論