第四章匯編語言程序設(shè)計_第1頁
第四章匯編語言程序設(shè)計_第2頁
第四章匯編語言程序設(shè)計_第3頁
第四章匯編語言程序設(shè)計_第4頁
第四章匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設(shè)計

第一節(jié)

匯編語言源程序匯編語言是用指令的助記符、符號地址、標(biāo)號和偽指令等來書寫程序

一、匯編語言源程序的結(jié)構(gòu)一個完整的匯編語言源程序通常由若干個邏輯段(SEGMENT)組成,包括代碼段、數(shù)據(jù)段、附加段和堆棧段,它們分別映射到存儲器中的物理段上

[例4-1]兩個字(A6B8H,206DH)相加的完整的匯編語言程序

DATA SEGMENT;定義數(shù)據(jù)段

DATA1 DW 0A6B8H;定義被加數(shù)

DATA2DW 206DH;定義加數(shù)

SUM DW2DUP(?);定義和DATA ENDS;數(shù)據(jù)段結(jié)束

CODE SEGMENT;定義代碼段

ASSEMECS:CODE,DS:DATA ;段寄存器說明

START: MOV AX,DATA MOV DS,AX;初始化DS LEA SI,SUM;存放結(jié)果的偏移地址送SI MOV AX,DATA1;取被加數(shù)

ADD AX,DATA2;兩數(shù)相加

MOV [SI],AX;和送入SUM MOV AH,4CH INT 21H;返回DOS CODE ENDS;代碼段結(jié)束

END START;源程序結(jié)束

二、匯編語言語句類型及格式指令性語句的格式:

[標(biāo)號:][前綴]操作碼[操作數(shù)[,操作數(shù)]][;注釋]例如指令性語句:

START:MOVAX,DATA;將立即數(shù)DATA送累加器AX指示性語句的格式:

[名字]偽操作[操作數(shù)[,操作數(shù),…][;注釋]例如指示性語句:DATA1DB56H,78H,9AH;定義字節(jié)型數(shù)據(jù),“DB”是偽操作指令性語句與指示性語句在格式上的區(qū)別:⑴指令性語句中的“標(biāo)號”表示指令的符號地址,其后面通常要加上“:”。指示性語句中的“名字”通常表示變量名、段名和過程名等,其后不加“:”。名字在多數(shù)情況下表示的是變量名,用來表示存儲器中一個數(shù)據(jù)區(qū)的地址。⑵指令性語句中的操作數(shù)最多為兩個操作數(shù),也可以沒有操作數(shù)。而指示性語句中的操作數(shù)可根據(jù)需要有多個,當(dāng)操作數(shù)有不止一個時,相互之間用逗號隔開。匯編語言語句中的操作數(shù)

三、數(shù)據(jù)項及表達式操作數(shù)可以是寄存器、存儲器單元或數(shù)據(jù)項。而數(shù)據(jù)項又可以是常量、標(biāo)號、變量和表達式

1.常量?二進制常量?十進制常量?十六進制常量?字符串常量

2.標(biāo)號

指令的標(biāo)號是由編程者確定的,它不能與指令助記符或偽指令重名,也不允許由數(shù)字開頭,標(biāo)號的字符個數(shù)不超過31個。

指令性語句中的標(biāo)號代表存放一條指令的存儲單元的符號地址,其后通常加一個冒號。

標(biāo)號具有3種屬性:段、偏移量和類型。?標(biāo)號的段屬性是就是標(biāo)號所在段的段地址。?標(biāo)號的偏移量就是標(biāo)號所在段的起始地址到定義該標(biāo)號的地址之間的字節(jié)數(shù)(即偏移地址)。偏移量是一個16位無符號數(shù)。?標(biāo)號的類型有NEAR和FAR兩種。前一種標(biāo)號稱為近標(biāo)號,只能在段內(nèi)被引用,地址指針為2個字節(jié)。后一種標(biāo)號稱為遠標(biāo)號,可以在其他段被引用,地址指針為4個字節(jié)。

3.變量

變量名由字母開頭,長度不超過31個字符。變量是存儲器中某個數(shù)據(jù)區(qū)的名字,因為數(shù)據(jù)區(qū)中的內(nèi)容是可以改變的,因此變量的值也可以改變。變量在指令中可以作為存儲器操作數(shù)引用。變量也具有3種屬性,即:段、偏移量和類型。?變量的段屬性就是它所在段的段地址。因為變量一般在存儲器的數(shù)據(jù)段或附加段中,所以變量的段值在DS或ES寄存器中。?變量的偏移量屬性是該變量所在段的起始地址到變量地址之間的字節(jié)數(shù)。?變量的類型有BYTE(字節(jié))、WORD(字)、DWORD(雙字)、QWORD(四字)、TBYTE(十個字節(jié))等,表示數(shù)據(jù)區(qū)中存取操作對象的大小。

使用變量時需注意以下兩點:⑴變量的類型與指令的要求要相符。例如指令MOVAX,VAR中,要求VAR必須定義為字類型變量。⑵在定義變量時,變量名對應(yīng)的是數(shù)據(jù)區(qū)的首地址。如果數(shù)據(jù)區(qū)中有多個數(shù)據(jù),則對其他數(shù)據(jù)操作時,需修改地址。例如:

BUFFER DB56H,78H,9AH… MOV AL,BUFFER+2;將9AH送(AL)

4.表達式表達式是由常數(shù)、操作數(shù)、操作符和運算符組合而成

表達式中常用的運算符有以下幾種:⑴算術(shù)運算符算術(shù)運算符有+(加)、-(減)、*(乘)、/(除)、MOD(取余)等⑵邏輯運算符邏輯運算符包括AND(與)、OR(或)、NOT(非)、XOR(異或)例如:指令MOVAL,0A6HXOR0CEH等價于MOVAL,68H

⑶關(guān)系運算符關(guān)系運算符包括EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。關(guān)系運算符連接的必須是兩個數(shù)值,或同一段中的兩個存儲單元地址。關(guān)系運算符的運算結(jié)果是一個邏輯值,當(dāng)關(guān)系不成立(為假)時,結(jié)果為0;當(dāng)關(guān)系成立(為真)時,結(jié)果為0FFFFH

⑷取值運算符取值運算符用來分析一個存儲器操作數(shù)的屬性?OFFSET利用運算符OFFSET可以得到一個標(biāo)號或變量的偏移地址。例如:

MOVSI,OFFSETDATA1;將變量DATA1的偏移地址送SI該指令等同于以下指令:

LEASI,DATA1?SEG利用運算符SEG可以得到一個標(biāo)號或變量的段地址。例如:

MOVAX,SEGDATA;將變量DATA的段地址送AXMOVDS,AX;(DS)←(AX)

⑸屬性運算符屬性運算符PTR用來指定其后的存儲器操作數(shù)的類型。例如:MOVAX,WORDPTR[SI];將SI和SI+1所指向的兩個存儲單元送AX

⑹段超越運算符運算符“:”跟在某個段寄存器名(DS、ES、SS或CS)之后表示段超越,用來指定一個存儲器操作數(shù)的段屬性。例如:MOVAX,ES:[BX];將ES段中由BX指向的字操作數(shù)送(AX)第二節(jié)

偽指令

一、數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用來定義一個變量的類型,給存儲器賦初值,或給變量分配存儲空間

1.定義字節(jié)(DB)DB(DefineByte)用來定義一個變量,并初始化其內(nèi)存單元。格式:[變量名]DB表達式表達式可以是以下情況之一:⑴一個常數(shù)表達式;⑵問號(?)作為非確定的初始值;⑶一個或多個字符的字符串;⑷重復(fù)子句:重復(fù)次數(shù)DUP(表達式)…

例如:

DATA1 DB11H,22H,33,44H,55H;定義了5個字節(jié)常數(shù)

STRING1 DB‘A’;定義了一個字符

STRING2 DB‘HowAreYou?’;定義了一個字符串

SUM DB?;預(yù)置了一個不確定的值(變量)

BUFFERDB10DUP(?);預(yù)置了10個具有不確定值的單元

2.定義字(DW)DW(DefineWord)定義一個字(兩個單元)。

DW偽操作后面的每個操作數(shù)都占用兩個字節(jié),在內(nèi)存中存放時,低字節(jié)在前,高字節(jié)在后。DW的格式和表達式與DB類似。例如:

DATA2 DW1234H,5678H,9ABCHBUFFER DW50DUP(?)數(shù)據(jù)定義偽指令還有DD、DQ、DT

二、符號定義偽指令符號定義偽指令EQU用于給一個表達式賦予一個名字。以后在程序中凡是用到該表達式的時候,就用這個名字來代替;在需要修改該表達式的值時,只需在賦予名字的地方修改即可。其格式為:名字

EQU表達式格式中的表達式可以是一個常數(shù)、符號、數(shù)值表達式、地址表達式,甚至可以是指令助記符。

例如:

COUNT EQU100;常量

VAR EQU64*1024;數(shù)值表達式

ADDREQUDS:[BP+8];地址表達式

GOTOEQUJMP;指令助記符

EQU指令不能對同一個符號重復(fù)定義。若希望對同一個符號重復(fù)定義,可以用“=”偽指令。例如:

EMP=60H;EMP代表數(shù)值60H…EMP=80H;在此將EMP重新賦值,EMP代表數(shù)值80H

三、段定義偽指令段定義語句可使編程者按段組織程序和使用存儲器。段定義偽指令有SEGMENT和ENDS

段名

SEGMENT[定位類型][組合類型][‘類別’]┆

段名

ENDS

1.定位類型:表示此段的起始邊界要求,可以是PAGE,PARA,WORD和BYTE。它們表示如下的地址要求:

PAGE=××××

××××

××××

0000

0000B PARA=××××

××××

××××

××××

0000B(隱含值)

WORD=××××

××××

××××

××××

×××0B BYTE=××××

××××

××××

××××

××××B

分別稱它們?yōu)橐皂?、?jié)、字、字節(jié)為邊界。若該項省略,則其默認值位PARA。

2.組合類型:用來告訴連接程序本段與其他段的關(guān)系,分別為NONE,PUBLIC,COMMON,AT表達式以及STACK和MEMORY。

四、設(shè)定段寄存器偽指令偽指令A(yù)SSUME告訴匯編程序一個段屬于哪個段寄存器。當(dāng)匯編程序遇到一個段名時,它就自動地引用給出的段寄存器將段名加以匯編。格式為:

ASSUME段寄存器名:段名[,段寄存器名:段名[,…]]格式中的段寄存器名可以是CS、DS、ES或SS。

在一個源程序中,ASSUME偽指令要放在可執(zhí)行程序開始位置的前面。例如,以下程序是一個完整代碼段的定義方法。

CODE SEGMENTPARAPUBLIC‘CODE’ ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACK MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX MOV AX,STACK MOV SS,AX…… CODE ENDS

五、過程定義偽指令過程就是子程序。調(diào)用過程和從過程返回的指令是CALL和RET。

過程定義偽指令的格式為:

過程名

PROC[NEAR/FAR] ┆ RET

過程名

ENDP[例4-2]編寫一個軟件延時的子程序。

DELAY PROC;定義一個過程

PUSH BX;保護BX原來的內(nèi)容

PUSHCX;保護CX原來的內(nèi)容

MOV BL,50;外循環(huán)次數(shù)

NEXT: MOV CX,2000;內(nèi)循環(huán)次數(shù)

WAITS: LOOP WAITS;(CX)≠0則循環(huán)

DEC BL;修改外循環(huán)計數(shù)值

JNZ NEXT;(BX)≠0則繼續(xù)外循環(huán)

POP CX;恢復(fù)CX原來的內(nèi)容

POP BX;恢復(fù)BX原來的內(nèi)容

RET;過程返回

DELAY ENDP;過程結(jié)束

六、結(jié)束偽指令END偽指令表示程序到此為止,告訴匯編程序匯編任務(wù)到此結(jié)束。其格式為:

END[標(biāo)號]END偽操作后面的標(biāo)號表示程序的開始地址。第三節(jié)

DOS功能調(diào)用

所有的DOS系統(tǒng)功能調(diào)用都是利用軟中斷指令I(lǐng)NT21H來實現(xiàn)的。INT21H是一個具有90多個子功能的中斷服務(wù)程序,這些子功能大致可分為設(shè)備管理、目錄管理、文件管理和其他等四個方面。INT21H對每一個子功能都進行了編號-稱為功能號。DOS系統(tǒng)功能調(diào)用的方法為:①AH←功能號;②在其他寄存器中放入該功能所要求的入口參數(shù);③INT21H;INT21H的幾個最常用的功能

1.鍵盤輸入單字符功能號1和功能號8都可以接收鍵盤輸入的單字符,輸入的字符以ASCII碼的形式放在累加器AL中。其中1號功能有回顯,即鍵盤輸入的內(nèi)容在放入累加器AL的同時,在顯示其上也顯示出來;8號功能無回顯。鍵盤輸入單字符的功能常用來回答程序中的提示信息,或選擇菜單中的可選項以執(zhí)行不同的程序段。[例4-3]從鍵盤輸入“Y”或“N”來選擇程序的走向

SECLE: MOV AH,01H

INT 21H

CMP AL,’Y’ JE YES

CMP AL,’N’ JE NO

JMP SECLEYES:┆NO: ┆

2.鍵盤輸入字符串鍵盤輸入字符串通過0AH號功能來實現(xiàn)。該功能要求用戶定義一個輸入緩沖區(qū)來存放輸入的字符串

在調(diào)用本功能前,應(yīng)把鍵入緩沖區(qū)的起始地址預(yù)置入DX寄存器。

[例4-4]從鍵盤上輸入字符串‘HOWAREYOU?’,并在串尾加結(jié)束標(biāo)志‘$’。DATA SEGMENT STRING DB20,?,20DUP(?)DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXLEADX,STRING MOVAH,0AH

INT 21HMOVCL,STRING+1XORCH,CH

ADDCX,2 ADDDX,CXMOV BX,DX MOVBYTEPTR[BX],’$’MOV AH,4CHINT 21H CODEENDS ENDSTART

3.顯示器顯示單字符

2號功能用于在顯示器上顯示單個字符。其程序段如下: …

MOV DL,<待顯示字符的ASCII碼>;待顯示字符的ASCII碼必須放在DL中

MOV AH,02H;功能號02H→AH INT 21H;執(zhí)行系統(tǒng)功能調(diào)用

4.顯示器顯示字符串9號功能用于在顯示器上顯示一個字符串,要求被顯示的字符串必須以“$”字符作為結(jié)束符,否則會引起屏幕混亂。顯示時如果希望光標(biāo)能自動換行,則應(yīng)在字符串結(jié)束前加上回車及換行的ASCII碼0DH和0AHMOV DX,<要顯示字符串的首地址>;要顯示字符串的首地址送DX MOV AH,09H;功能號09H→AH INT 21H;執(zhí)行系統(tǒng)功能調(diào)用[例4-5]在數(shù)據(jù)段內(nèi)定義兩句話:“PRESSANYKEYINTHEKEYBOARD.”,“THERESULTWILLDISPLAYINSCREEN”。將這兩句話在屏幕上分兩行顯示出來

DATASEGMENT

STRINGDB‘PRESSANYKEYINTHEKEYBOARD.’,0DH,0AH DB‘THERESULTWILLDISPLAYINSCREEN.,0DH,0AH,’$’ DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,OFFSETSTRING MOV AH,09H INT 21H

MOV AH,4CH;返回DOS INT 21H CODE ENDS ENDSTART

5.返回DOS一個程序執(zhí)行完后,應(yīng)使程序正常退出并返回到DOS,可使用DOS系統(tǒng)功能調(diào)用的4CH號功能。用4CH號功能返回DOS的程序段如下;

MOV AH,4CH;功能號送AH INT 21H;返回DOS第四節(jié)

匯編語言程序設(shè)計基礎(chǔ)設(shè)計匯編語言源程序的基本步驟為:⑴分析實際問題,并抽象出描述問題的數(shù)學(xué)模型,確定解決問題的算法與思路;⑵畫程序流程圖(簡單程序可省略此步);⑶為數(shù)據(jù)和程序代碼分配內(nèi)存單元和寄存器;⑷編寫源程序;⑸上機調(diào)試與修改,進行結(jié)果分析。在進行匯編語言源程序設(shè)計時,通常用到四種基本程序結(jié)構(gòu):順序程序、分支程序、循環(huán)程序、子程序。

1.順序程序順序程序是最常見、最基本的程序結(jié)構(gòu),其特點是程序順序地執(zhí)行,無分支,無循環(huán)與轉(zhuǎn)移。CPU按照指令的排列順序逐條執(zhí)行。[例4-6]內(nèi)存中自TABLE開始存放0~9的平方值,通過人機對話方式,對任意輸入的數(shù)x(0~9),查表得到x的平方值,將其放在AL中。

DATA SEGMENT TABLE DB0,1,4,9,16,25,36,49,64,91

BUF DB‘PLEASEINPUTONENUMBER(0~9):’,0DH,0AH,’$’ DATA ENDS STACK SEGMENTPARASTACK‘STACK’ DB100DUP(?) STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV BX,OFFSETTABLE;TABLE的偏移地址送BX

MOV DX,OFFSETBUF;9號功能調(diào)用,顯示字符串

MOV AH,09H;提示輸入一個數(shù)

INT 21H MOV AH,01H;1號功能調(diào)用,鍵入數(shù)送AL INT 21H MOV AH,0;AH清零

AND AL,0FH;屏蔽高4位

ADD BX,AX;得到輸入數(shù)的平方在表中的地址

MOV AL,[BX];輸入數(shù)的平方送AL MOV AH,4CH;返回DOS INT 21H CODE ENDS END START

2.分支程序除最基本的順序程序外,經(jīng)常會碰到根據(jù)不同的條件而轉(zhuǎn)移到不同程序段去執(zhí)行的各種分支程序。分支結(jié)構(gòu)程序通常采用條件轉(zhuǎn)移指令來實現(xiàn)。[例4-7]變量x的符號函數(shù)如下所示: 1當(dāng)x>0y=0當(dāng)x=0-1當(dāng)x<0編程程序,根據(jù)x的值給y賦值。

DATA SEGMENT x DW? y DW? DATA ENDS STACK SEGMENTSTACK‘STACK’ DB100DUP(?) STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,x;取x的值

AND AX,AX;建立標(biāo)志

JZ ZERO;x=0轉(zhuǎn)ZERO JNS PLUS;x>0轉(zhuǎn)PLUS MOV BX,0FFFFH;x<0令bx=-1 JMP DONE ZERO: MOV BX,0 JMP DONE PLUS: MOV BX,1 DONE: MOV y,BX;存放結(jié)果

MOV AH,4CH;返回DOS INT 21H CODE ENDS END START

3.循環(huán)程序凡是程序中需要重復(fù)做的工作,都可以用循環(huán)結(jié)構(gòu)程序來實現(xiàn)。包括以下四個部分:?初始化:為循環(huán)作準(zhǔn)備,設(shè)置循環(huán)計數(shù)值,設(shè)置變量初值。?循環(huán)體:循環(huán)部分的核心,包括循環(huán)的全部指令。?修改參數(shù):修改操作數(shù)地址,為下次循環(huán)作準(zhǔn)備。?循環(huán)控制:修改計數(shù)器值,判斷循環(huán)控制條件,決定是否跳出循環(huán)。[例4-8][例4-8]把從TABLE單元開始的100個16位無符號數(shù)按從大到小的順序排列。?本題是一個排序問題。因為是無符號數(shù)的比較,所以可直接用比較指令CMP和條件轉(zhuǎn)移指令JNC來實現(xiàn)。?本題用雙重循環(huán)。先使第一個數(shù)與下一個數(shù)比較,若大于則其位置不變,若小于則使兩數(shù)交換位置。?以上完成了一次排序工作。再通過第二重的99次循環(huán),即可實現(xiàn)100個無符號數(shù)的大小排序。

DATASEGMENT TABLE DW100DUP(?)DATAENDS

CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DI,TABLE;DI指向要排序的數(shù)的首址

MOV BL,99;外循環(huán)需99次 ;外循環(huán)從此開始NEXT1:MOV SI,DI;SI指向當(dāng)前要比較的數(shù)

MOV CL,BL;CL為內(nèi)循環(huán)計數(shù)器,循環(huán)次數(shù)每次少1 ;以下為內(nèi)循環(huán)NEXT2:MOV AX,[SI];取第一個數(shù)Ni ADD SI,2;指向下一個數(shù)Nj

CMP AX,[SI];Ni≥Nj?

JNC NEXT3;若大于,則不交換

MOV DX,[SI];否則,交換Ni和Nj

MOV [SI-2],DX MOV [SI],AX NEXT3:DEC CL;內(nèi)循環(huán)結(jié)束?

JNZ NEXT2;若未結(jié)束,則繼續(xù) ;內(nèi)循環(huán)到此結(jié)束

DEC BL;外循環(huán)結(jié)束?

JNZ NEXT1;若未結(jié)束,則繼續(xù) ;外循環(huán)結(jié)束

MOV AH,4CH;返回DOS INT 21H CODE ENDS END START

4.子程序在使用子程序時應(yīng)注意以下幾點:⑴參數(shù)傳遞。參數(shù)傳遞可通過寄存器、存儲器、堆棧等方式進行。⑵相應(yīng)寄存器內(nèi)容的保護與恢復(fù)。為保護調(diào)用程序中寄存器的內(nèi)容,在子程序的入口處,將子程序中將要用到寄存器的原來的內(nèi)容壓入堆棧保存;在子程序結(jié)束之前,將壓入堆棧寄存器的原來內(nèi)容恢復(fù)出來。⑶子程序嵌套。每一個子程序都包括在過程定義偽指令PROC…ENDP中間。與子程序調(diào)用有關(guān)的CPU指令為CALL和RET。

[例4-9]某一外設(shè)的狀態(tài)端口為0378H,數(shù)據(jù)端口為03F8H。當(dāng)狀態(tài)端口的第1位(Bit1)為0時,表示外設(shè)忙;為1則表示外設(shè)可以接收數(shù)據(jù)。編寫一個子程序,將當(dāng)前段中從BUFFER開始的連續(xù)100個字節(jié)的內(nèi)容從數(shù)據(jù)端口輸出到外設(shè)。通過接口向外設(shè)輸出數(shù)據(jù)時,要判斷外設(shè)是否處于忙的狀態(tài),只有外設(shè)不忙時,才能進行輸出。

SENDATA PROC FAR;定義為遠過程

PUSH AX;保護子程序中用到寄存器的原來內(nèi)容

PUSH DX PUSH SI PUSH CX LEA SI,BUFFER;數(shù)據(jù)的起始地址送SI MOV CL,100;要輸出的字節(jié)數(shù)

AGAIN: MOV DX,0378H;I/O狀態(tài)端口

WAITING: IN AL,DX;讀入I/O狀態(tài)端口

TEST AL,02H;外設(shè)忙?(測試Bit1) JZ WAITING;若外設(shè)忙(Bit1=0),則循環(huán)等待

MOV AL,[SI];否則,取一個數(shù)準(zhǔn)備輸出

MOV DX,03F8H;I/O數(shù)據(jù)端口

OUT DX,AL;輸出一個字節(jié)

INC SI;指向下一個字節(jié)

DEC CL;計數(shù)器減1

JNZ AGAIN;若未輸出完,則循環(huán)

POP CX

;恢復(fù)寄存器原來的內(nèi)容

POP SI POP DX POP AX RET;返回主程序

SENDATA ENDP;過程定義結(jié)束

在主程序中調(diào)用這個子程序的語句為: …

MOV AX,DATA MOV DS,AX CALL SENDATA第五節(jié)

常見程序設(shè)計舉例

[例4-10]統(tǒng)計一個數(shù)據(jù)區(qū)中負數(shù)的個數(shù)。

DATA SEGMENT MEM DB1,0,-1,55,100,-23,-2,10;帶符號數(shù)

DB36,-1,-2,0,125,-101,66,99 LEN EQU$-MEM;數(shù)的個數(shù)

RESULT DW?;存放結(jié)果

DATA ENDS STACK SEGMENTPARA‘STACK’ DW100DUP(?) STACK ENDS CODE SEGMENT ASSEMECS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOC SS,AX

MOV BX,OFFSETMEM MOV CX,LEN MOV DX,0;結(jié)果的初值

AGAIN:MOV AL,[BX] CMP AL,0 JGE DO INC DX DO: INC BX LOOP AGAIN MOV RESULT,DX;負數(shù)的個數(shù)送RESULT MOV AH,4CH;返回DOS INT 21H CODE ENDS END START

[例4-11]把用ASCII碼形式表示的數(shù)轉(zhuǎn)換為二進制碼。ASCII碼存放在以MASC為首地址的存儲單元中,轉(zhuǎn)換結(jié)果放在MBIN。

分析: ?通常從鍵盤上輸入的數(shù)都是以ASCII碼的形式存放在內(nèi)存中的。另外數(shù)據(jù)區(qū)中以字符形式定義的數(shù)(用單引號括起來的數(shù)),在內(nèi)存中也是以其對應(yīng)的ASCII碼存放的。?對16進制數(shù)來說,0~9的ASCII碼分別為30H~39H。所以對這十個數(shù),只需將其ASCII碼減去30H,就可得到對應(yīng)的二進制數(shù)。A~F的ASCII碼分別為41H~46H,所以要減去37H。?若取的數(shù)不在0~FH范圍內(nèi),則出錯。DATA SEGMENT MASC DB‘6’,’3’,’B’,’2’;要轉(zhuǎn)換的ASCII碼

MBIN DB2DUP(?)DATA ENDSCODE SEGMENT ASSEMUCS:CODE,DS:DATABEGIN:MOV AX,DATA MOV DS,AX MOV CL,4;循環(huán)次數(shù)送CL MOV CH,CL;保存循環(huán)次數(shù)

LEA SI,MASC;ASCII碼單元首地址送SI CLD;按地址增量方向

XOR AX,AX;中間結(jié)果清零

XOR DX,DX

NEXT1:LODS MASC;裝入一個ASCII碼到AL AND AL,7FH;得到7位ASCII碼

CMP AL,’0’ JL ERROR;若(AL)<0,則轉(zhuǎn)ERROR CMP AL,’9’ JG NEXT2;若(AL)>9,則轉(zhuǎn)NEXT2 SUB AL,30H;若為數(shù)字0~9,則轉(zhuǎn)換為二進制數(shù)

JMP NEXT3NEXT2:CMP AL,’A’ JL ERROR;若(AL)<’A’,則轉(zhuǎn)ERROR CMP AL,’F’ JG ERROR;若(AL)>’F’,則轉(zhuǎn)ERROR SUB AL,37H;若為數(shù)字A~F,則轉(zhuǎn)換為二進制數(shù)

NEXT3:OR DL,AL;一個數(shù)的轉(zhuǎn)換結(jié)果送DL ROR DX,CL;整個轉(zhuǎn)換結(jié)果在(DX)中依次存放

DEC CH JNZ NEXT1;未轉(zhuǎn)換完則轉(zhuǎn)NEXT1 MOV WORDPTRMBIN,DX;最后結(jié)果送MBIN MOV AH,4CH;返回DOS INT 21HCODE ENDS END BEGIN[例4-12]把在內(nèi)存變量NUMBER中的16位二進制數(shù)的每一位轉(zhuǎn)換為相應(yīng)的ASCII碼,并且存入串變量STRING中。

DATA SEGMENT NUMBER DW5E8AH STRING DB16DUP(?) DATA ENDS STACK SEGMENTPARASTACK‘STACK’ DB100DUP(?) STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX

LEA DI,STRING MOV CX,16 PUSH DI PUSH CX MOV AL,30H;使緩沖區(qū)全置為’0’

REP STOSB POP CX POP DI MOV AL,31H MOV BX,NUMBER

AGAIN: RCL BX,1;左移BX,相應(yīng)位進入CF標(biāo)志

JNC NEXT;若為零則轉(zhuǎn)至NEXT MOV[DI],AL;若為“1”,則把“1”置入緩沖區(qū)NEXT: INC DI LOOPAGAINMOV AH,4CH;返回DOS INT 21HCODE ENDS END START

[例4-13]在鍵盤上輸入一個字符串,并在內(nèi)存中已有的一張表中查找該字符串,若找到則在屏幕上顯示“OK!”,否則顯示“NO!”,若輸入字符長度大于表長度,則顯示“WRONG!”。分析:?在查找前,首先要判斷輸入字符串的長度是否大于已有表的長度。若大于則表示輸入的字符串太長,顯示“WRONG!”。否則才能進行比較。?先在表中查找字符串的第一個字符,若找到,再比較字符串的其他字符是否一致。?在屏幕上顯示一個字符串可用DOS功能調(diào)用中的09H號功能;從鍵盤上接收一個字符串可用DOS功能調(diào)用中的0AH號功能。DATA SEGMENTTABLE DB‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’STRING1 DB‘PLEASEENTERASTRING:’,0DH,0AH,’$’STRING2 DB‘WRONG!’,0DH,0AH,’$’STRING3 DB‘OK!$’STRING4 DB‘NO!$’BUFFER DB40,?,40DUP(?);鍵盤輸入緩沖區(qū)

TAB_LEN EQU26 DATA ENDS STACK SEGMENT DB100DUP(?) STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS;DATA,ES:DATA,SS:STACK

START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,STRING1;顯示“PLEASEENTERASTRING:” MOV AH,09H INT 21H LEA DX,BUFFER;從鍵盤讀字符串

MOV AH,0AH INT 21H MOV SI,DX;串首地址送SI INC SI MOV BL,[SI] MOV BH,0

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論