匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩127頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言的特點(diǎn):利用匯編語(yǔ)言可以設(shè)計(jì)出效率較高的核心底層程序,如設(shè)備驅(qū)動(dòng)程序;用匯編語(yǔ)言編寫(xiě)的程序一般比用高級(jí)語(yǔ)言編寫(xiě)的程序執(zhí)行得快,且占內(nèi)存較少;匯編語(yǔ)言程序能夠直接有效地利用機(jī)器硬件資源,在一些實(shí)時(shí)控制系統(tǒng)中更是不可缺少和代替的;學(xué)習(xí)匯編語(yǔ)言是進(jìn)行計(jì)算機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的先決條件。匯編語(yǔ)言的應(yīng)用70%以上的系統(tǒng)軟件是用匯編語(yǔ)言編寫(xiě)的某些快速處理、位處理、訪問(wèn)硬件設(shè)備等高效程序是用匯編語(yǔ)言編寫(xiě)的某些高級(jí)繪圖程序、視頻游戲程序是用匯編語(yǔ)言編寫(xiě)的匯編語(yǔ)言是我們理解整個(gè)計(jì)算機(jī)系統(tǒng)的最佳起點(diǎn)和最有效途徑主要內(nèi)容:匯編語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言的語(yǔ)句與格式偽指令功能調(diào)用匯編語(yǔ)言程序設(shè)計(jì)4.1匯編語(yǔ)言源程序了解:計(jì)算機(jī)的三種語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言語(yǔ)句格式計(jì)算機(jī)設(shè)計(jì)語(yǔ)言機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言面向機(jī)器的語(yǔ)言機(jī)器語(yǔ)言匯編語(yǔ)言高級(jí)語(yǔ)言面向算法、過(guò)程或?qū)ο蟮恼Z(yǔ)言匯編程序匯編語(yǔ)言源程序用助記符編寫(xiě)源程序的編譯程序匯編程序匯編語(yǔ)言源程序機(jī)器語(yǔ)言目標(biāo)程序匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程輸入?yún)R編語(yǔ)言源程序源文件.ASM匯編(編譯)目標(biāo)文件.OBJ鏈接可執(zhí)行文件.EXE調(diào)試最終程序匯編語(yǔ)言上機(jī)過(guò)程YYYNNN有錯(cuò)

?有錯(cuò)?有錯(cuò)

?結(jié)束匯編輸入(修改)源程序連接運(yùn)行查錯(cuò)開(kāi)始用EDIT,NOTEPAD等任何文本編輯器。源程序存為.ASM文件用MASM宏匯編程序進(jìn)行匯編。匯編后生成.OBJ目標(biāo)文件。命令格式:MASM<源文件名.ASM>;用LINK連接程序進(jìn)行連接。連接后生成.EXE可執(zhí)行文件。命令格式:LINK<目標(biāo)文件名.OBJ>;用TD、DEBUG等調(diào)試程序進(jìn)行調(diào)試。命令格式:TD<可執(zhí)行文件名.EXE>數(shù)據(jù)段名SEGMENT…數(shù)據(jù)段名ENDS附加段名SEGMENT…附加段名ENDS堆棧段名SEGMENT…堆棧段名ENDS代碼段名SEGMENT…代碼段名ENDSEND

4.1.1匯編語(yǔ)言源程序的結(jié)構(gòu)

匯編語(yǔ)言的語(yǔ)句有兩種:指令性語(yǔ)句——由8086指令助記符構(gòu)成的語(yǔ)句指示性語(yǔ)句——由偽指令構(gòu)成的語(yǔ)句指令性語(yǔ)句的格式為:[標(biāo)號(hào):]

[前綴]

指令助記符

[目的操作數(shù),源操作數(shù)][;注釋]指示性語(yǔ)句的格式為:[名字]

偽指令

[操作數(shù)1,操作數(shù)2,…,操作數(shù)n][;注釋]

4.1.2匯編語(yǔ)言的語(yǔ)句與格式各部分之間至少要用一個(gè)空格作為分隔符指令性語(yǔ)句由CPU執(zhí)行,每一條指令性語(yǔ)句都有一條機(jī)器碼指令與其對(duì)應(yīng);

指示性語(yǔ)句由匯編程序執(zhí)行。它指出匯編程序應(yīng)如何對(duì)源程序進(jìn)行匯編,如何定義變量、分配存儲(chǔ)單元以及指示程序開(kāi)始和結(jié)束等。指示性語(yǔ)句無(wú)機(jī)器碼指令與其相對(duì)應(yīng)。

指令性語(yǔ)句匯編時(shí)生成機(jī)器碼;指示性語(yǔ)句匯編時(shí)不生成機(jī)器碼。語(yǔ)句的構(gòu)成元素:標(biāo)號(hào)——指令的符號(hào)地址,用來(lái)代表指令在存儲(chǔ)器中的地址。只能出現(xiàn)在指令性語(yǔ)句中,標(biāo)號(hào)后應(yīng)加上冒號(hào)。名字——段、過(guò)程、變量的名字,用來(lái)代表它們?cè)诖鎯?chǔ)器中的地址。只能出現(xiàn)在指示性語(yǔ)句中,名字后不加冒號(hào)。指令助記符——8086助記符、偽指令操作數(shù)——即指令的操作對(duì)象對(duì)指令性語(yǔ)句——0,1,2個(gè)對(duì)指示性語(yǔ)句——根據(jù)需要而定操作數(shù)之間以逗號(hào)分隔操作數(shù)可以是:寄存器、存儲(chǔ)單元、常數(shù)或表達(dá)式

例如:AX,[DI+BX+10],200,16*8+TABLE,等等注釋——以分號(hào)開(kāi)頭,可放在指令后,也可單獨(dú)一行。

注意注解的寫(xiě)法。要寫(xiě)指令(段)在程序中的作用,而不要寫(xiě)指令的操作。

例如:以下為同一條指令寫(xiě)的注釋

1)MOVCX,100;傳送100到CX2)MOVCX,100;循環(huán)計(jì)數(shù)器置初值顯然,第二種寫(xiě)法要比第一種寫(xiě)法要好。匯編語(yǔ)言的一個(gè)實(shí)例:hello.asm

dataSEGMENTHelloDB‘Hello,world!’,0DH,0AH,’$’dataENDSprogSEGMENTASSUME

CS:prog,DS:datastart:MOVAX,dataMOVDS,AX

LEADX,hello

;取字符串首地址

MOVAH,9INT21H ;顯示字符串

MOVAH,4CHINT21H ;退回DOSprogENDSENDstart名字標(biāo)號(hào)寄存器存儲(chǔ)器單元常量變量或標(biāo)號(hào)表達(dá)式4.1.3數(shù)據(jù)項(xiàng)與表達(dá)式常量數(shù)字常量字符串常量:用引號(hào)引起的字符或字符串例:‘A’,’ABCD’匯編時(shí)被譯成對(duì)應(yīng)的ASCII碼41H,42H,43H,44H標(biāo)號(hào)的屬性:

段地址:即標(biāo)號(hào)所在段的段地址;

偏移量:標(biāo)號(hào)所代表存儲(chǔ)單元的段內(nèi)偏移地址;

類型:NEAR或FAR:

NEAR—表示標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/

調(diào)用指令在同一碼段內(nèi),跳轉(zhuǎn)時(shí)只需改變IP即可。

FAR—標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/調(diào)用指令不在同一代碼段內(nèi)。

若沒(méi)有對(duì)類型進(jìn)行說(shuō)明,默認(rèn)為NEAR。標(biāo)號(hào)通常作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址。標(biāo)號(hào)變量代表內(nèi)存中的數(shù)據(jù)區(qū),程序中視為存儲(chǔ)器操作數(shù)變量的屬性:段值變量所在段的段地址偏移量變量所在段的起始地址到變量地址之間的字節(jié)數(shù)類型字節(jié)型、字型和雙字型變量在程序中作為存儲(chǔ)器操作數(shù)被引用標(biāo)號(hào)和變量名的使用規(guī)則組成:A-Z(不分大小寫(xiě)),0-9,?@._$不能以數(shù)字開(kāi)頭,圓點(diǎn)(.)只能作為首字符長(zhǎng)度小于31個(gè)字符不能與保留字(指令助記符、偽指令、預(yù)定義符號(hào)等)重名不能重復(fù)定義例如:

正確的:LP1,AGAIN,NEXT,_GO,OK_1

錯(cuò)誤的:4M,LOOP,AAA,#HELP,+ONE表達(dá)式表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與運(yùn)算符的組合。有數(shù)字表達(dá)式和地址表達(dá)式兩種。匯編時(shí)按優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算,計(jì)算出具體的數(shù)值或地址。運(yùn)行時(shí)不能改變。表達(dá)式中的運(yùn)算符有6類:算術(shù)、邏輯、關(guān)系、取地址、屬性、其它類。算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符取值運(yùn)算和屬性運(yùn)算符其它運(yùn)算符用于數(shù)字表達(dá)式,例:

MOVAX,4*1024匯編后的形式為:MOVAX,4096用于地址表達(dá)式,例:LEASI,TAB+3若TAB的偏移地址為1000H,則匯編后的形式為:

LEASI,[1003H]算術(shù)運(yùn)算符——+、-、*、/,MOD邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中。例:MOV CL,36HAND0FH

經(jīng)匯編后:MOVCL,06H注意,不要把邏輯運(yùn)算符與邏輯運(yùn)算指令混淆:例:ANDAX,3FC0HAND0FF00H

匯編后源操作數(shù)被翻譯為:3F00H,所以上述指令與ANDAX,3F00H等價(jià)。邏輯運(yùn)算符——AND、OR、XOR、NOT關(guān)系運(yùn)算的結(jié)果是一個(gè)邏輯值:真或假關(guān)系為真,結(jié)果為全1

關(guān)系為假,結(jié)果為全0例:MOVBX,PORTGT300H

若PORT的值大于300H,則匯編后為:

MOVBX,0FFFFH

否則匯編后為:

MOVBX,0關(guān)系運(yùn)算符——EQ、NE、LT、GT、LE、GE取值運(yùn)算符OFFSET取得其后變量或標(biāo)號(hào)的偏移地址SEG取得其后變量或標(biāo)號(hào)的段地址TYPE取變量的類型LENGTH取所定義存儲(chǔ)區(qū)的長(zhǎng)度SIZE取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)取值運(yùn)算符例MOVAX,SEGDATAMOVDS,AXMOVBX,OFFSETDATA

LEABX,DATA等價(jià)于取值運(yùn)算符例若BUFFER存儲(chǔ)區(qū)是用如下偽指令定義:

BUFFERDW200DUP(0)

則:

TYPEBUFFER 等于2LENGTHBUFFER 等于200SIZEBUFFER 等于400屬性運(yùn)算符——PTR用來(lái)指定地址操作數(shù)的類型格式:<類型>PTR<地址操作數(shù)>

類型∈{BYTE,WORD,DWORD,NEAR,FAR}BYTE、WORD、DWORD

用于描述數(shù)據(jù)存儲(chǔ)單元(變量)地址NEAR、FAR

用于描述轉(zhuǎn)移、調(diào)用的目的地址例:MOV BYTEPTR[DI],0;字節(jié)類型

MOV WORDPTR[DI],0;字類型

MOV [DI],0B5H;類型不定PTR也可用來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換例:STR1DW? ;STR1定義為字類型

MOV AX,STR1;合法

MOV AL,STR1;非法

MOVAL,BYTEPTRSTR1;合法其它運(yùn)算符方括號(hào)

[]方括號(hào)中內(nèi)容為操作數(shù)的偏移地址段重設(shè)符:段寄存器名:[]用于修改默認(rèn)的段基地址4.2偽指令由匯編程序執(zhí)行的“指令系統(tǒng)”用于定義變量、分配存儲(chǔ)區(qū)、定義邏輯段、指示程序開(kāi)始和結(jié)束等常用偽指令數(shù)據(jù)定義偽指令符號(hào)定義偽指令段定義偽指令結(jié)束偽指令過(guò)程定義偽指令宏定義偽指令4.2.1數(shù)據(jù)定義偽指令用于定義數(shù)據(jù)區(qū)中變量的類型格式:[變量名]偽操作操作數(shù)[,…];注釋某些情況下可省略可選偽指令助記符DB定義的變量為字節(jié)型DW定義的變量為字類型(雙字節(jié))DD定義的變量為雙字型(4字節(jié))DQ定義的變量為四字型(8字節(jié))DT定義的變量為10字節(jié)型DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD11H*2,22H,33445566H以上變量在內(nèi)存中的存放形式偽指令的性質(zhì)決定所定義變量的屬性定義字符串必須用DB偽指令例:

DATA1DB‘ABCD’,66H‘A’‘B’‘C’‘D’41H42H43H44H66H重復(fù)操作符DUP為一個(gè)數(shù)據(jù)區(qū)的各單元設(shè)置相同的初值格式:

[變量名]偽指令助記符nDUP(初值,…)例:

DW20DUP(0)

DB3DUP(22H,11H,?)隨機(jī)數(shù)用?預(yù)留存儲(chǔ)空間MEM1DB34H,’A’,?,?,?MEM2DW20DUP(?)預(yù)留40個(gè)字節(jié)單元例:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH匯編后的內(nèi)存分配情況如右圖所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHDATA_BDATA_WDATA_D10510H100H-40FFFBH例:操作數(shù)可以是字符串,例如

STRDB ‘HELLO’匯編后的情況如圖:STR‘H’‘E’‘L’‘L’‘O’注意下面兩個(gè)定義的不同之處:DB ‘AB’ ;41H在低字節(jié),42H在高字節(jié)DW‘AB’;42H在低字節(jié),41H在高字節(jié)48H45H4CH4CH4FH例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3設(shè)TABLE的偏移地址為0080H,則匯編后如下圖所示:BUFFER0080H80HTABLE008AH008BH008CH008DH...8FH00H00H0089H10Bytes4.2.2符號(hào)定義偽指令把一個(gè)表達(dá)式用一個(gè)符號(hào)表示,以后凡出現(xiàn)該表達(dá)式的地方都可用這個(gè)符號(hào)表示。符號(hào)定義偽指令有兩種:EQU,=用EQU定義的符號(hào)未清除前,不能重新定義。清除EQU定義可用PURGE偽指令。用”=”定義的符號(hào)可在任何時(shí)候進(jìn)行重定義。二者均不占用存儲(chǔ)空間,僅是給符號(hào)賦值

例:FIVEEQU5

COUNTEQUCX

TENEQU10

DIST=BYTEPTR[SI+BP]GOTO=JMP…MOVAX,TENMOVCX,COUNTADDDIST,FIVEDIST=WORDPTR[SI+BP+1]ADDDIST,AX

GOTOLABEL定義引用4.2.3段定義偽指令說(shuō)明邏輯段的起始和結(jié)束說(shuō)明不同程序模塊中同類邏輯段之間的聯(lián)系形態(tài)匯編語(yǔ)言程序是按段來(lái)組織程序和數(shù)據(jù)的。和存儲(chǔ)器的物理段相對(duì)應(yīng),匯編語(yǔ)言程序中的段稱為邏輯段。匯編連接后被映射到物理段中。三類段:代碼(程序)、數(shù)據(jù)、堆棧段定義偽指令:SEGMENT、ENDS、ASSUME、ORG定義一個(gè)段的基本格式:

段名

SEGMENT

[定位類型][組合方式][類別]<匯編語(yǔ)言語(yǔ)句>

段名

ENDS這兩個(gè)偽指令總是成對(duì)出現(xiàn),二者前面的段名應(yīng)一致。SEGMENT說(shuō)明了一個(gè)段的開(kāi)始,ENDS說(shuō)明了一個(gè)段的結(jié)束。對(duì)數(shù)據(jù)段和堆棧段,段中的語(yǔ)句一般是變量定義。對(duì)代碼段則是指令語(yǔ)句。如:dataSEGMENT<指令語(yǔ)句>dataENDSSEGMENT和ENDS偽指令A(yù)SSUME偽指令在代碼段中,還必須明確段和段寄存器的關(guān)系,這由ASSUME語(yǔ)句來(lái)指定。如

ASSUMECS:code,DS:data,ES:data

語(yǔ)句中的code和data為段名。這個(gè)語(yǔ)句說(shuō)明:

1.CS將指向名字為code的代碼段

2.DS和ES將指向名字為data的數(shù)據(jù)段但要注意,ASSUME偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系,并沒(méi)有給段寄存器賦予實(shí)際的初值。故下面的語(yǔ)句

MOV AX,DATAMOV DS,AXMOV ES,AX將段基址裝入段寄存器。如果程序中用到堆棧段,則SS也需裝入實(shí)際的初值。代碼段基地址不需要程序員裝入CS寄存器,而由OS負(fù)責(zé)裝入。SEGMENT語(yǔ)句后可以帶有可選參數(shù),用以規(guī)定邏輯段的其他一些屬性。1)定位類型說(shuō)明如何確定邏輯段的邊界。有四種:PARA(Paragraph):

邏輯段從一個(gè)節(jié)(16個(gè)字節(jié))的邊界開(kāi)始。即段的起始地址應(yīng)能被16整除,或這說(shuō)段起始物理地址應(yīng)為××××0H?!J(rèn)類型BYTE:

邏輯段從字節(jié)邊界開(kāi)始,即段可以從任何地址開(kāi)始。WORD:

邏輯段從字邊界開(kāi)始。即段的起始地址必須是偶數(shù)。PAGE:

邏輯段從頁(yè)邊界開(kāi)始。256字節(jié)稱為一頁(yè),故段的起始物理地址應(yīng)為×××00H。

2)組合類型說(shuō)明不同模塊中同名段的組合方式。PUBLIC :

所有此類型的同名段組合成一個(gè)邏輯段,公用一個(gè)段地址,運(yùn)行時(shí)裝入同一個(gè)物理段中。COMMON:

所有此類型的同名段具有相同的起始地址(覆蓋),共享相同的存儲(chǔ)區(qū)域。AT<數(shù)值表達(dá)式>:按絕對(duì)地址定位,段地址就是表達(dá)式的值。STACK:專用于說(shuō)明堆棧段,組合方式同PUBLIC3)類別用單引號(hào)括起來(lái)的字符串。所有同類別的段被安排在連續(xù)的存儲(chǔ)區(qū)域中。如:在模塊1中有段定義:

seg1SEGMENTPARASTACK‘stack’…seg1ENDS

在模塊2中有段定義:

seg2SEGMENTPARASTACK‘stack’…seg2ENDS則連接時(shí)這兩個(gè)段被安排在一起。位置計(jì)數(shù)器$表示當(dāng)前位置的計(jì)數(shù)器匯編程序每掃描一個(gè)字節(jié),位置計(jì)數(shù)器的值加1

如:TOPEQU$-STACKJMP$ORG規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開(kāi)始地址(偏移地址的初值),其格式為:

ORG<表達(dá)式>表達(dá)式的值即為開(kāi)始地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。例:ABCSEGMENTORG100Hbegin:……ABCENDS定位偽指令ORG指令從100H開(kāi)始存放4.2.4匯編結(jié)束偽指令END匯編語(yǔ)言源程序的最后,要加匯編結(jié)束偽指令END,以使匯編程序結(jié)束匯編。格式:END

[表達(dá)式]END后跟的表達(dá)式通常就是程序第一條指令的標(biāo)號(hào),指示程序的啟動(dòng)地址(要執(zhí)行的第一條指令的地址)。4.2.5過(guò)程定義偽指令用于定義一個(gè)過(guò)程體格式:過(guò)程名PROC[NEAR/FAR]

RET

過(guò)程名ENDP過(guò)程入口的符號(hào)地址過(guò)程的類型有兩種:

NEAR——(默認(rèn)類型)表示段內(nèi)調(diào)用

FAR——表示段間調(diào)用

調(diào)用一個(gè)過(guò)程的格式為:

CALL

<過(guò)程名>4.2.6宏定義偽指令如果需要多次使用同一個(gè)程序段,可以將這個(gè)程序段定義為一個(gè)”宏指令”,然后在需要時(shí),可簡(jiǎn)單地用宏指令名來(lái)代替這個(gè)程序段。指令的格式為:<宏指令名>MACRO

[形參表]<宏定義體>

ENDM例:兩個(gè)數(shù)之和的宏定義和宏調(diào)用。宏定義為:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDMX、Y、Z是形式參數(shù)。調(diào)用宏DADD時(shí)可寫(xiě)為:

DADD

DATA1,DATA2,SUMDATA1,DATA2,SUM是實(shí)際參數(shù),由它們替換定義中的X、Y、Z。宏調(diào)用與過(guò)程(子程序)調(diào)用都是一次定義,多次調(diào)用。它們之間的差別是:①執(zhí)行形式:宏命令偽指令由宏匯編程序在匯編過(guò)理中進(jìn)行處理,而CALL、RET則是由CPU執(zhí)行的指令。②匯編結(jié)果:宏命令偽指令匯編后被展開(kāi)。③執(zhí)行速度:宏命令執(zhí)行速度較快(因無(wú)調(diào)用轉(zhuǎn)移)④

占用內(nèi)存:宏指令簡(jiǎn)化了源程序,但不能簡(jiǎn)化目標(biāo)程序,并不節(jié)省內(nèi)存單元。使用過(guò)程可以節(jié)省代碼占用的內(nèi)存空間。宏展開(kāi):匯編程序會(huì)把宏調(diào)用按宏定義展開(kāi)。例如:宏定義為:

DISPLAYMACROstringLEADX,stringMOVAH,9INT21H

ENDM

程序中宏調(diào)用:

……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……

匯編后的結(jié)果:(帶有+號(hào)的指令為宏展開(kāi)后的結(jié)果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOV AH,9+INT21H……一個(gè)完整源程序結(jié)構(gòu)例DSEGSEGMENTDATA1DB1,2DATA2DW1234HDSEGENDSESEGSEGMENT

DB20DUP(?)ESEGENDSSSEGSEGMENT

STACK

‘STACK’

DB200DUP(?)SSEGENDSCSEGSEGMENT

ASSUMECS:CSEG,DS:DSEG,ES:ESEG,SS:SSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXMOVAX,SSEGMOVSS,AX┇CSEGENDSENDSTART源程序代碼段寄存器賦初值習(xí)題1.下列語(yǔ)句在存儲(chǔ)器中分別為變量分配多少字節(jié)空間?并畫(huà)出存儲(chǔ)空間的分配圖。VAR1 DB 10,2VAR2 DW 5DUP(?),0VAR3 DB ‘HOWAREYOU?’,‘$’VAR4 DD -1,1,02.假定VAR1和VAR2為字變量,LAB為標(biāo)號(hào),試指出下列指令的錯(cuò)誤之處。(1)ADD VAR1,VAR2 (2)SUB AL,VAR1(3)JMP LAB[SI] (4)JNZ VAR13.對(duì)于下面的符號(hào)定義,指出下列指令的錯(cuò)誤。

A1 DB ?

A2 DB 10 K1 EQU 1024

(1)MOV K1,AX

(2)MOV A1,AX

(3)CMP A1,A2

(4)K1 EQU 20484.3功能調(diào)用DOS功能調(diào)用高級(jí)調(diào)用,操作系統(tǒng)提供BIOS功能調(diào)用低級(jí)調(diào)用DOS功能調(diào)用包含多個(gè)子功能的功能包,用軟中斷指令調(diào)用,中斷類型碼固定為21H各子功能采用功能號(hào)來(lái)區(qū)分調(diào)用格式:

MOVAH,功能號(hào)

<置相應(yīng)參數(shù)>INT21HDOS系統(tǒng)功能調(diào)用的使用方法如下:① AH←功能號(hào);② 設(shè)置該功能所要求的其他入口參數(shù);執(zhí)行INT21H指令;分析出口參數(shù)。1.DOS鍵盤(pán)功能調(diào)用(1)從鍵盤(pán)輸入一個(gè)字符(功能號(hào)=1)

MOVAH,1INT21H輸入的字符在AL中功能:等待從鍵盤(pán)輸入一個(gè)字符并將輸入字符的ASCII碼送入AL中,同時(shí)在顯示器上顯示該字符入口參數(shù):無(wú)出口參數(shù):AL=鍵入的ASCII碼字符單字符輸入例GET_KEY:MOV AH,1

INT 21H

CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY

YES:┇ NO:┇交互式應(yīng)答程序(2)輸入字符串(功能號(hào)=0AH)MOVAH,

0AH

LEADX,<字符串緩沖區(qū)首地址>INT21H功能:從鍵盤(pán)輸入一串字符并把它存入用戶指定的緩沖區(qū)中入口參數(shù):DS:DX指向緩沖區(qū)首地址出口參數(shù):輸入的字符串及字符個(gè)數(shù)

DS:DX字符串在內(nèi)存中的存放地址定義字符緩沖區(qū)用戶自定義緩沖區(qū)格式:0DHN1N2整個(gè)緩沖區(qū)最大鍵入字符數(shù)實(shí)際鍵入字符數(shù)若用戶鍵入的字符數(shù)(包括回車(chē))≥定義的N1,本功能調(diào)用將不再接收新的鍵入,且光標(biāo)不再向右移動(dòng)。例:設(shè)在數(shù)據(jù)段定義鍵盤(pán)緩沖區(qū)如下:

STR1DB10,?,10DUP(?)

調(diào)用DOS功能的0AH號(hào)功能的程序段為:

LEADX,STR1MOVAH,0AHINT21H

此程序段最多從鍵盤(pán)接收10個(gè)按鍵(包括回車(chē))。2.DOS顯示功能調(diào)用(1)在顯示器上顯示一個(gè)字符(功能號(hào)=2)MOVAH,2MOVDL,<要顯示的字符>INT21H

例:在顯示器上顯示一個(gè)字符‘A’MOVAH,2MOVDL,’A’;或MOVDL,41HINT21H

DL=待顯示字符的ASCII碼

MOVAH,9LEADX,<字符串>INT21H功能:在顯示器上顯示以‘$’(24H)為結(jié)束符的字符串,若顯示的字符串要求回車(chē)換行,可在字符串中加入0DH,0AH控制碼入口參數(shù):DS:DX指向字符串首地址出口參數(shù):無(wú)(2)顯示字符串(功能號(hào)=9)被顯示的字符串必須以‘$’結(jié)束例:在屏幕上顯示:’HELLO,WORLD!’;在數(shù)據(jù)段定義字符串:

DATASEGMENTSTR1DB‘HELLO,WORLD!$’DATAENDS;在代碼段中進(jìn)行顯示輸出

MOVAH,9LEADX,STR1INT21H完整的程序:HELLO.ASM附:BIOS功能調(diào)用BIOS:基本輸入輸出系統(tǒng),是固化在EPROM中的一組實(shí)現(xiàn)基本輸入輸出功能的子程序。BIOS調(diào)用通過(guò)多個(gè)軟中斷提供,調(diào)用方法為:

MOVAH,<功能號(hào)> <設(shè)置入口參數(shù),一般將參數(shù)放在寄存器中> INT <中斷類型>

BIOS中的幾個(gè)主要中斷類型如下:

INT10H——屏幕顯示

INT13H——磁盤(pán)操作

INT14H——串行口操作

INT16H——鍵盤(pán)操作

INT17H——打印機(jī)操作 每類中斷由包含許多子功能,調(diào)用時(shí)通過(guò)功能號(hào)指定。4.4匯編語(yǔ)言程序設(shè)計(jì)4.4.1概述1.程序質(zhì)量(P170)2.匯編語(yǔ)言程序設(shè)計(jì)的步驟:

1-根據(jù)實(shí)際問(wèn)題抽象出數(shù)學(xué)模型,確定算法

2-畫(huà)出程序框圖(流程圖)3-分配內(nèi)存工作單元和寄存器

4-根據(jù)框圖編寫(xiě)源程序,存成.ASM文件

5-對(duì)源程序匯編,生成.OBJ目標(biāo)文件

6-把.OBJ文件連接成.EXE執(zhí)行文件

7-運(yùn)行、調(diào)試3.源程序的基本結(jié)構(gòu):順序、分支、循環(huán)、過(guò)程

(1)用方框表示工作框,框中用簡(jiǎn)明語(yǔ)言標(biāo)明要完成的功能(2)用菱形框表示判斷框

框中標(biāo)明比較、判斷和條件如何繪制程序框圖(流程圖)?NY?(4)各框之間用直線連起來(lái)表示程序走向。框中標(biāo)明子程序名字(入口參數(shù)等)(3)用

框表示調(diào)用子程序或過(guò)程。4.4.2順序程序設(shè)計(jì)順序結(jié)構(gòu)是最常見(jiàn)、最基本的程序結(jié)構(gòu)CPU按照指令的排列順序逐條執(zhí)行。語(yǔ)句A語(yǔ)句B語(yǔ)句C程序的執(zhí)行順序就是指令的編寫(xiě)順序例實(shí)現(xiàn)C=A+B,設(shè)A,B,C均為字變量。DATASEGMENTADW5F73HBDW98CDHCDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,AADDAX,BMOVC,AXMOVAH,4CHINT21HCODEENDSENDSTART標(biāo)號(hào):條件滿足?語(yǔ)句A4.4.3分支程序設(shè)計(jì)分支結(jié)構(gòu)是指包含條件轉(zhuǎn)移或無(wú)條件跳轉(zhuǎn)指令的程序。分支結(jié)構(gòu)具體分為單分支、雙分支、多分支結(jié)構(gòu)NYIF…THEN結(jié)構(gòu)程序結(jié)構(gòu):

測(cè)試/比較指令(TEST/CMP)

條件轉(zhuǎn)移指令(Jx

標(biāo)號(hào))

處理體

標(biāo)號(hào):其他指令

…單分支程序結(jié)構(gòu):

TEST/CMP指令

Jx

標(biāo)號(hào)1

處理體P1JMP標(biāo)號(hào)2標(biāo)號(hào)1:

處理體P2標(biāo)號(hào)2:其他指令

…條件滿足?語(yǔ)句A語(yǔ)句B標(biāo)號(hào)1:標(biāo)號(hào)2:條件1條件2IF…THEN…ELSE結(jié)構(gòu)雙分支若條件成立,則執(zhí)行A,否則執(zhí)行B標(biāo)號(hào)1:條件1成立?P1NYCASE結(jié)構(gòu)程序結(jié)構(gòu):

…TEST/CMP指令(測(cè)試條件1)

Jx

標(biāo)號(hào)1;不滿足轉(zhuǎn)標(biāo)號(hào)1

處理體P1…JMP標(biāo)號(hào)n+1標(biāo)號(hào)1:TEST/CMP指令(測(cè)試條件2)

Jx

標(biāo)號(hào)2;不滿足轉(zhuǎn)標(biāo)號(hào)2

處理體P2…JMP標(biāo)號(hào)n+1標(biāo)號(hào)2:TEST/CMP指令(測(cè)試條件3)

Jx

標(biāo)號(hào)3;不滿足轉(zhuǎn)標(biāo)號(hào)3

處理體P3…JMP標(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)2:標(biāo)號(hào)n:標(biāo)號(hào)n+1:P2PnNNYY例:將1字節(jié)的二進(jìn)制數(shù)以十六進(jìn)制數(shù)顯示出來(lái)

DATASEGMENTADW5FHDATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,AMOVCL,4SHRDL,CLADDDL,30H;0~9加30H,A~F加37HCMPDL,’9’JBENEXT1ADDDL,7NEXT1:MOV

AH,2

INT21H

MOVDL,AANDDL,0FHADDDL,30HCMPDL,’9’JBENEXT2ADDDL,7NEXT2:INT21HMOVAH,4CHINT21HCODEENDS

ENDSTART單分支程序設(shè)計(jì)例:在某串中查找某個(gè)特定字符,找到顯示’Y’,未找到顯示’N’

REPNESCASBJZFOUND

MOVDL,’N’JMPDISPFOUND:MOV

DL,’Y’DISP:MOVAH,2INT21H

MOVAH,4CHINT21HCODEENDS

ENDSTARTDATASEGMENTSTRINGDB‘Howareyou!welcometochina!’NEQU$-STRINGDATAENDSCODESEGMENT

ASSUMECS:CODE,ES:DATASTART:MOVAX,DATAMOVES,AXLEADI,STRINGMOVCX,NCLDMOVAH,1INT21H雙分支程序設(shè)計(jì)4.4.4循環(huán)程序設(shè)計(jì)1.DO…UNTIL<條件>結(jié)構(gòu)先執(zhí)行,再判斷條件。工作部分至少執(zhí)行一次。初始化循環(huán)體循環(huán)控制繼續(xù)循環(huán)?YN包含循環(huán)執(zhí)行某一段指令序列的程序2.DOWHILE<條件>結(jié)構(gòu)先判斷條件,再執(zhí)行。工作部分有可能一次都不執(zhí)行。初始化循環(huán)體循環(huán)控制繼續(xù)循環(huán)?YN循環(huán)結(jié)構(gòu)的組成部分:循環(huán)初始化部分—初始化循環(huán)控制變量、循環(huán)體所用到變量;循環(huán)體部分—循環(huán)結(jié)構(gòu)的主體,即要求重復(fù)執(zhí)行得程序段部分,包括循環(huán)工作部分和循環(huán)控制部分;循環(huán)結(jié)束條件—在循環(huán)程序中必須給出循環(huán)結(jié)束條件,否則就會(huì)進(jìn)入死循環(huán)。循環(huán)結(jié)束條件:用計(jì)數(shù)器控制循環(huán)按問(wèn)題的條件控制循環(huán)用開(kāi)關(guān)量控制循環(huán)有些情況下,在循環(huán)體內(nèi)又嵌套了循環(huán),這種結(jié)構(gòu)成為多重循環(huán)。多重循環(huán)常用于軟件延時(shí)程序或二維數(shù)組處理例:統(tǒng)計(jì)字變量VAL中0和1的個(gè)數(shù),并將統(tǒng)計(jì)結(jié)果分別送字單元X和Y中。

MOVCX,16MOVSI,0MOVDI,0MOVAX,VALAGAIN:SHLAX,1JCNOZEROINCSIJMPNEXTNOZERO:INCDINEXT:LOOPAGAINMOVX,SIMOVY,DI掌握以下幾點(diǎn):調(diào)用子程序用CALL指令,返回調(diào)用程序用RET指令。子程序允許嵌套調(diào)用。進(jìn)入子程序后首先要保護(hù)主程序的運(yùn)行狀態(tài)(標(biāo)志位)和使用的寄存器內(nèi)容(稱為保護(hù)現(xiàn)場(chǎng)),退出子程序前要恢復(fù)現(xiàn)場(chǎng)。調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲(chǔ)單元或堆棧(要用BP尋址)。4.4.5子程序設(shè)計(jì)對(duì)于一個(gè)子程序,應(yīng)該注意它的入口參數(shù)和出口參數(shù)。入口參數(shù)—由主程序傳給子程序的參數(shù)出口參數(shù)—子程序運(yùn)算完傳給主程序的結(jié)果參數(shù)傳遞的方法:利用寄存器。把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。利用存儲(chǔ)單元。主程序把參數(shù)放在公共存儲(chǔ)單元,子程序則從公共存儲(chǔ)單元取得參數(shù)。利用堆棧。主程序?qū)?shù)壓入堆棧,子程序運(yùn)行時(shí)則從堆棧中取參數(shù)。例:編寫(xiě)一個(gè)將單字節(jié)的二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼數(shù)的程序,再將對(duì)應(yīng)的十進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼字符串,在顯示器上顯示出來(lái)。分析:設(shè)單字節(jié)二進(jìn)制數(shù)存放在NUMBIN單元。利用除法實(shí)現(xiàn)轉(zhuǎn)換:將該數(shù)除以100,商即為BCD碼數(shù)的百位,保留第一步所得余數(shù)。將①所得余數(shù)再除以10,商即為BCD碼數(shù)的十位,余數(shù)即為BCD碼數(shù)的個(gè)數(shù)將BCD碼數(shù)的百位、十位和個(gè)位分別加上30H,即為它們的ASCII碼將ASCII碼字符串存入一個(gè)緩沖區(qū),然后調(diào)用DOS功能調(diào)用INT21H的09H號(hào)功能即可顯示該字符串。程序如下:DATASEGMENTNUMBINDB0E7H;待轉(zhuǎn)換的單字節(jié)二進(jìn)制數(shù)STRINGDB10DUP(20H);定義顯示緩沖區(qū),初值全為空格20HDB0DH,0AH;定義回車(chē)換行符

DB$;定義結(jié)束符DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前綴的起始地址

MOVAX,0PUSHAX;設(shè)置返回至DOS的段值和偏移量

MOVAX,DATAMOVDS,AX;置段寄存器初值

LEADI,STRINGXORAH,AH;AH清零

MOVAL,NUMBINMOVBL,100DDIVBL;AX除以BL,商在AL中,余數(shù)在AH中

CALLBCDTOASC;調(diào)用轉(zhuǎn)換程序,入口參數(shù):AL=BCD數(shù)

MOVAL,AH;取余數(shù)送ALXORAH,AHMOVBL,10DDIVBL

CALLBCDTOASCMOVAL,AHCALLBCDTOASCCALLDISPASC;調(diào)用顯示程序

RETSTARTENDPBCDTOASCPROC;BCD碼到ASCII碼轉(zhuǎn)換程序

ADDAL,30HMOV[DI],AL;保存ASCII字符

INCDI;指向下一個(gè)單元

RETBCDTOASCENDPDISPASCPROC;顯示子程序

LEADX,STRING

MOVAH,09HINT21HRETDISPASCENDPCODEENDSENDBEGIN1.碼制轉(zhuǎn)換十、二進(jìn)制數(shù)、ASCII碼之間的互相轉(zhuǎn)換。①BCD數(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)4.5常見(jiàn)程序設(shè)計(jì)舉例例:將≤65535的非壓縮BCD數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)。

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

mydataSEGMENT

decnumDB5,3,0,1,9;BCD數(shù)53019

binnumDW?

mydataENDSprogSEGMENT

ASSUMECS:prog,DS:mydatabegin: MOVAX,mydata MOVDS,AX

MOVSI,OFFSETdecnum MOVCX,5;5位BCD數(shù)

MOVBX,10

XORAX,AX;中間結(jié)果初始值為0Next: MULBX;中間結(jié)果*10+本位數(shù)字

ADDAL,[SI]ADCAH,0

INCSI;指向下位BCD數(shù)

LOOPnextMOVbinnum,AX;保存結(jié)果

MOVAH,4CHINT21Hprog ENDS

ENDbegin例:把≤255的非壓縮BCD數(shù)轉(zhuǎn)換成2進(jìn)制數(shù)

decnumDB1,5,9;BCD數(shù)159

binnumDB? ……MOVAX,decnumXCHGAH,AL;百位在AH,十位在ALAAD;百位數(shù)*10+十位數(shù)

MOVAH,AL;中間結(jié)果送AHMOVAL,decnum+2AAD;中間結(jié)果*10+個(gè)位數(shù)

MOVbinnum,AL……例:從鍵盤(pán)輸入兩個(gè)整數(shù),并求其和。因鍵入為整數(shù),故要進(jìn)行如下轉(zhuǎn)換:

ASCII→BCD→二進(jìn)制數(shù)

ASCII→BCD碼很簡(jiǎn)單,高4位清零即可得到非壓縮的BCD碼。

BCD→二進(jìn)制數(shù)在本例中采用用以下方法:

((((0+千位數(shù))*10+百位數(shù))*10)+十位數(shù))*10+個(gè)位數(shù)②ASCII碼→二進(jìn)制數(shù)(用于輸入)第一次中間結(jié)果第二次中間結(jié)果第三次中間結(jié)果最終結(jié)果開(kāi)始兩個(gè)數(shù)分別轉(zhuǎn)換成二進(jìn)制數(shù)鍵入兩個(gè)數(shù)相加結(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)換子程序程序如下:DATA SEGMENTSTR1 DB10,?,10DUP(?);第1個(gè)數(shù)的輸入緩沖區(qū)

STR2 DB10,?,10DUP(?);第2個(gè)數(shù)的輸入緩沖區(qū)

NUM DW?,? ;存轉(zhuǎn)換后的二進(jìn)制數(shù)SUM DW0 ;存和OVER DB‘Overflow!’,13,10,’$’DATA ENDS;CODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,STR1 INT 21H ;輸入第一個(gè)數(shù)字串(設(shè)為26) MOV AH,0AH LEA DX,STR2 INT 21H ;輸入第二個(gè)數(shù)字串(設(shè)為33) LEA BX,STR1;串1的首地址送BX LEA DI,NUM;存二進(jìn)制首地址送DI CALL CHANGE;將串1ASCII碼→二進(jìn)制

LEA BX,STR2;串2的首地址送BX

LEA DI,NUM+2 ;指向

CALL CHANGE ;將串2ASCII碼→二進(jìn)制

MOV AX,NUM;(AX)=[NUM]=001AH ADD AX,NUM+2 ;兩數(shù)相加,(AX)=003BH MOV SUM,AX ;存和

JNO NEXT ;無(wú)溢出,轉(zhuǎn)NEXT LEA DX,OVER MOV AH,9 INT 21H ;顯示’Overflow!’NEXT: MOV AH,4CH INT 21H ;返回DOS MAIN ENDPCHANGE PROC MOV CL,[BX+1] ;實(shí)際字符數(shù)送CL MOV AL,[BX+2] ;第一個(gè)字符送AL MOV CH,AL ;暫存在CH CMP AL,’-’ ;第一個(gè)字符是負(fù)號(hào)嗎? JNZ NEXT1 ;不是,轉(zhuǎn)NEXT1 DEC CL ;字符數(shù)減1 INC BXNEXT1:ADD BX,2 ;指向第一個(gè)數(shù)字字符

MOV AX,0 ;清零AX,存二進(jìn)制數(shù)LP1:DEC CL JZ NEXT2 ;若(CL)=0,轉(zhuǎn)NEXT2 MOV DL,[BX];取字符

AND DL,0FH ;轉(zhuǎn)換成BCD碼

ADDAL,DL;加到中間結(jié)果上

ADCAH,0

MOVDX,10MULDX;*10INCBX;指向下一個(gè)字符

JMPSHORTLP1NEXT2:MOVDL,[BX];取個(gè)位數(shù)

ANDDL,0FH;個(gè)位ASCII→未組合BCDADDAX,DX;加個(gè)位數(shù),(AX)=001AHCMPCH,’-’;是’-’?JNZNEXT3;該數(shù)非負(fù),轉(zhuǎn)NEXT3NEGAX;若為負(fù),求補(bǔ)NEXT3:MOV[DI],AX;存二進(jìn)制結(jié)果

RETCHANGEENDP;CODEENDSENDSTART020A32360D…020A33330D…001A21003B00STR1STR2NUMSUM10個(gè)10個(gè)‘O’……OVER??040A313234…STR1若鍵入‘1234’330D‘1’‘2’‘3’‘4’…設(shè)鍵入第1個(gè)數(shù)為26,第2個(gè)數(shù)為33,則在內(nèi)存各變量分配如下:重點(diǎn)掌握:

如何從鍵盤(pán)輸入一個(gè)字符串

ASCII→未組合BCD→二進(jìn)制有符號(hào)數(shù)的運(yùn)算,對(duì)負(fù)數(shù)和溢出如何處理方法1

計(jì)算二進(jìn)制數(shù)中所包含的1000的個(gè)數(shù)、100的個(gè)數(shù)、10的個(gè)數(shù)和1的個(gè)數(shù)。方法2

除10取余。下面舉例介紹第一種方法。流程圖如下:③二進(jìn)制數(shù)→BCDYN二進(jìn)制數(shù)

AX令(DL)=0(AX)-1000<0?(DL)+1(AX)+1000(AX)DL存至緩沖區(qū)令(DL)=0YN(AX)-10<0?(DL)+1(AX)+10(AX)存DL存AL返回DOS求100的個(gè)數(shù),結(jié)構(gòu)同上A匯編程序如下:DATA SEGMENTBNUM DB 270FHDNUM DB 4DUP(?);存放BCD碼的緩沖區(qū)DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATABINBCD PROC FARBEGIN:MOV AX,DATA MOV DS,AX MOV AX,BNUM;取二進(jìn)制數(shù)

LEA BX,DNUM;BCD碼緩沖區(qū)首地址送BX

;計(jì)算百位的個(gè)數(shù)

MOVDL,0;千位的個(gè)數(shù)計(jì)數(shù)器AGAIN1:SUBAX,1000;(AX)-1000JCNEXT1;若≤0,則退出循環(huán)

INCDL;(DL)+1JMPAGAIN1NEXT1:ADDAX,1000;(AX)←(AX)+1000 MOV[BX],DL;存千位的個(gè)數(shù)

;計(jì)算百位的個(gè)數(shù)

MOVDL,0;百位的個(gè)數(shù)計(jì)數(shù)器AGAIN2:SUBAX,100;(AX)-100JCNEXT2INCDLJMPAGAIN2NEXT2:ADDAX,100MOV[BX+1],DL;存百位的個(gè)數(shù)

MOVDL,0;十位的個(gè)數(shù)計(jì)數(shù)器AGAIN3:SUBAX,10;(AX)-10JCNEXT3INCDL JMPAGAIN3NEXT3:ADDAX,10MOV[BX+2],DL;存十位的個(gè)數(shù)

MOV[BX+3],AL;存?zhèn)€位的個(gè)數(shù)

MOVAH,4CHINT21HBINBCDENDP;CODEENDS ENDBEGIN④BCD→ASCII

⑤二進(jìn)制串轉(zhuǎn)換為ASCII碼一個(gè)二進(jìn)制位串若要送顯示或打印,需把串中每一位(0或1)化為ASCII碼。思路:先將目標(biāo)串全部預(yù)置為30H,再把每個(gè)二進(jìn)制位逐位左移至CF,然后判CF=0?若是,取下一位;若不是,將31H送此單元。

流程圖如下:初始化用’0’填滿串取要轉(zhuǎn)換的數(shù)左移1位存入‘1’結(jié)束CF=1?轉(zhuǎn)換完?調(diào)整指針NN匯編程序如下:DATA SEGMENTNUM DW 6F78HSTRING DB 16DUP(?)DATA ENDS;CODE SEGMENT ASSUMECS:CODE,DS:DATABINCA PROC FARBEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX CLD LEA DI,STRING MOV CX,16;串的長(zhǎng)度

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論