匯編課后習題答案-第十一章_第1頁
匯編課后習題答案-第十一章_第2頁
匯編課后習題答案-第十一章_第3頁
匯編課后習題答案-第十一章_第4頁
匯編課后習題答案-第十一章_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

首頁入門學習程序員計算機考研計算機)了?出下載硬件知識網(wǎng)絡(luò)知識專業(yè)課程答粢下載視頻教程下載

第十一章

作者:佚名來源:網(wǎng)絡(luò)

11.1寫出文件代號式磁盤存取操作的錯誤代碼:

(1)非法文件代號(2)路徑未發(fā)現(xiàn)(3)寫保護磁盤

答:錯誤代碼為:

(1)06(2)03(4)19

11.2使用3cH功能建立一文件,而該文件已經(jīng)存在,這時會發(fā)生什么情況?

答:此操作將文件長度置為0,寫新文件,原文件內(nèi)容被清除。

11.3從緩沖區(qū)寫信息到一個文件,如果沒有關(guān)閉文件,可能會出現(xiàn)什么問題?

答:文件結(jié)尾的部分信息就沒有被寫入磁盤,從而造成寫入的文件不完整。

11.4下面的ASCIZ串有什么錯誤?

PATH_NAMEDB'C:\PROGRAMS\TEST.DAT'

答:此ASCIZ串的最后少了一個全0字節(jié),應(yīng)改為:

PATH_NAMEDB'C:\PROGRAMS\TEST.DAT',0

11.5下面為保存文件代號定義的變量有什么錯誤?

FILE_HNDLDB?

答:文件代號是字類型,因此應(yīng)改為:

FILE_HNDLDW?

11.6在ASCPATH字節(jié)變量中為驅(qū)動器D的文件PATIENT.LST,請定義ASCIZ串。

答:ASCPATHDB'D:\PATIENT.LST',0

11.7對11.6題中的文件,它的每個記錄包含:

病例號(patientnumber):5字符,姓名(name):20字符,

城市(city):20字符,街道(streetaddress):20字符,

出生年月(mmddyy):6字符,性別(M/Fcode):1字符,

病房號(roomnumber):2字符,床號(bednumber):2字符,

(1)定義病人記錄的各個域(2)定義保存文件代號的變量FHANDLE

(3)建文件(4)把PATNTOUT中的記錄寫入

(5)關(guān)文件(6)以上文件操作包括測試錯誤

答:(1)PATNTOUTEQUTHISBYTE

patientDB5DUP(?)

nameDB20DUP(?)

cityDB20DUP(?)

streetDB20DUP(?)

mmddyyDB6DUP(?)

M_FcodeDB?

roomDB2DUP(?)

bedDB2DUP(?),OAH,ODH

COUNT=$-PATNTOUT;記錄長度

(2)FHANDLEDW?

(3)MOVAH,3CH;建文件功能

MOVCX,00;普通文件屬性

LEADX,ASCPATH

INT21H

JCERROR

MOVFHANDLE,AX;保存文件代號

(4)MOVAH,40H;寫文件功能

MOVBX,FHANDLE;取文件代號

MOVCX,COUNT;記錄長度

LEADX,PATNTOUT;記錄的首地址

INT21H

JCERROR

CMPAX,COUNT;所有的字節(jié)都寫入了嗎?

JNEERROR1

(5)MOVAH,3EH;關(guān)閉文件功能

MOVBX,FHANDLE;取文件代號

INT21H

JCERROR

(6)文件操作的測試錯誤已包括在(3)、(4)、(5)的操作中。

11.8對11.7題的文件,用文件代號式編寫一個完整的讀文件程序,讀出的每個

記錄存入PATNTIN并在屏幕上顯示。

答:程序如下:

TITLEREADDISP.EXE;利用文件代號式順序讀文件程序

;Readdiskrecordscreatedbyhancreat

.modelsmall

.stacklOOh

?data

endcdedb0;結(jié)束處理指示

fhandledw?

patntindb80DUP('');DTA

ascpathdb'd:\patient.lst’,0

openmsgdb'***openerror***',Odh,Oah

readmsgdb'***readerror***',Odh,Oah

rowdb0

,code

beginprocfar

movax,@data

movds,ax

moves,ax

movax,0600h

callscreen;清屏

callcurs;設(shè)置光標

callopenh;打開文件,設(shè)置DTA

cmpendcde,0;打開錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

contin:callreadh;讀磁盤記錄

cmpendcde,0;讀錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

calldisph;沒錯,顯示記錄

jmpcontin

aO:movax,4c00h;退出程序,返回DOS

int21h

beginendp

;打開文件

openhprocnear

movah,3dh

moval,0

leadx,ascpath

int21h

jcbl;打開錯誤嗎?

movfhandle,ax;沒有錯,保存文件代號

ret

bl:movendcde,01;打開錯誤,指示結(jié)束處理

leadx,openmsg

callerrm;顯示出錯信息

ret

openhendp

;讀磁盤記錄

readhprocnear

movah,3fh

movbx,fhandle

movex,80

leadx,patntin

int21h

jccl;讀錯誤嗎?

empax,0;文件已讀完嗎?

jec2;讀完,退出

ret

cl:leadx,openmsg;讀錯誤

callerrm;顯示出錯信息

c2:movendede,01;讀錯誤或文件讀完,指示結(jié)束處理

ret

readhendp

;顯示記錄

disphprocnear

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,80

leadx,patntin

int21h

cmprow,24;已到屏幕底部嗎?

jaedl;已到屏幕底部,退出

incrow

ret

dl:movax,0601h

callscreen;屏幕上卷一行

callcurs;設(shè)置光標

ret

disphendp

?

;屏幕上卷

screenprocnear;入口參數(shù)為ax

movbh,leh;設(shè)置顏色

movex,0;屏幕左上角

movdx,184fh;屏幕右下角

intlOh

ret

screenendp

;設(shè)置光標

cursprocnear

movah,2;設(shè)置光標

movbh,0

movdh,row;行號

movdl,0;列號

intlOh

ret

cursendp

;顯示出錯信息

errmprocnear

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,20

int21h

ret

errmendp

endbegin

11.9編寫建立并寫入磁盤文件的程序。允許用戶從鍵盤鍵入零件號(3字符),

零(配)件名稱(12字符),單價(1個字)。程序使用文件代號式建立含有這些信息

的文件。注意要把單價從ASCH碼轉(zhuǎn)換為二進制數(shù)。下面是輸入的例子:

part#Descriptionprice

part#Descriptionprice

023Assemblers00315

024Linkages00430

027Compilers00525

049Compressors00920

114Extractors11250

117Haulers00630

122Lifters10520

124Processors21335

127Labtiers00960

232Bailers05635

237Grinders08250

999000

答:程序如下:

TITLEHANCREAT.EXE;利用文件代號式建立文件程序

.modelsmall

.stacklOOh

?data

prompt1db,PleaseinputPart#:$';提示輸入零件號

prompt2db'PleaseinputDescription:$';提示輸入零件名稱

promptsdb'PleaseinputPrice:$,;提示輸入單價

maxlendb13;最大輸入長度,輸入字符串功能的緩沖區(qū)

actlendb?;實際輸入長度

bufferdb13DUP('');輸入字符串緩沖區(qū)

crlfdbOdh,Oah,'$'

pathnamedbJfilename.lst,,0

handledw?

dtadb19DUP('');DTA

errcdedb0;錯誤處理指示

opnmsgdb'***openerror***',Odh,Oah

wrtmsgdb'***writeerror***',Odh,Oah

.code

beginprocfar

movax,@data

movds,ax

moves,ax

movax,0600h

callscren;清屏

callcurs;設(shè)置光標

callcreath;建立文件

cmperrcde,0;建立錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

contin:callproch;記錄處理

cmpactlen,0;輸入的字符串長度為0,結(jié)束輸入嗎?

jnecontin;不結(jié)束,繼續(xù)

callclseh;結(jié)束輸入,關(guān)閉文件

aO:movax,4c00h;退出程序,返回DOS

int21h

beginendp

;建立文件

creathprocnear

movah,3ch

movex,0;普通屬性

leadx,pathname

int21h

jcbbb;建立文件錯誤嗎?

movhandle,ax;沒有錯,保存文件代號

ret

bbb:leadx,opnmsg;建立文件錯誤

callerrm;顯示出錯信息

ret

creathendp

;接收輸入

prochprocnear

cld

leadi,dta;在選中設(shè)置dta的首地址

leadx,prompt1;輸入零件號

movbx,3;零件號最多3個字符

callin_proc

jcexit;沒有輸入,結(jié)束

leadx,prompt2;輸入零件名稱

movbx,12;零件名稱最多12個字符

callin_proc

jcexit;沒有輸入,結(jié)束

leadx,prompts;輸入單價

movbx,5;零件單價最多5個十進制字符(相當于一個二進制字)

callin_proc

calldec_bin;將十進制的單價轉(zhuǎn)換為二進制的單價

movwordptr[dta+17],OaOdh;在DTA的最后插入回車換行符

callwrith;用文件代號法寫記錄

exit:ret

prochendp

;輸入字符串子程序

inprocprocnear

movah,09h;顯示提示信息

int21h

pushdi

leadi,buffer;在buffer中填入空格符

movcl,maxlen

movch,0

moval,

repstosb

popdi

movah,Oah;輸入字符串

leadx,maxlen

int21h

calldispcrlf

cmpactlen,0;實際輸入字符數(shù)=0,則沒有輸入,結(jié)束

jeend_in

pushdi

leadi,buffer;在buffer的后面填入空格符

moval,actlen

movah,0

adddi,ax

movcl,maxlen

movch,0

moval,actlen

subcl,al

moval,

repstosb

popdi

leasi,buffer;將buffer緩沖區(qū)內(nèi)容送入dta

movex,bx

repmovsb;將輸入內(nèi)容送入dta

clc;有輸入字符,返回(cf)=O

jmpin_end

end_in:stc;沒有輸入字符,返回(cf)二l

in_end:ret

in_procendp

;將十進制的單價轉(zhuǎn)換為二進制的單價子程序

dec_binprocnear

movbx,0

movsi,0

movex,5

transfer:moval,buffer[si];從十進制的高位到低位取數(shù)

empal,Odh;是回車嗎?

jedec_binl

empal,'';是空格嗎?

jedec_binl

andal,Ofh;將ascii碼轉(zhuǎn)換為十進制數(shù)

movah,0

pushex

xchgax,bx;十進制數(shù)高位X10+低位二二進制數(shù)

movex,10

mulex

xchgax,bx

addbx,ax;轉(zhuǎn)換的二進制數(shù)在(bx)中

popex

incsi

looptransfer

dec_binl:movwordptr[dta+15],bx;存入單價到dta中的單價位置

ret

dec_binendp

;用文件代號法寫記錄

writhprocnear

movah,40h

movbx,handle

movex,19

leadx,dta

int21h

jncddd;寫文件錯誤嗎?

leadx,wrtmsg

callerrm;顯示出錯信息

movactlen,0

ddd:ret

writhendp

;用文件代號法關(guān)閉文件

clsehprocnear

movdta,lah;寫文件結(jié)束符lah

callwrith

movah,3eh

movbx,handle

int21h

ret

clsehendp

;屏幕上卷

screnprocnear;入口參數(shù)為ax

movbh,leh;設(shè)置顏色

movex,0;屏幕左上角

movdx,184fh;屏幕右下角

intlOh

ret

screnendp

;設(shè)置光標

cursprocnear

movah,2;設(shè)置光標

movbh,0

movdh,0;行號

movdl,0;列號

intlOh

ret

cursendp

;顯示出錯信息

errmprocnear

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,20

int21h

moverrcde,01;錯誤代碼置1

ret

errmendp

dispcrlfprocnear;顯示回車換行符子程序

leadx,crlf

movah,09h

int21h

ret

disp_crlfendp;disp_crlf子程序結(jié)束

endbegin;匯編語言源程序結(jié)束

11.10編寫一個程序使用文件代號式讀出并顯示11.9題建立的文件。注意,要

把二進制數(shù)表示的單價轉(zhuǎn)換為ASCII碼。

答:用文件代號式讀出并顯示文件,程序如下:

TITLEHANDREAD.EXE;利用文件代號式順序讀并顯示文件程序

;Readdiskrecordscreatedbyhancreat

.modelsmall

.stacklOOh

?data

endcdedb0;結(jié)束處理指示

crlfdbOdh,Oah,'$'

pathnamedb'filename.1st',0

messagedb'Part#DescriptionPrice',Odh,Oah,'$'

handledw?

tacklinedb|$'

dtadb19DUP('');DTA

errcdedb0;錯誤處理指示

opnmsgdb'***openerror***',Odh,Oah

readmsgdb'***readerror***',Odh,Oah

rowdb0

.code

beginprocfar

movax,?data

movds,ax

moves,ax

movax,0600h

callscreen;清屏

callcurs;設(shè)置光標

leadx,message;顯示標題

movah,09h

int21h

incrow

callopenh;打開文件,設(shè)置DTA

cmpendcde,0;打開錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

contin:callreadh;讀磁盤記錄

cmpendcde,0;讀錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

calldisph;沒錯,顯示記錄

jmpcontin

aO:movax,4c00h;退出程序,返回DOS

int21h

beginendp

;打開文件

openhprocnear

movah,3dh

moval,0

leadx,pathname

int21h

jcbbb;打開錯誤嗎?

movhandle,ax;沒有錯,保存文件代號

ret

bbb:movendcde,01;打開錯誤,指示結(jié)束處理

leadx,readmsg

callerrm;顯示出錯信息

ret

openhendp

;讀磁盤記錄

readhprocnear

movah,3fh

movbx,handle

movex,19

leadx,dta

int21h

jccl;讀錯誤嗎?

empax,0;文件已讀完嗎?

jec2;讀完,退出

cmpdta,lah;文件結(jié)束符嗎?

Jec2

ret

cl:leadx,opnmsg;讀錯誤

callerrm;顯示出錯信息

c2:movendcde,01;讀錯誤或文件讀完,指示結(jié)束處理

ret

readhendp

;顯示記錄

disphprocnear

leadx,tackline;顯示輸出“I"

movah,09h

int21h

movah,40h;向標準輸出設(shè)備(文件代號=01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,3

leadx,dta

int21h

leadx,tackline;顯示輸出“|"

movah,09h

int21h

movah,40h;向標準輸出設(shè)備(文件代號=01)寫文件

movbx,01;標準輸出設(shè)備的文件代號=01

movex,12

leadx,dta+3

int21h

leadx,tackline;顯示輸出“|"

movah,09h

int21h

movsi,wordptr[dta+15]

callbin_dec;轉(zhuǎn)換為十進制數(shù)顯示

leadx,tackline;顯示輸出a\"

movah,09h

int21h

calldisp_crlf

cmprow,24;已到屏幕底部嗎?

jaeddd;已到屏幕底部,退出

incrow

ret

ddd:movax,0601h

callscreen;屏幕上卷一行

callcurs;設(shè)置光標

ret

disphendp

;將二進制的單價轉(zhuǎn)換為十進制的單價并顯示子程序

bin_decprocnear

pushex

movex,lOOOOd

calldejdiv;調(diào)除法并顯示輸出子程序

movex,lOOOd

calldec_div

movex,lOOd

calldec_div

movex,lOd

calldec_div

movex,Id

calldec_div

popex

ret

bin_decendp

;除法并顯示輸出子程序

dec_divprocnear

movax,si

movdx,0

divex

movsi,dx;余數(shù)保存在(si)中作下一次的除法

movdl,al;商(在00h~09h范圍內(nèi))送(dl)

adddl,30h;轉(zhuǎn)換為0?9的ascii碼

movah,02h;顯示輸出

int21h

ret

dec_divendp

;屏幕上卷

screenprocnear;入口參數(shù)為ax

movbh,leh;設(shè)置顏色

movex,0;屏幕左上角

movdx,184fh;屏幕右下角

intlOh

ret

screenendp

;設(shè)置光標

cursprocnear

movah,2;設(shè)置光標

movbh,0

movdh,row;行號

movdl,0;列號

intlOh

ret

cursendp

;顯示出錯信息

errmprocnear

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,20

int21h

ret

errmendp

disp_crlfprocnear;顯示回車換行符子程序

leadx,crlf

movah,09h

int21h

ret

disp_crlfendp;disp_crlf子程序結(jié)束

endbegin

11.11對IL9題建立的文件按下面的要求編寫程序:

(1)把所有的記錄讀入內(nèi)存的數(shù)據(jù)緩沖區(qū)TABLE;

(2)顯示字符串提示用戶輸入零(配)件號及其數(shù)量;

(3)按零件搜索TABLE;

(4)如果發(fā)現(xiàn)所要求的零件,用它的單價計算出總價(單價X數(shù)量);

(5)顯示零(配)件說明及總價值。

答:程序如下:

TITLEREAD11.EXE;利用文件代號式讀并計算顯示程序

;Readdiskrecordscreatedbyhancreat

.modelsmall

.stacklOOh

.data

endcdedb0;結(jié)束處理指示

pathnamedb'filename.1st,,0

in_mesldb'請輸入3位數(shù)的零件號Part#:','

in_mes2db'請輸入該零件的數(shù)量:

out_mesldb'輸入的不是數(shù)字!請重新輸入數(shù)字:‘,飛’

outjnes2db'輸入的零件號不存在!請重新輸入3位數(shù)的零件號Part#:

in_bufferdb6,?,6dup(20h);輸入緩沖區(qū)

messagedb'Part#DescriptionSum_Price,,Odh,Oah,,$'

tacklinedb|$'

sum_pricedw0,0

decimaldb10DUP(O),'$'

crlfdbOdh,Oah,'$'

handledw?

tabledb19*100DUPf');table,足夠大

errcdedb0;錯誤處理指示

opnmsgdb'***openerror***',Odh,Oah

readmsgdb'***readerror***',Odh,Oah

,code

beginprocfar

movax,?data

movds,ax

moves,ax

movax,0600h

callscreen;清屏

callcurs;設(shè)置光標

callopenh;打開文件,設(shè)置TABLE

cmpendcde,0;打開錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

callreadh;讀磁盤記錄

cmpendcde,0;讀錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

callin_Part;沒錯,輸入零件號和零件數(shù)量

aO:movax,4c00h;退出程序,返回DOS

int21h

beginendp

;打開文件

openhprocnear

movah,3dh

moval,0

leadx,pathname

int21h

jcbbb;打開錯誤嗎?

movhandle,ax;沒有錯,保存文件代號

ret

bbb:movendcde,01;打開錯誤,指示結(jié)束處理

leadx,opnmsg

callerrm;顯示出錯信息

ret

openhendp

;讀磁盤記錄

readhprocnear

movah,3fh

movbx,handle

movex,19*100;準備讀入的字節(jié)數(shù)

leadx,table

int21h

jccl;讀錯誤嗎?

cmpax,0;文件已讀完嗎?

jec2;讀完,退出

cmptable,lah;文件結(jié)束符嗎?

Jec2

movbp,ax;讀成功則在AX中返回實際讀入的字節(jié)數(shù)存入bp

ret

cl:leadx,readmsg;讀錯誤

callerrm;顯示出錯信息

c2:movendcde,01;讀錯誤或文件讀完,指示結(jié)束處理

ret

readhendp

;輸入零件號和零件數(shù)量

in_Partprocnear

leadx,in_mesl;顯示提示信息,提示輸入零件號

in_Partl:callinput;輸入數(shù)據(jù)

cmpin_buffer+l,3;輸入的零件號個數(shù)是3位嗎?

leadx,out_mes2;顯示提示信息,提示重新輸入零件號

jnein_Partl

cld

movax,bp;取實際讀入文件的字節(jié)數(shù)

movcl,19;每個記錄的長度為19個字符

divcl;計算實際讀取的記錄數(shù)在al中

movbl,al

movbh,0;從第0個記錄開始順序查找

in_Part2:leasi,in_buffer+2;查找零件號對應(yīng)的零件

leadi,table

moval,19

mulbh

adddi,ax;計算某個記錄的首地址

movwordptrdecimal,di;保存首地址

movex,3

repeempsb

jein_Part3;找到對應(yīng)的零件

incbh;找下一個記錄

empbh,bl

jbin_Part2

jmpin_Partl;未找到對應(yīng)的零件重新輸入

inPart3:leadx,inmes2;顯示提示信息,提示輸入零件數(shù)量

callinput;輸入數(shù)據(jù)

calldec_bin;將輸入數(shù)據(jù)轉(zhuǎn)換為二進制數(shù),在bx中

movdi,wordptrdecima;di指向該記錄的首地址

movax,[di+15];取單價

mulbx;總價格在(dx),(ax)中

movsum_price,ax

movsum_price+2,dx

calldisprec;顯示信息

ret

in_Partendp

;輸入數(shù)據(jù)

inputprocnear

inputl:movah,09h;顯示字符串

int21h

movah,Oah;輸入字符串

leadx,in_buffer

int21h

leadx,out_mesl;顯示提示信息

movcl,in_buffer+l

cmpcl,0;輸入的數(shù)字個數(shù)為。嗎?

jzinputl

movch,0

movbx,2

input2:moval,in_buffer[bx];輸入的是數(shù)字0?9嗎?

cmpal,'O'

jbinputl

cmpal,’9

jainputl

incbx

loopinput2

ret

inputendp

;將十進制數(shù)轉(zhuǎn)換為二進制數(shù)子程序

dec_binprocnear

movbx,0

movsi,2

movcl,in_buffer+l

movch,0

transfer:moval,in_buffer[si];從十進制的高位到低位取數(shù)

andal,Ofh;將ascii碼轉(zhuǎn)換為十進制數(shù)

movah,0

pushex

xchgax,bx;十進制數(shù)高位義10+低位=二進制數(shù)

movex,10

mulex

addbx,ax;轉(zhuǎn)換的二進制數(shù)在(bx)中

popex

incsi

looptransfer

ret

dec_binendp

;顯示記錄

disp_recprocnear

calldisp_crlf

leadx,message;顯示標題

movah,09h

int21h

leadx,tackline;顯示輸出a\”

movah,09h

int21h

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,3;顯示3位數(shù)的零件號

movdx,wordptrdecima;dx才旨向該記錄的首地址

int21h

leadx,tackline;顯示輸出“I"

movah,09h

int21h

movah,40h;向標準輸出設(shè)備(文件代號二01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,12;顯示12位的零件說明

movdx,wordptrdecima;dx指向該記錄的首地址

adddx,3

int21h

leadx,tackline;顯示輸出“I"

movah,09h

int21h

callbin_dec;總價格轉(zhuǎn)換為十進制數(shù)顯示

leadx,tackline;顯示輸出“|"

movah,09h

int21h

calldisp_crlf

ret

disprecendp

;4字節(jié)二進制數(shù)轉(zhuǎn)換為10進制子程序

bin_decprocnear

movbx,0;10字節(jié)的bed碼單元清0

movex,10

bin_decl:movdecimal[bx],0

incbx

loopbin_decl

movex,4*8;4字節(jié)二進制數(shù)共4*8=32位

bin_dec2:movbx,10-1;計算(((a31*2+a30)*2+a29)..?)*2+a0

shlwordptr[sumprice],1;4字節(jié)二進制數(shù)左移1位

rclwordptrEsum_price+2],1

pushex

movex,10

bin_dec3:moval,decimal[bx];計算(.??)*2+ai,ai由進位位帶入

adcal,al

aaa;非壓縮bed碼加法調(diào)整

movdecimal[bx],al

decbx

loopbin_dec3

popex

loopbin_dec2

calldisp

ret

bin_decendp

dispprocnear;顯示輸出子程序

movex,10

movbx,0

displ:adddecimal[bx],30h;變?yōu)閍scii碼

incbx

loopdispl

movex,10;下面5條指令是為了不顯示數(shù)據(jù)左邊的“0”

eld

leadi,decimal

moval,30h;30h為“0”的ascii碼

repescasb

decdi

movdx,di

movah,09h

int21h

ret

dispendp;disp子程序結(jié)束

;屏幕上卷

screenprocnear;入口參數(shù)為ax

movbh,leh;設(shè)置顏色

movex,0;屏幕左上角

movdx,184fh;屏幕右下角

intlOh

ret

screenendp

;設(shè)置光標

cursprocnear

movah,2;設(shè)置光標

movbh,0

movdh,0;行號

movdl,0;列號

intlOh

ret

cursendp

;顯示出錯信息

errmprocnear

movah,40h;向標準輸出設(shè)備(文件代號=01)寫文件

movbx,01;標準輸出設(shè)備的文件代號二01

movex,20

int21h

ret

errmendp

disp_crlfprocnear;顯示回車換行符子程序

leadx,crlf

movah,09h

int21h

ret

disp_crlfendp;disp_crlf子程序結(jié)束

endbegin

11.12用隨機處理記錄的方式編寫程序,將用戶需要的零(配)件記錄讀取到

TABLE,并根據(jù)鍵入的數(shù)量,計算出總價值,然后顯示出零(配)件說明及總價值。

答:程序如下:

TITLEREAD_RAN.EXE;利用文件代號式隨機讀并計算顯示程序

;Readdiskrecordscreatedbyhancreat

.modelsmall

.stacklOOh

?data

endcdedb0;結(jié)束處理指示

pathnamedb'filename.lst,,0

in_mesldb'請輸入3位數(shù)的零件號Part#:','

in_mes2db'請輸入該零件的數(shù)量:','

out_mesldb'輸入的不是數(shù)字!請重新輸入數(shù)字:

out_mes2db'輸入的零件號不存在!請重新輸入3位數(shù)的零件號Part#:

in_bufferdb6,?,6dup(20h);輸入緩沖區(qū)

messagedb'Part#DescriptionSum_Price,,Odh,Oah,'$'

tacklinedb|$'

sum_pricedw0,0

decimaldb10DUP(O),

crlfdbOdh,Oah,'$'

handledw?

tabledb19DUP(,');table

errcdedb0;錯誤處理指示

opnmsgdb'***openerror***',Odh,Oah

readmsgdb'***readerror***',Odh,Oah

movmsgdb'***moveerror***',Odh,Oah

.code

beginprocfar

movax,@data

movds,ax

moves,ax

movax,0600h

callscreen;清屏

callcurs;設(shè)置光標

callopenh;打開文件,設(shè)置TABLE

cmpendcde,0;打開錯誤嗎?

jnzaO;錯誤,轉(zhuǎn)結(jié)束

callin_Part;沒錯,輸入零件號和零件數(shù)量

aO:movax,4c00h;退出程序,返回DOS

int21h

beginendp

;打開文件

openhprocnear

movah,3dh

moval,0

leadx,pathname

int21h

jcbbb;打開錯誤嗎?

movhandle,ax;沒有錯,保存文件代號

ret

bbb:movendcde,01;打開錯誤,指示結(jié)束處理

leadx,opnmsg

callerrm;顯示出錯信息

ret

openhendp

;讀磁盤記錄

readhprocnear

movah,3fh

movbx,handle

movex,19;準備讀入的字節(jié)數(shù)

leadx,table

int21h

jccl;讀錯誤嗎?

cmpax,0;文件已讀完嗎?

jec2;讀完,退出

cmptable,lah;文件結(jié)束符嗎?

Jec2

movbp,ax;讀成功則在AX中返回實際讀入的字節(jié)數(shù)存入bp

ret

cl:movendcde,01;讀錯誤或文件讀完,指示結(jié)束處理

leadx,readmsg;讀錯誤

callerrm;顯示出錯信息

jmpc3

c2:movendcde,02;讀錯誤或文件讀完,指示結(jié)束處理

c3:ret

readhendp

f

;絕對移動文件讀寫指針

mov_pointerprocnear

movah,42h

moval,0

movbx,handle

int21h

jcdl;錯誤嗎?

ret

dl:leadx,movmsg;錯誤

callerrm;顯示出錯信息

movendcde,01;錯誤,指示結(jié)束處理

ret

mov_pointerendp

;輸入零件號和零件數(shù)量

in_Partprocnear

leadx,in_mesl;顯示提示信息,提示輸入零件號

in_Partl:callinput;輸入數(shù)據(jù)

cmpin_buffer+l,3;輸入的零件號個數(shù)是3位嗎?

leadx,out_mes2;顯示提示信息,提示重新輸入零件號

jnein_Partl

cld

movex,0;位移量的高位字

movdx,0;位移量的低位字

callmov_pointer;絕對移動文件讀寫指針到文件首

inPart2:callreadh;讀磁盤記錄

cmpendede,2;讀文件結(jié)束嗎?

jein_Partl;結(jié)束,未找到對應(yīng)的零件重新輸入

cmpendede,1;讀錯誤嗎?

jein_Part4;錯誤,轉(zhuǎn)結(jié)束

leasi,in_buffer+2;查找零件號對應(yīng)的零件

leadi,table

movex,3

repeempsb

jein_Part3;找到對應(yīng)的零件

jmpin_Part2;找下一'個零件

inPart3:leadx,in_mes2;顯示提示信息,提示輸入零件數(shù)量

callinput;輸入數(shù)據(jù)

calldec_bin;將輸入數(shù)據(jù)轉(zhuǎn)換為二進制數(shù),在bx中

leadi,table;di指向該記錄的首地址

movax,[di+15];取單價

mulbx;總價格在(dx),(ax)中

movsum_price,ax

movsum_price+2,dx

calldisp_rec;顯示信息

in_Part4:ret

in_Partendp

;輸入數(shù)據(jù)

inputprocnear

inputl:movah,09h;顯示字符串

int21h

movah,Oah;輸入字符串

leadx,in_buffer

int21h

leadx,out_mesl;顯示提示信息

movcl,in_buffer+l

cmpcl,0;輸入的數(shù)字個數(shù)為0嗎?

jzinputl

movch,0

movbx,2

input2:moval,in_buffer[bx];輸入的是數(shù)字0、9嗎?

cmpal,'O'

jbinputl

cmpal,’9’

jainputl

incbx

loopinput2

ret

inputendp

;將十進制數(shù)轉(zhuǎn)換為二進制數(shù)子程序

dec_binprocnear

movbx,0

movsi,2

movcl,in_buffer+l

movch,0

transfer:moval,inbuffer[si];從十進制的高位到低位取數(shù)

andal,Ofh;將ascii碼轉(zhuǎn)換為十進制數(shù)

mo

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論