第四章+程序設(shè)計(jì)201509_第1頁(yè)
第四章+程序設(shè)計(jì)201509_第2頁(yè)
第四章+程序設(shè)計(jì)201509_第3頁(yè)
第四章+程序設(shè)計(jì)201509_第4頁(yè)
第四章+程序設(shè)計(jì)201509_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、懶惰是很奇怪的東西,它使你以為那是安逸,是休息,是福氣;但實(shí)際上它所給你的是無(wú)聊,是倦怠,是消沉;它剝奪你對(duì)前途的希望,割斷你和別人之間的友情,使你心胸日漸狹窄,對(duì)人生也越來(lái)越懷疑。羅蘭 第第4 4章章 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)mov ax,12hcall displayJmp 1234h 主要內(nèi)容: 匯編程序(翻譯程序)源程序的編譯程序源程序的編譯程序匯編程序匯編程序匯編語(yǔ)言匯編語(yǔ)言源程序源程序機(jī)器語(yǔ)言機(jī)器語(yǔ)言目標(biāo)程序目標(biāo)程序 匯編源程序需翻譯成機(jī)器語(yǔ)言,變成可執(zhí)行文件,機(jī)器才能執(zhí)行,這個(gè)翻譯過(guò)程叫匯編匯編。高級(jí)語(yǔ)言中稱(chēng)該過(guò)程為“解釋”或“編譯”。執(zhí)行翻譯的程序稱(chēng)為“匯編程序匯編程序

2、”。匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程 輸入?yún)R編語(yǔ)言源程序 EDIT/NOTEPAD等 源文件 .ASM 匯編(編譯) MASM /ASM等 目標(biāo)文件 .OBJ 鏈接 LINK等 可執(zhí)行文件 .EXE 調(diào)試 DEBUG/TD等 最終正確的程序.EXE 建立、編輯建立、編輯 匯編匯編 連接連接 運(yùn)行運(yùn)行 調(diào)試調(diào)試匯編語(yǔ)言源程序的結(jié)構(gòu) 匯編語(yǔ)言源程序通常由一個(gè)或幾個(gè)程序模塊組成,每個(gè)模塊一般由3個(gè)(或4個(gè))功能段組成: 數(shù)據(jù)段數(shù)據(jù)段存放數(shù)據(jù)、變量存放數(shù)據(jù)、變量 ( (附加數(shù)據(jù)段附加數(shù)據(jù)段存放數(shù)據(jù)、變量存放數(shù)據(jù)、變量) ) 堆棧段堆棧段堆棧區(qū)域堆棧區(qū)域 代碼段代碼段存放程序指令存放程序指令 一個(gè)基本的匯編語(yǔ)

3、言程序框架如下: stack SEGMENT PARA stack DB 100 DUP(stack) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUME CS:code, DS:data, ES:data, SS:stack start: MOV AX, data MOV DS, AX MOV ES, AX MOV AL, 4CH INT 21H code ENDS END start 堆棧段數(shù)據(jù)段代碼段真指令0000:03FF環(huán)境與代碼運(yùn)行環(huán)境與代碼運(yùn)行FFFF:0堆棧段堆棧段數(shù)據(jù)段數(shù)據(jù)段代碼段代碼段CS:IPDSSS:SP系統(tǒng)起始運(yùn)

4、行程序系統(tǒng)起始運(yùn)行程序中斷向量區(qū)中斷向量區(qū)(系統(tǒng)專(zhuān)用)(系統(tǒng)專(zhuān)用)棧底最多4個(gè)活動(dòng)段分段結(jié)構(gòu)分段結(jié)構(gòu)ES匯編語(yǔ)言源程序返回操作系統(tǒng)的方法匯編語(yǔ)言源程序返回操作系統(tǒng)的方法 :1.在代碼段結(jié)束前加調(diào)用語(yǔ)句:MOV AH,4CH ;功能號(hào)4CHAHINT21H ;中斷調(diào)用2.將主程序定義為遠(yuǎn)過(guò)程 CODE SEGMENT ASSUME CS:CODE主過(guò)程名 PROC FAR PUSH DS ;標(biāo)準(zhǔn)序MOV AX,0PUSH AX ;主程序 RET主過(guò)程名 ENDP CODE ENDS 匯編語(yǔ)言源程序語(yǔ)句格式匯編語(yǔ)言源程序語(yǔ)句格式匯編語(yǔ)言有兩種語(yǔ)句:指令語(yǔ)句、指示語(yǔ)句,其格式是類(lèi)似的:指令語(yǔ)句的格式

5、:標(biāo)號(hào): 操作符 參數(shù),參數(shù);注釋指示語(yǔ)句的格式:名字 操作符 參數(shù),參數(shù),參數(shù);注釋 指令性語(yǔ)句指令性語(yǔ)句(真指令真指令)由CPU執(zhí)行,每一條指令性語(yǔ)句都有一條機(jī)器碼指令與其對(duì)應(yīng);指示性指示性(偽指令偽指令)語(yǔ)句由匯編程序語(yǔ)句由匯編程序執(zhí)行。它控制匯編程序應(yīng)如何對(duì)源程序進(jìn)行匯編,如何定義變量、分配存儲(chǔ)單元以及指示程序開(kāi)始和結(jié)束等。指示性語(yǔ)句無(wú)機(jī)器碼指令與其相對(duì)應(yīng)。 注意: 指令性語(yǔ)句匯編時(shí)生成機(jī)器碼;指令性語(yǔ)句匯編時(shí)生成機(jī)器碼; 指示性語(yǔ)句匯編時(shí)不生成機(jī)器碼。指示性語(yǔ)句匯編時(shí)不生成機(jī)器碼。語(yǔ)句的構(gòu)成元素:語(yǔ)句的構(gòu)成元素:1.1.標(biāo)號(hào)標(biāo)號(hào),名字名字(包括變量和常量包括變量和常量) 標(biāo)號(hào)標(biāo)號(hào)指令

6、的符號(hào)地址,用來(lái)代表指令在指令的符號(hào)地址,用來(lái)代表指令在存儲(chǔ)器中的存儲(chǔ)器中的地址地址。只能出現(xiàn)只能出現(xiàn)在指令性語(yǔ)句在指令性語(yǔ)句中,標(biāo)號(hào)后應(yīng)加上冒號(hào)。中,標(biāo)號(hào)后應(yīng)加上冒號(hào)。 變量變量段、過(guò)程、變量的名字,用來(lái)代表它們?cè)诙?、過(guò)程、變量的名字,用來(lái)代表它們?cè)诖鎯?chǔ)存儲(chǔ)器中的器中的地址地址。只能出現(xiàn)只能出現(xiàn)在指示性語(yǔ)句在指示性語(yǔ)句中,名字后不加冒中,名字后不加冒號(hào)。號(hào)。 常量常量代表一個(gè)表達(dá)式的結(jié)果。代表一個(gè)表達(dá)式的結(jié)果。只能出現(xiàn)只能出現(xiàn)在指示性語(yǔ)在指示性語(yǔ)句句中,名字后不加冒號(hào)。中,名字后不加冒號(hào)。它應(yīng)符合下列規(guī)定:它應(yīng)符合下列規(guī)定: 1)第一個(gè)字符必須是字母、問(wèn)號(hào))第一個(gè)字符必須是字母、問(wèn)號(hào)“?”、

7、“”或或“-”; 2)從第二個(gè)字符開(kāi)始可以是字母、數(shù)字、問(wèn)號(hào))從第二個(gè)字符開(kāi)始可以是字母、數(shù)字、問(wèn)號(hào)“?”、“”或或“-”; 3)最大長(zhǎng)度為)最大長(zhǎng)度為31個(gè)字符。個(gè)字符。 4)不應(yīng)該是保留字。)不應(yīng)該是保留字。 變量和標(biāo)號(hào)都是符號(hào)地址,所以它們都有三個(gè)屬性:段值變量和標(biāo)號(hào)都是符號(hào)地址,所以它們都有三個(gè)屬性:段值(SEGMENT)、段內(nèi)的地址偏移量()、段內(nèi)的地址偏移量(OFFSET)、類(lèi)型)、類(lèi)型(TYPE)。)。2.指令助記符指令助記符80868086的助記符、偽指令的助記符、偽指令3.操作數(shù)操作數(shù)即指令的操作對(duì)象即指令的操作對(duì)象對(duì)指令性語(yǔ)句對(duì)指令性語(yǔ)句( (真指令真指令)有有0 0,1

8、1或或2 2個(gè)個(gè)對(duì)指示性語(yǔ)句對(duì)指示性語(yǔ)句( (偽指令偽指令)根據(jù)需要而根據(jù)需要而定定操作數(shù)之間以逗號(hào)分隔操作數(shù)之間以逗號(hào)分隔操作數(shù)可以是:寄存器、存儲(chǔ)單元(變操作數(shù)可以是:寄存器、存儲(chǔ)單元(變量)、常數(shù)或表達(dá)式量)、常數(shù)或表達(dá)式 例如:例如:AXAX,DI+BX+10DI+BX+10,200200,1616* *8+TABLE8+TABLE,等等,等等有三種運(yùn)算符:算術(shù)運(yùn)算符、邏輯運(yùn)算符和關(guān)系運(yùn)算符;兩種操作符:數(shù)值回送操作符和屬性操作符。4.注釋注釋以分號(hào)開(kāi)頭,可放在指令后,也可 單獨(dú)一行。 注意注解的寫(xiě)法。要寫(xiě)指令(段)在程序中的作用,而不要寫(xiě)指令的操作。 例如:以下為同一條指令寫(xiě)的注釋

9、1)MOV CX,100 ;傳送100到CX 2)MOV CX,100 ;循環(huán)計(jì)數(shù)器置初值 顯然,第二種寫(xiě)法要比第一種寫(xiě)法要好。 匯編語(yǔ)言的一個(gè)實(shí)例: hello.asm Hello DB Hello, world!,0DH,0AH,$ ASSUME CS:prog,DS:datastart: MOV AX,data MOV DS,AX LEA DX,hello;取字符串首地址 MOV AH,9 INT 21H;顯示字符串 MOV AH,4CH INT 21H;退回DOS名字標(biāo)號(hào)偽指令 數(shù)據(jù)定義 偽指令 常數(shù)定義 偽指令 段定義和段寄存器指定偽指令 過(guò)程定義 偽指令 結(jié)束 偽指令數(shù)據(jù)定義及存儲(chǔ)

10、分配偽指令:數(shù)據(jù)定義及存儲(chǔ)分配偽指令: 用于定義變量,即內(nèi)存單元或數(shù)據(jù)區(qū)。數(shù)據(jù)定義偽指令的格式為: 變量名變量名 DB/DW/DD/DQ/DT DB/DW/DD/DQ/DT 數(shù)據(jù)項(xiàng)表數(shù)據(jù)項(xiàng)表 ;注釋?zhuān)蛔⑨?常用的數(shù)據(jù)定義偽指令有如下幾種: DB 定義字節(jié)字節(jié) DW 定義字字 DD 定義雙字雙字操作數(shù)可以是常數(shù)、變量或表達(dá)式例例1 1:DATA_B DB 10,5,10HDATA_W DW 100H,-4DATA_D DD 0FFFBH匯編后的內(nèi)存分配情況如右圖所示。05H10H00H01HFCHFFHFBHFFH00H00H0AH例例2 2:操作數(shù)可以是字符串,例如STR DB HELLO 匯

11、編后的情況如圖:STRHELLO注意注意: :下面兩個(gè)定義的不同之處:DBAB ;41H在低字節(jié),42H在高字節(jié)(先A后B)DW AB ;42H在低字節(jié),41H在高字節(jié)(先B后A)48H45H4CH4CH4FH 操作數(shù)“?”用來(lái)保留存儲(chǔ)空間,但不存入數(shù)據(jù).例例3 3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,?復(fù)制操作符DUP: 重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,格式為: DUP(表達(dá)式2)如上面RSV亦可寫(xiě)成: RSV DW 8 DUP(?)例例4 4: TABLE DB 10 DUP(?) BUFFER DW TABLE,$+3設(shè)TABLE的偏

12、移地址為0080H,則匯編后如下圖所示:BUFFER0080H00HTABLE008AH008BH008CH008DH.8FH00H00H0089H10 Bytes若操作數(shù)中若使用$,則表示的是地址計(jì)數(shù)器的當(dāng)前值。例: A1 DB 10,10H ;定義兩個(gè)字節(jié) A2 DW 10,10H ;定義兩個(gè)字 A3 DB AB ;定義兩個(gè)字節(jié) A4 DW AB ;定義一個(gè)字 A5 DB 2 DUP(1,2,3)結(jié)果見(jiàn)例LI.ASM0A100A00100041424241010203010203常數(shù)定義偽指令 把一個(gè)表達(dá)式的值用一個(gè)符號(hào)表示,以后凡出現(xiàn)該表達(dá)式的地方都可用這個(gè)符號(hào)表示。 符號(hào)定義偽指令有兩

13、種:EQU,=格式:符號(hào)名 EQU 表達(dá)式 符號(hào)名 = 表達(dá)式 用EQUEQU定義的符號(hào)未清除前,不能重新定義。清除EQU定義可用PURGEPURGE偽指令。 用”=”定義的符號(hào)可在任何時(shí)候進(jìn)行重定義。 二者二者均不占用存儲(chǔ)空間,僅是給符號(hào)賦值段定義偽指令段定義偽指令SEGMENT/ENDSSEGMENT/ENDS格式:段名 SEGMENT 定位類(lèi)型 組合類(lèi)型 類(lèi)別 ;段內(nèi)語(yǔ)句序列段名 ENDS 定位類(lèi)型定位類(lèi)型規(guī)定了對(duì)該段的起始地址的要求,可以有以下四種選擇:PAGE(頁(yè)):其16進(jìn)制地址最低2位為00H。PARA(節(jié)):其16進(jìn)制地址最低1位為0H。該類(lèi)型為系統(tǒng)的缺省值。WORD(字):該

14、段從偶地址開(kāi)始。BYTE(字節(jié)):組合類(lèi)型組合類(lèi)型表示該段與其它段之間的連接和定位關(guān)系,是在連接時(shí)起作用的。可以有以下六種選擇:NONE:該類(lèi)型為系統(tǒng)的缺省值。PUBLIC、STACK、COMMON、AT表達(dá)式、MEMORY。類(lèi)別類(lèi)別是由編程者賦予該段的與段名不同的另一個(gè)名字信息,必須用單引號(hào)括起來(lái)。在連接時(shí)由連接程序?qū)⒊绦蛑兴蓄?lèi)別相同的段組成一個(gè)段組。段尋址偽指令段尋址偽指令A(yù)SSUMEASSUME該偽指令用來(lái)告訴匯編程序某個(gè)段是使用哪一個(gè)段寄存器。格式: ASSUME 段寄存器名:段名,段寄存器名:段名,過(guò)程定義偽指令過(guò)程定義偽指令定義子程序的格式為:過(guò)程名 PROC NEAR/FARR

15、ET過(guò)程名 ENDP程序結(jié)束偽指令程序結(jié)束偽指令ENDEND源程序結(jié)束偽指令表示一個(gè)程序模塊的結(jié)束,其格式為:END 標(biāo)號(hào)程序設(shè)計(jì)步驟程序設(shè)計(jì)步驟指令或語(yǔ)句指令或語(yǔ)句就是告訴計(jì)算機(jī)為完成某一計(jì)算步驟需要執(zhí)行的操作。程序程序是為了求解某個(gè)問(wèn)題所必須的完整的指令序列或語(yǔ)句串加上必要的數(shù)據(jù)。程序設(shè)計(jì)程序設(shè)計(jì)是編寫(xiě)程序的過(guò)程。當(dāng)在設(shè)計(jì)一個(gè)程序時(shí),應(yīng)該考慮滿(mǎn)足以下目標(biāo)目標(biāo):1)程序的正確性。2)增強(qiáng)程序的可讀性。3)所寫(xiě)程序應(yīng)該是結(jié)構(gòu)化的,易修改,易調(diào)試,即程序的可維護(hù)性。程序設(shè)計(jì)的基本步驟基本步驟1. 分析問(wèn)題,建立模型例:Y=|X|Y= -X開(kāi)始X=0Y= X結(jié)束Y= -X4分配存儲(chǔ)空間和工作單元5

16、編寫(xiě)程序 6上機(jī)調(diào)試、運(yùn)行程序2確定算法3根據(jù)算法畫(huà)出程序流程圖DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用(高級(jí)調(diào)用)(高級(jí)調(diào)用)作用:作用:調(diào)用由調(diào)用由操作系統(tǒng)操作系統(tǒng)OSOS提供的一組實(shí)現(xiàn)特殊功提供的一組實(shí)現(xiàn)特殊功能的子程序,以減輕編程工作量。能的子程序,以減輕編程工作量。它具有它具有90多個(gè)子功能多個(gè)子功能的子程序,它們通過(guò)的子程序,它們通過(guò)功能號(hào)功能號(hào)來(lái)區(qū)分。這些子程序組合在一起作為一個(gè)中斷服來(lái)區(qū)分。這些子程序組合在一起作為一個(gè)中斷服務(wù)程序,中斷類(lèi)型號(hào)為務(wù)程序,中斷類(lèi)型號(hào)為21H。實(shí)現(xiàn)實(shí)現(xiàn)方式:方式:用戶(hù)程序在調(diào)用這些系統(tǒng)服務(wù)程序時(shí),用戶(hù)程序在調(diào)用這些系統(tǒng)服務(wù)程序時(shí),不是不是用用CALL命令命令,

17、而,而是是采用軟中斷指令采用軟中斷指令I(lǐng)NT n (INT 21H) 來(lái)實(shí)現(xiàn)來(lái)實(shí)現(xiàn)。 它不依賴(lài)于具體的硬件它不依賴(lài)于具體的硬件系統(tǒng)。系統(tǒng)。 內(nèi)存管理、存取時(shí)間、存取終端矢量、終止程內(nèi)存管理、存取時(shí)間、存取終端矢量、終止程序等。序等。注意注意:第二步和第四步并不是每個(gè)功能的調(diào)用都需要:第二步和第四步并不是每個(gè)功能的調(diào)用都需要的;若需要輸入?yún)?shù)時(shí),第一步和第二步順序可換。的;若需要輸入?yún)?shù)時(shí),第一步和第二步順序可換。這里只討論幾種常用的鍵盤(pán)輸入鍵盤(pán)輸入和顯示輸出顯示輸出的功能調(diào)用的功能調(diào)用。1. 1. 鍵盤(pán)輸入功能調(diào)用鍵盤(pán)輸入功能調(diào)用(1) 從鍵盤(pán)輸入一個(gè)字符(功能號(hào)功能號(hào)=1=1) 格式格式:

18、MOV AH,MOV AH,1 1 INT 21H INT 21H功能:執(zhí)行功能:執(zhí)行1號(hào)系統(tǒng)功能調(diào)用時(shí),系統(tǒng)等待鍵盤(pán)輸號(hào)系統(tǒng)功能調(diào)用時(shí),系統(tǒng)等待鍵盤(pán)輸入,一旦有鍵按下,系統(tǒng)先檢查是否是入,一旦有鍵按下,系統(tǒng)先檢查是否是Ctrl-c鍵,鍵,如果是則退出程序,否則將鍵入的字符的如果是則退出程序,否則將鍵入的字符的ASCII碼碼值存入值存入AL中,并在屏幕上顯示該字符。中,并在屏幕上顯示該字符。例例: :程序中有時(shí)需要用戶(hù)對(duì)提示做出應(yīng)答。 GET_KEY: MOV AH,1;等待鍵入字符 INT 21H;結(jié)果在AL中 CMP AL,Y ;是Y? JZ YES ;是,轉(zhuǎn)YES CMP AL,N ;是

19、N? JZ NO ;是,轉(zhuǎn)NO JMP GET_KEY;否則繼續(xù)等待輸入 YES: NO: 7 7號(hào)功能調(diào)用號(hào)功能調(diào)用功能:執(zhí)行功能:執(zhí)行7號(hào)系統(tǒng)功能調(diào)用時(shí),系統(tǒng)等待鍵盤(pán)號(hào)系統(tǒng)功能調(diào)用時(shí),系統(tǒng)等待鍵盤(pán)輸入,一旦有鍵按下,將鍵入的字符的輸入,一旦有鍵按下,將鍵入的字符的ASCII碼碼值存入值存入AL寄存器中,不檢查寄存器中,不檢查Ctrl-c鍵,不回顯。鍵,不回顯。8 8號(hào)功能調(diào)用號(hào)功能調(diào)用功能與功能與1號(hào)功能調(diào)用類(lèi)似,檢查號(hào)功能調(diào)用類(lèi)似,檢查Ctrl-c鍵,不回顯。鍵,不回顯。(2) 輸入字符串(功能號(hào)功能號(hào)= =0AH0AH) 此功能調(diào)用從鍵盤(pán)輸入一串字符并把它存入用戶(hù)指定的緩沖區(qū)中。 MO

20、V AH,MOV AH, 0AH 0AH LEA DX, LEA DX, INT 21H INT 21H (預(yù)留的預(yù)留的N1-1個(gè)字節(jié)的存儲(chǔ)單元個(gè)字節(jié)的存儲(chǔ)單元) 0DHN2N1 N1: 緩沖區(qū)長(zhǎng)度緩沖區(qū)長(zhǎng)度(最大鍵入字符數(shù)最大鍵入字符數(shù)) N2: 實(shí)際鍵入的字符數(shù)實(shí)際鍵入的字符數(shù)(不包括回車(chē)符不包括回車(chē)符) 用戶(hù)定義的輸入字符串的緩沖區(qū)分布用戶(hù)定義的輸入字符串的緩沖區(qū)分布 定義緩沖區(qū)的格式:定義緩沖區(qū)的格式:STR1 DB 10,?,10 DUP(?)調(diào)用前,要求DS:DX指向輸入緩沖區(qū)的首地址;調(diào)用后,DS:DX仍指向輸入緩沖區(qū)的首地址。2. DOS2. DOS顯示功能調(diào)用顯示功能調(diào)用(1

21、) (1) 在顯示器上顯示一個(gè)字符在顯示器上顯示一個(gè)字符( (功能號(hào)功能號(hào)= =2 2) ) MOV AH, MOV AH, 2 2 MOV DL, MOV DL, INT 21H INT 21H 例:在顯示器上顯示一個(gè)字符A MOV AH, 2 MOV DL, A ;或MOV DL, 41H INT 21H MOV AH, MOV AH, 9 9 LEA DX, LEA DX, INT 21H INT 21H注意:被顯示的字符串必須以注意:被顯示的字符串必須以$結(jié)束結(jié)束。(2)(2)顯示字符串顯示字符串(功能號(hào)功能號(hào)= =9 9)功能:將(DS:DX)指定內(nèi)存緩沖區(qū)中的字符串(以“$”字符作

22、為結(jié)束符)在屏幕上顯示出來(lái)。例:在屏幕上顯示:HELLO,WORLD!;在數(shù)據(jù)段定義字符串: DATA SEGMENT STR1 DB HELLO,WORLD!$ DATA ENDS;在代碼段中進(jìn)行顯示輸出 MOV AH,9 LEA DX,STR1 INT 21H完整的程序: HELLO.ASM程序的基本結(jié)構(gòu)程序程序是指令(語(yǔ)句)的有序集合,是對(duì)系統(tǒng)任務(wù)處理步驟的描述。程序的執(zhí)行是有一定順序的,依據(jù)執(zhí)行順序執(zhí)行順序可將程序分為如下基本結(jié)構(gòu):順序結(jié)構(gòu)、分支(選擇)結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)順序結(jié)構(gòu)、分支(選擇)結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。順序結(jié)構(gòu)順序結(jié)構(gòu):是一種線性結(jié)構(gòu),這種結(jié)構(gòu)的程序每執(zhí)行一次

23、,其中的語(yǔ)句或程序段依次被執(zhí)行一次程序的順序結(jié)構(gòu)如圖所示:S1S2S3其中S1、S2、S3表示順序執(zhí)行的語(yǔ)句或程序段。例例6-4 假設(shè)由下列數(shù)學(xué)公式:Y=X3+8X2+8X+6試編寫(xiě)當(dāng)X=10時(shí),計(jì)算Y值的程序。(X)AX(AX)+8AX (AX)*(X)AX(AX)+6AX(AX)+8AX (AX)*(X)AXAX (Y) Y=(X+8)X+8)X+6START: MOV AX,STACK_SEG MOV SS,AX MOV SP,OFFSET TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA_SEG MOV DS,AX MOV AX,X ADD AX,8

24、MUL X ADD AX,8 MUL X ADD AX,6 MOV Y,AX RET MAIN ENDPCODE_SEG ENDS END STARTDATA_SEG SEGMENT X DW 10 Y DW 0 DATA_SEG ENDSSTACK_SEG SEGMENT STACK STACK DW 100 DUP (?) TOP LABEL WORDSTACK_SEG ENDSCODE_SEG SEGMENTMAIN PROC FAR ASSUME CS:CODE_SEG,DS:DATA_SEG ASSUME SS:STACK_SEGdata segment ;數(shù)據(jù)段 msg db 0d

25、h,0ah,07h,Hello$data endsss_seg segment ;堆棧段 db 256 dup(?)ss_seg endscode segment ;代碼段 assume cs:code,ds:data,ss:ss_segmain proc far push ds ;標(biāo)準(zhǔn)序 mov ax,0 push ax mov ax,data ;設(shè)置數(shù)據(jù)段 mov ds,ax lea dx,msg ;取字符串地址執(zhí)行后顯示HELLO。mov ah,09h;顯示字符串int 21h ret ;返回操作系統(tǒng)main endpcode endsend main標(biāo)號(hào):條件滿(mǎn)足條件滿(mǎn)足?處理處理分支

26、程序分支程序NYIFTHEN結(jié)構(gòu)結(jié)構(gòu)程序結(jié)構(gòu):程序結(jié)構(gòu): 測(cè)試測(cè)試/比較指令比較指令 (TEST/CMP) 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 (Jx 標(biāo)號(hào)標(biāo)號(hào)) 處理體處理體 標(biāo)號(hào)標(biāo)號(hào): 其他指令其他指令 程序結(jié)構(gòu):程序結(jié)構(gòu): TEST/CMP指令指令 Jx 標(biāo)號(hào)標(biāo)號(hào)1 處理體處理體P1 JMP 標(biāo)號(hào)標(biāo)號(hào)2標(biāo)號(hào)標(biāo)號(hào)1: 處理體處理體P2標(biāo)號(hào)標(biāo)號(hào)2:其他指令:其他指令 條件滿(mǎn)足條件滿(mǎn)足?處理處理P1處理處理P2標(biāo)號(hào)1:標(biāo)號(hào)2:IFTHENELSE結(jié)構(gòu)結(jié)構(gòu)YN例例: :編寫(xiě)程序計(jì)算Y=X,X,Y為字變量。DATA SEGMENT X DW 10H Y DW ?DATA ENDSCODE SEGMENTMA

27、IN PROC FAR ASSUME CS:CODE,DS:DATASTART:PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,X TEST AX,8000H JZ POS NEG AXPOS: MOV Y,AX RETMAIN ENDPCODE ENDS END START開(kāi)始X=0XY-XYNOYES結(jié)束CMP AX,0JGE POSAND AX,AXJNS POS標(biāo)號(hào)標(biāo)號(hào)1:條件條件1成立成立?P1NYCASE結(jié)構(gòu)結(jié)構(gòu)程序結(jié)構(gòu):程序結(jié)構(gòu): TEST/CMP指令(測(cè)試條件1) Jx 標(biāo)號(hào)1 ;不滿(mǎn)足轉(zhuǎn)標(biāo)號(hào)1 處理體處理體P1 J

28、MP 標(biāo)號(hào)標(biāo)號(hào)n+1標(biāo)號(hào)1:TEST/CMP指令(測(cè)試條件2) Jx 標(biāo)號(hào)2 ;不滿(mǎn)足轉(zhuǎn)標(biāo)號(hào)2 處理體處理體P2 JMP 標(biāo)號(hào)標(biāo)號(hào)n+1標(biāo)號(hào)2:TEST/CMP指令(測(cè)試條件3) Jx 標(biāo)號(hào)3 ;不滿(mǎn)足轉(zhuǎn)標(biāo)號(hào)3 處理體處理體P3 JMP 標(biāo)號(hào)標(biāo)號(hào)n+1標(biāo)號(hào)3:TEST/CMP指令(測(cè)試條件4) 標(biāo)號(hào)n+1:(公共出口)條件條件2成立成立?條件條件n成立成立?Pn+1標(biāo)號(hào)標(biāo)號(hào)2:標(biāo)號(hào)標(biāo)號(hào)n:標(biāo)號(hào)標(biāo)號(hào)n+1:P2PnNNYY例:編寫(xiě)程序,根據(jù)鍵盤(pán)輸入的值,顯示不同的內(nèi)容。若輸入數(shù)字“0”,則顯示“You have input digit 0.”,若輸入數(shù)字“1”,則顯示“You have inpu

29、t digit 1.”若輸入數(shù)字“9”,則顯示“You have input digit 9.”,否則顯示“Error!”。 DATASEGMENTDISDB0DH,0AH,Please input digit 09.$DIS0DB0DH,0AH,You have input digit 0.$DIS1DB0DH,0AH,You have input digit 1.$DIS9DB0DH,0AH,You have input digit 9.$DIS10DB0DH,0AH,Error!$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,D

30、ATA;初始化初始化DSMOVDS,AXLEADX,DISMOVAH,09H ;DOS功能調(diào)用:顯示字符串功能調(diào)用:顯示字符串INT21HMOVAH,01H ;從鍵盤(pán)輸入一個(gè)字符從鍵盤(pán)輸入一個(gè)字符,其其ASCII碼送碼送ALINT21HCMPAL,30H ;與與0的的ASCII碼比較碼比較JBERR;小于小于0的的ASCII碼轉(zhuǎn)碼轉(zhuǎn)EXITCMPAL,39H ;與與9的的ASCII碼比較碼比較JAERR;大于大于9的的ASCII碼轉(zhuǎn)碼轉(zhuǎn)EXITANDAL,0FH ;ASCII碼碼二進(jìn)制二進(jìn)制JMPGOODERR:MOVAL,10;如果輸入的不是如果輸入的不是09,AL寄存器送寄存器送10GOO

31、D: LEABX,TAB ;取地址表的偏移地址取地址表的偏移地址BXMOVAH,0SHLAL,1;JMP SHORT P*為兩字節(jié)指令為兩字節(jié)指令A(yù)DDBX,AXJMPBX;轉(zhuǎn)到地址表中對(duì)應(yīng)的指令去執(zhí)行轉(zhuǎn)到地址表中對(duì)應(yīng)的指令去執(zhí)行EXIT:MOVAH,4CH ;返回返回DOSINT21HTAB:JMPSHORT P0;地址表地址表JMPSHORT P1JMPSHORT P9JMPSHORT P10P0:LEADX,DIS0;將輸出字符串存放的首址偏移量將輸出字符串存放的首址偏移量DXMOVAH,9INT21HJMPEXIT;顯示輸出字符串顯示輸出字符串P10:LEADX,DIS10;將存放將存

32、放”ERROR$”字符地址偏移量字符地址偏移量;DX來(lái)顯示來(lái)顯示MOVAH,9INT21HJMPEXITCODEENDSEND START循環(huán)程序1DOUNTIL 結(jié)構(gòu) 先執(zhí)行,再判斷條件先執(zhí)行,再判斷條件。工作部分至少執(zhí)行一次。初始化初始化循環(huán)體循環(huán)體循環(huán)控制循環(huán)控制繼續(xù)循環(huán)?繼續(xù)循環(huán)?YN例例: :編寫(xiě)一程序,從數(shù)據(jù)段中一未排序的字?jǐn)?shù)組ARRAY中,找出最大值和最小值分別存放到AX和BX 寄存器中。開(kāi)始開(kāi)始N-1N-1CXCX取數(shù)組第一個(gè)取數(shù)組第一個(gè)數(shù)數(shù) AX AX和和BXBX數(shù)組中數(shù)與數(shù)組中數(shù)與(AX)AX)和和(BX)(BX)比較比較大數(shù)大數(shù) AX AX小數(shù)小數(shù) BX BX比較完比較完

33、?結(jié)束結(jié)束NYDATA SEGMENTN EQU 6ARRAY DW 98H,04H,76H,12H,09H,0F8HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,N-1 LEA SI,ARRAY MOV AX,SI MOV BX,AXAGAIN: ADD SI,2 CMP BX,SI JLE FMAX MOV BX,SI JMP SHORT NEXTFMAX: CMP AX,SI JGE NEXT MO

34、V AX,SINEXT: LOOP AGAIN RETMAIN ENDPCODE ENDS END START2. DO WHILE 結(jié)構(gòu) 先判斷條件,再執(zhí)行先判斷條件,再執(zhí)行。工作部分有可能一次都不執(zhí)行。初始化初始化循環(huán)體循環(huán)體循環(huán)控制循環(huán)控制繼續(xù)循環(huán)?繼續(xù)循環(huán)?YN例:求平方根程序:內(nèi)存SQU單元存放一個(gè)完全平方數(shù),編一個(gè)求平方根程序。分析:從1開(kāi)始連續(xù)I個(gè)奇數(shù)之和是I的平方數(shù)N,如:1+3+5+7+9+11+13=49,其中I=7(7個(gè)連續(xù)的奇數(shù)),N=49(連續(xù)奇數(shù)之和),所以N=I2;開(kāi)始初始化平方值=0?平方數(shù)減奇數(shù)計(jì)數(shù)器加1形成下一個(gè)奇數(shù)保存結(jié)果結(jié)束DATA SEGMENTSQU

35、 DW 13924 ROOT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA SQROOT: MOV AX,DATA MOV DS,AX XOR CX,CX ;計(jì)數(shù)器清0 MOV BX,1 ;置奇數(shù) MOV DX,SQU ;把平方數(shù)送DXL1: AND DX,DX ;判斷平方數(shù)是否為0 JZ L2 ;為0,退出 SUB DX,BX ;平方數(shù)減奇數(shù) INC CX ;減奇數(shù)的次數(shù)加1 ADD BX,2 ;形成下一個(gè)奇數(shù) JMP L1L2: MOV ROOT,CX ;保存結(jié)果 MOV AH,4CH ;返回DOS INT 21HCODE ENDS

36、END SQROOT 注意:注意:循環(huán)可以嵌套循環(huán)可以嵌套(多重循環(huán)多重循環(huán)),但多個(gè)循環(huán)體之間,但多個(gè)循環(huán)體之間不能交叉,控制條件不能混淆。不能交叉,控制條件不能混淆。例:例:采用采用“冒泡法冒泡法”把一個(gè)長(zhǎng)度已知的數(shù)組元素按從小到把一個(gè)長(zhǎng)度已知的數(shù)組元素按從小到大排序。假設(shè)數(shù)組中的元素為無(wú)符號(hào)字變量大排序。假設(shè)數(shù)組中的元素為無(wú)符號(hào)字變量 冒泡法冒泡法實(shí)例:實(shí)例:3,7,2,8,62, 3, 6, 7, 8 。內(nèi)外兩層循環(huán);內(nèi)外兩層循環(huán);每輪內(nèi)循環(huán)使一個(gè)最大的數(shù)沉底,因?yàn)樽畲蟮臄?shù)沉底,下輪每輪內(nèi)循環(huán)使一個(gè)最大的數(shù)沉底,因?yàn)樽畲蟮臄?shù)沉底,下輪內(nèi)循環(huán)就不用再比較最底下的數(shù),所以?xún)?nèi)循環(huán)的循環(huán)次數(shù)每

37、內(nèi)循環(huán)就不用再比較最底下的數(shù),所以?xún)?nèi)循環(huán)的循環(huán)次數(shù)每一輪比上一輪要逐次減一輪比上一輪要逐次減1;外循環(huán)用于控制有多少輪內(nèi)循環(huán)。若有外循環(huán)用于控制有多少輪內(nèi)循環(huán)。若有n個(gè)數(shù)據(jù),則外循環(huán)次個(gè)數(shù)據(jù),則外循環(huán)次數(shù)為數(shù)為n-1。見(jiàn)源程序見(jiàn)源程序DXUNHUAN.ASMDATASEGMENTADW8907,43,56,24,65,23,54,2,34,24NEQU ($-A)/2DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATA;初始化DSMOV DS,AXMOV CX,N-1;計(jì)數(shù)器MOV BX,0LOOP1:MOV DX,CX;保存外循環(huán)

38、計(jì)數(shù)MOV SI,0;設(shè)置內(nèi)循環(huán)偏移地址LOOP2:MOV AX,ABX;取數(shù),暫做小數(shù)CMP AX,ABX+SI+2;和其它數(shù)做比較JNAL1;小于等于,轉(zhuǎn)L1MOV DI,ABX;否,則交換數(shù)據(jù)MOV AX,ABX+SI+2MOV ABX,AXMOV ABX+SI+2,DIL1:ADDSI,2;修改偏移指針,為下一次比較做準(zhǔn)備LOOP LOOP2;內(nèi)循環(huán)結(jié)束判斷ADDBX,2;修改內(nèi)循環(huán)的首址MOV CX,DXLOOP LOOP1;外循環(huán)結(jié)束判斷MOV AH,4CH;返回DOSINT21HCODEENDSENDSTART掌握以下幾點(diǎn)掌握以下幾點(diǎn): :調(diào)用子程序用CALLCALL指令,返回調(diào)

39、用程序用RETRET指令。子程序允許嵌套調(diào)用嵌套調(diào)用。進(jìn)入子程序后首先要保護(hù)主程序的運(yùn)行狀態(tài)(標(biāo)志位)和使用的寄存器內(nèi)容(稱(chēng)為保護(hù)現(xiàn)場(chǎng)保護(hù)現(xiàn)場(chǎng)),退出子程序前要恢復(fù)現(xiàn)場(chǎng)恢復(fù)現(xiàn)場(chǎng)。調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲(chǔ)單元或堆棧(要用BP尋址)。例例1: 二進(jìn)制數(shù)二進(jìn)制數(shù)(0-F)轉(zhuǎn)換成轉(zhuǎn)換成ASCII(0-F)的子程序。的子程序。BIN2ASC PROC ;要轉(zhuǎn)換的數(shù)在AL的低四位 ;轉(zhuǎn)換結(jié)果仍在AL中 CMP AL, 9 JA A2F ADD AL, 30H; 9, +37H DONE:RETBIN2

40、ASC ENDP調(diào)用方法:(在主程序中) MOV AL, 0CH CALL BIN2ASC (AL中有0CH的ASCII碼43H, C)子程序的參數(shù)傳遞子程序的參數(shù)傳遞 編寫(xiě)子程序時(shí),很重要的一個(gè)工作是如何把參數(shù)傳給子程序,這個(gè)過(guò)程叫參數(shù)傳送。 傳送方法有:l把參數(shù)放在CPU內(nèi)部寄存器中l(wèi)把參數(shù)放在變量中l(wèi)把參數(shù)放在地址表中l(wèi)利用堆棧傳送參數(shù) 下面舉例介紹第4種方法,它通常在主程序中把參數(shù)或參數(shù)地址保存在堆棧中,而在子程序中將參數(shù)從堆棧取出來(lái)。例:把一個(gè)用十六進(jìn)制表示的字ASCII碼,然 后送到屏幕上顯示。 匯編程序如下:DATASEGMENTNUMDW25AFH ;要顯示的數(shù)STRINGDB

41、4 DUP(?),13,10,$DATAENDSSTACKSEGMENTDB 100 DUP(?)TOP EQU $ STACKENDS ; CODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AX MOV SP,offset TOP LEABX,STRING;取變量偏址PUSHBX;將偏址壓棧PUSHNUM;將變量壓棧00020064H0062HSP25AF0060H堆棧 CALLCALLBINHEXBINHEX;(SP)=005EH CS:011

42、3CS:0113 LEADX,STRING;(DX)=0002HMOVAH,9INT21HMOVAH,4CHINT21H;*BINHEXPROCPUSHBP;(SP)=005CHMOVBP,SP ;(BP)=005CHPUSHAX ;(SP)=005AHPUSHDI ;(SP)=0058HPUSHCX ;(SP)=0056HPUSHDX ;(SP)=0054H00020064H0062H25AF0060H005EH0113005CHSP返回地址(IP)原(BP)00020064H0062H25AF0060H005EH0113xxxx005CHBP PUSHF ;(SP)=0052H MOV A

43、X,BP+4 ;(AX)=25AFH MOV DI,BP+6 ;(DI)=0002H ADD DI,LENGTH STRING-1;(DI)=0005H MOV DX,AX ;(DX)=25AFH MOV CX,(STRING-num)*2 ;STD ;從后往前存AGAIN:AND AX,0FH ;第一次(AX)=000FH CALL HEXDCALL HEXD ;轉(zhuǎn)換為ASCII碼存于AL MOV DI,AL DEC DI; STOSB PUSH CX MOV CL,4 SHR DX,CL ;邏輯右移4位 MOV AX,DX ;第1次(AX)=025AH POP CX LOOP AGAIN

44、;(CX)-1=0?不等,轉(zhuǎn)+4POPFPOPDX POPCXPOPDIPOPAXPOPBPRET4 BINHEX ENDP ;將AL中的一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCIIHEXD PROC CMP AL,0AH JL LP ADD AL,7LP: ADD AL,30H RETHEXD ENDPCODE ENDS END BEGIN0064H0062H0060H005EH005CH000225AF0113xxxx(SP) 從本例可知,通過(guò)堆棧傳遞的兩個(gè)參數(shù)分別為:變量NUM的內(nèi)容25AFH和變量STRING的偏移地址。這兩個(gè)參數(shù)在調(diào)用子程序之前壓入堆棧,當(dāng)CALL指令返回時(shí),其(SP)=0060H

45、,不是初值0064H。故采用帶參數(shù)返回指令RET 4。 本例重點(diǎn)掌握: 進(jìn)一步了解堆棧的使用 學(xué)會(huì)RET n的應(yīng)用 子程序嵌套1.碼制轉(zhuǎn)換 十、二進(jìn)制數(shù)、ASCII碼之間的互相轉(zhuǎn)換。BCD數(shù)數(shù)2進(jìn)制數(shù)進(jìn)制數(shù) 算法:Dn-1*10n-1+D0*100 = (Dn-1*10+ Dn-2)*10+)*10+ D0 = (0*10+Dn-1)*10+ Dn-2)*10+)*10+ D0 即: 新的中間結(jié)果 = 中間結(jié)果*10+本位數(shù)字 (中間結(jié)果初值為0)常見(jiàn)程序設(shè)計(jì)舉例程序1:將65535的非壓縮BCD數(shù)轉(zhuǎn)換成2進(jìn)制數(shù)。 程序如下: ;數(shù)據(jù)段定義 mydata SEGMENT decnum DB 5

46、, 3, 0, 1, 9 ;BCD數(shù) 53019 binnum DW ?mydata ENDSprog SEGMENT ASSUME CS:prog,DS:mydataBegin: MOV AX, mydata MOV DS, AX MOV SI, OFFSET decnum MOV CX, 5 ;5位位BCD數(shù)數(shù) MOV BX, 10 XOR AX, AX ;中間結(jié)果初始值為中間結(jié)果初始值為0Next: MUL BX ;中間結(jié)果中間結(jié)果*10+本位數(shù)字本位數(shù)字 ADD AL, SI ADC AH, 0 INC SI ;指向下位指向下位BCD數(shù)數(shù) LOOP next MOV binnum, A

47、X ;保存結(jié)果保存結(jié)果 MOV AH, 4CH INT 21Hprog ENDS END begin程序程序2:把:把255的非壓縮的非壓縮BCD數(shù)轉(zhuǎn)換成數(shù)轉(zhuǎn)換成2進(jìn)制數(shù)進(jìn)制數(shù) decnum DB 1,5,9 ;BCD數(shù)159 binnum DB ? MOV AX, word ptr decnum XCHG AH, AL ;百位在AH, 十位在AL AAD ;百位數(shù)*10 + 十位數(shù) MOV AH, AL ;中間結(jié)果送AH MOV AL, decnum+2 AAD ;中間結(jié)果*10 + 個(gè)位數(shù) MOV binnum, AL 例:從鍵盤(pán)輸入兩個(gè)整數(shù)例:從鍵盤(pán)輸入兩個(gè)整數(shù), ,并求其和。并求其和。

48、 因鍵入為整數(shù)因鍵入為整數(shù), ,故要進(jìn)行如下轉(zhuǎn)換:故要進(jìn)行如下轉(zhuǎn)換: ASCIIBCDASCIIBCD二進(jìn)制數(shù)二進(jìn)制數(shù) ASCIIBCDASCIIBCD碼很簡(jiǎn)單碼很簡(jiǎn)單, ,高高4 4位清零即可得到非壓位清零即可得到非壓縮的縮的BCDBCD碼。碼。 BCDBCD二進(jìn)制數(shù)在本例中采用用以下方法:二進(jìn)制數(shù)在本例中采用用以下方法: ( ( (0+0+千位數(shù)千位數(shù)) )* *1010+ +百位數(shù)百位數(shù)) )* *10)+10)+十位數(shù)十位數(shù)) )* *10+10+個(gè)位數(shù)個(gè)位數(shù) ASCIIASCII碼碼二進(jìn)制數(shù)二進(jìn)制數(shù)( (用于輸入用于輸入) ) 第一次中間結(jié)果第二次中間結(jié)果第三次中間結(jié)果最終結(jié)果開(kāi)始開(kāi)

49、始兩個(gè)數(shù)分別轉(zhuǎn)換成二進(jìn)制數(shù)鍵入兩個(gè)數(shù)鍵入兩個(gè)數(shù)相加相加結(jié)束結(jié)束返回返回DOS如有溢出則提示如有溢出則提示開(kāi)始取第一個(gè)ASCII碼是負(fù)號(hào)嗎?數(shù)字符個(gè)數(shù)1,指針1指針定位字符個(gè)數(shù)1= 0?取數(shù)字,與中間結(jié)果相加,再乘以10指向下一個(gè)數(shù)字字符加個(gè)位數(shù)是負(fù)數(shù)則求補(bǔ)存結(jié)果結(jié)束NYYN轉(zhuǎn)換子程序轉(zhuǎn)換子程序程序如下:DATASEGMENTSTR1 DB 7,?,7 DUP(?);第1個(gè)數(shù)的輸入緩沖區(qū)STR2 DB 7,?,7 DUP(?);第2個(gè)數(shù)的輸入緩沖區(qū)NUMDW ?,? ;存轉(zhuǎn)換后的二進(jìn)制數(shù)SUMDW 0 ;存和OVERDB Over flow!,0DH,0AH,$DATAENDS;CODESEGM

50、ENTASSUME CS:CODE,DS:DATAMAINPROC FARSTART: MOV AX,DATAMOV DS,AXMOV AH,0AHLEADX,STR1INT21H ;輸入第一個(gè)數(shù)字串(設(shè)為26)MOV AH,0AHLEADX,STR2INT21H ;輸入第二個(gè)數(shù)字串(設(shè)為33)LEABX,STR1 ;串1的首地址送BXLEADI,NUM ;存二進(jìn)制首地址送DIMOV BP,10CALL CHANGE ;將串1 ASCII碼二進(jìn)制LEABX,STR2 ;串2的首地址送BX LEADI,NUM+2;指向MOV BP,10CALL CHANGE;將串2 ASCII碼二進(jìn)制 MOV

51、AX,NUM ;(AX)=NUM=001AHADD AX,NUM+2 ;兩數(shù)相加,(AX)=003BHMOV SUM,AX;存和JNO NEXT;無(wú)溢出,轉(zhuǎn)NEXTLEA DX,OVERMOV AH,9INT21H;顯示Overflow!NEXT:MOV AH,4CHINT21H;返回DOSMAINENDPCHANGEPROCMOVCL,BX+1;實(shí)際字符數(shù)送CLMOVAL,BX+2;第一個(gè)字符送ALMOVCH,AL;暫存在CHCMPAL,-;第一個(gè)字符是負(fù)號(hào)嗎?JNZNEXT1;不是,轉(zhuǎn)NEXT1DECCL;字符數(shù)減1INCBXNEXT1: ADDBX,2;指向第一個(gè)數(shù)字字符MOVAX,0;

52、清零AX,存二進(jìn)制數(shù)LP1: DECCLJZNEXT2;若(CL)=0,轉(zhuǎn)NEXT2MOVDL,BX ;取字符ANDDL,0FH;轉(zhuǎn)換成BCD碼 ADD AL,DL ;加到中間結(jié)果上 ADC AH,0 MUL BP ;*10 INC BX ;指向下一個(gè)字符 JMP SHORT LP1NEXT2: MOV DL,BX ;取個(gè)位數(shù) AND DL,0FH ;個(gè)位ASCII未組合BCDMOV DH,0 ADD AX,DX ;加個(gè)位數(shù),(AX)=001AH CMP CH,- ;是-? JNZ NEXT3 ;該數(shù)非負(fù),轉(zhuǎn)NEXT3 NEG AX ;若為負(fù),求補(bǔ)NEXT3: MOV DI,AX ;存二進(jìn)制結(jié)果 RETCHANGE ENDP;CODE ENDS END START020732360D020733330D001A21003B00STR1STR2NUMSUM7個(gè)7個(gè)OOVER?0407313234STR1若鍵入 1234330D1234本例題重點(diǎn)掌握:如何從鍵盤(pán)輸入一個(gè)字符串ASCII未組合BCD二進(jìn)制有符號(hào)數(shù)的運(yùn)算,對(duì)負(fù)數(shù)和溢出如何處理思考題: 若鍵入第一個(gè)數(shù)26,第二個(gè)數(shù)為-4,填寫(xiě)各變量結(jié)果。 方法1 計(jì)算二進(jìn)制數(shù)中所包含的1000的個(gè)數(shù)、100的個(gè)數(shù)、10的個(gè)數(shù)和1的個(gè)數(shù)。 方法2 除10取余。下面舉例介紹第一種方法。流程圖如下:二進(jìn)制數(shù)BCD YN

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論