第5章_模塊化程序設(shè)計(jì)_第1頁(yè)
第5章_模塊化程序設(shè)計(jì)_第2頁(yè)
第5章_模塊化程序設(shè)計(jì)_第3頁(yè)
第5章_模塊化程序設(shè)計(jì)_第4頁(yè)
第5章_模塊化程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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、第5章 模塊化程序設(shè)計(jì)5.1 簡(jiǎn)答題(1)指令“CALL EBX”采用了指令的什么尋址方式?寄存器間接尋址(2)為什么MASM要求使用proc定義子程序?(這個(gè)問(wèn)題不好回答,是不是作者寫(xiě)錯(cuò)了?我猜測(cè)可能的原因: 在匯編語(yǔ)言中,函數(shù)、子程序等都稱(chēng)為過(guò)程,所以使用proc定義子程序 )(3)為什么特別強(qiáng)調(diào)為子程序加上必要的注釋?zhuān)勘阌诔绦騿T調(diào)用時(shí)使用,而不必關(guān)注子程序的內(nèi)部實(shí)現(xiàn)。(4)參數(shù)傳遞的“傳值”和“傳址”有什么區(qū)別?傳值是傳遞參數(shù)的拷貝,傳址是傳遞參數(shù)的地址(5)子程序采用堆棧傳遞參數(shù),為什么要特別注意堆棧平衡問(wèn)題?保證正確返回;釋放傳遞參數(shù)占用的堆棧空間,避免多次調(diào)用可能導(dǎo)致的堆棧溢出(6

2、)INCLUDE語(yǔ)句和INCLUDELIB有什么區(qū)別?INCLUDE語(yǔ)句包含的是文本文件、是源程序文件的一部分;INCLUDELIB語(yǔ)句包含的是子程序庫(kù)文件(7)什么是子程序庫(kù)?子程序庫(kù)就是子程序模塊的集合,其中存放著各子程序的名稱(chēng)、目標(biāo)代碼以及有關(guān)定位信息,便于子程序的管理和調(diào)用(8)調(diào)用宏時(shí)沒(méi)有為形參提供實(shí)參會(huì)怎樣?缺少的實(shí)參,形參會(huì)做“空”處理。(9)宏定義體中的標(biāo)號(hào)為什么要用local為指令聲明?為了避免宏展開(kāi)后出現(xiàn)標(biāo)示符不唯一的情況,定義為局部。(10)條件匯編不成立的語(yǔ)句會(huì)出現(xiàn)在可執(zhí)行文件中嗎?不會(huì)。5.2 判斷題(1)過(guò)程定義proc是一條處理器指令。錯(cuò),proc是偽指令(2)C

3、ALL指令的執(zhí)行并不影響堆棧指針ESP。錯(cuò),要改變,因?yàn)榉祷氐刂芬獕喝攵褩#?)call指令本身不能包含子程序的參數(shù)。對(duì)。(4) call指令用在調(diào)用程序中,如果被調(diào)用程序中也有call指令,說(shuō)明出現(xiàn)了嵌套。 對(duì)。(5)子程序需要保護(hù)寄存器,包括保護(hù)傳遞入口參數(shù)和出口參數(shù)的通用寄存器。錯(cuò),不能保護(hù)傳遞出口參數(shù)的寄存器(6)利用INCLUDE包含的源文件實(shí)際上只是源程序的一部分。對(duì)(7)宏調(diào)用與子程序調(diào)用一樣都要使用CALL指令實(shí)現(xiàn)。錯(cuò),宏調(diào)用是通過(guò)宏展開(kāi)實(shí)現(xiàn)的調(diào)用,不用CALL指令(8)宏定義與子程序一樣一般書(shū)寫(xiě)與主程序之后。錯(cuò),宏需要先定義后調(diào)用,一般在源程序開(kāi)頭部分。(9)重復(fù)匯編類(lèi)似于宏

4、匯編,需要先定義后調(diào)用。錯(cuò)。(10)條件匯編并不像條件轉(zhuǎn)移指令那樣使用標(biāo)志作為條件對(duì)。5.3 填空題(1)指令“RET i16”的功能相當(dāng)于“RET”指令和“ADD ESP, _”組合。i16(2)例5-1程序中的ret指令,如果用pop ebp和jmp ebp指令替換,則ebp內(nèi)容是( )0000000分(3)子程序的參數(shù)傳遞主要有3種,它們是( )、( )和( )。寄存器傳遞,共享變量傳遞,堆棧傳遞(4)數(shù)值10在計(jì)算機(jī)內(nèi)部用二進(jìn)制“1010”編碼表示,用十六進(jìn)制表達(dá)是:_。如果將該編碼加37H,則為_(kāi),它是字符_的ASCII碼值。A,41H,A(5)利用堆棧傳遞子程序參數(shù)的方法是固定的,

5、例如尋址堆棧段數(shù)據(jù)的寄存器是_。EBP(6)MASM匯編語(yǔ)言中,聲明一個(gè)共用的變量應(yīng)使用_偽指令;而使用外部變量要使用_偽指令聲明。PUBLIC,EXTERN(7)過(guò)程定義開(kāi)始是“TEST PROC”語(yǔ)句,則過(guò)程定義結(jié)束的語(yǔ)句是_。宏定義開(kāi)始是“DISP MACRO”語(yǔ)句,則宏定義結(jié)束的語(yǔ)句是_。TEST ENDP,ENDM(8)一個(gè)宏定義開(kāi)始語(yǔ)句“WriteChar MACRO CHAR:REQ”,則宏名是( ),參數(shù)有 ( ) 個(gè),并且使用“:REQ”說(shuō)明該參數(shù)( )。WriteChar, 1 , 不可缺少(9)實(shí)現(xiàn)“byte 20 dup(20h)”語(yǔ)句的功能也可以使用重復(fù)匯編,第1個(gè)語(yǔ)

6、句是( ),第2個(gè)語(yǔ)句是“ byte 20h”,第3個(gè)語(yǔ)句是( )。REPEAT 20, ENDM(10)條件匯編語(yǔ)言語(yǔ)句“IF NUM LT 100”中的LT 表示( ),該語(yǔ)句需要配合( )語(yǔ)句結(jié)束條件匯編小于, ENDIF習(xí)題5.4 如下子程序完成對(duì)ECX個(gè)元素的數(shù)組(由EBX指向其首地址)的求和,通過(guò)EDX和EAX返回結(jié)果,但是程序有錯(cuò)誤,請(qǐng)改正。CrazyprocPusheaxXoreax,eaxXoredx,edxAgain:Addeax,ebxAdcedx,0Addebx,4LoopagainRetENDP Crazy答:CrazyprocXoreax,eaxXoredx,edx

7、Again:Addeax,ebxAdcedx,0Addebx,4LoopagainRetCrazy ENDP 習(xí)題5.5請(qǐng)按如下說(shuō)明編寫(xiě)子程序:子程序功能:把用ASCII碼表示的兩位十進(jìn)制數(shù)轉(zhuǎn)換為壓縮BCD碼。入口參數(shù):DH=十位數(shù)的ASCII碼,DL=個(gè)位數(shù)的ASCII碼出口參數(shù):AL=對(duì)應(yīng)的BCD碼答:asc2bcdprocshldh,4anddl,0fhordh,dlmoval,dhretasc2bcdendp習(xí)題5.6乘法的非壓縮BCD碼調(diào)整指令A(yù)AM執(zhí)行的操作是:AH<-AL/10的商,AL<-AL/10的余數(shù)。利用AAM可以實(shí)現(xiàn)將AL中的100內(nèi)數(shù)據(jù)轉(zhuǎn)換為ASCII碼,

8、程序如下:Xor ah,ahAamAddax,3030h利用這段程序,編寫(xiě)一個(gè)顯示AL中數(shù)值(099)的子程序。答:subaprocaamaddax,3030hxchgah,alcalldispcxchgah,alcalldispcretsubaendp習(xí)題5.7編寫(xiě)一個(gè)源程序,在鍵盤(pán)上按一個(gè)鍵,將其返回的ASCII碼值顯示出來(lái),如果按下退格鍵(對(duì)應(yīng)ASCII碼是08H)則程序退出。請(qǐng)調(diào)用書(shū)中的HTOASC子程序答:;代碼段,主程序again:call readccmp al,08h;退格鍵BS=08Hjz donemov bl,almov al,':'call dispcmo

9、v al,blrol al,4call htoasc;調(diào)用子程序call dispc;顯示一個(gè)字符mov al,blcall htoasc;調(diào)用子程序call dispc;顯示一個(gè)字符call dispcrlfjmp againdone:習(xí)題5.8編寫(xiě)一個(gè)子程序,它以二進(jìn)制形式顯示EAX中32位數(shù)據(jù),并設(shè)計(jì)一個(gè)主程序驗(yàn)證。答:;代碼段,主程序mov eax,8F98FF00Hcall dispbd;調(diào)用子程序;代碼段,子程序dispbdproc;32位二進(jìn)制數(shù)的輸出push ecxmov ecx,32;要輸出的字符個(gè)數(shù)dbd:rol eax,1;AL循環(huán)左移一位push eaxand al,0

10、1h;取AL最低位add al,30h;轉(zhuǎn)化成相應(yīng)的ASCLL碼值call dispc;以二進(jìn)制的形式顯示pop eaxloop dbdpop ecxretdispbdendp習(xí)題5.9將例5-4的32位寄存器改用16位寄存器,僅實(shí)現(xiàn)輸出-215 +215-1之間的數(shù)據(jù)。答:start:mov ecx,lengthof arraymov ebx,0again:mov ax,arrayebx call writecall dispcrlfinc ebxinc ebxloop againexit 0writeprocpush ebxpush ecxpush edxmov ebx,offset wr

11、itebuftest ax,axjnz write1mov byte ptr ebx,30hinc ebxjmp write5write1:jns write2mov byte ptr ebx,'-'inc ebxneg axwrite2:mov cx,10push cxwrite3:cmp ax,0jz write4 xor dx,dxdiv cxadd dx,30hpush dxjmp write3write4:pop dxcmp dx,cxje write5mov ebx,dlinc ebxjmp write4write5:mov byte ptr ebx,0mov ea

12、x,offset writebufcall dispmsgpop edx;恢復(fù)寄存器pop ecxpop ebxret;子程序返回writeendp習(xí)題5.10參考例5-6,編寫(xiě)實(shí)現(xiàn)32位無(wú)符號(hào)整數(shù)輸入的子程序,并設(shè)計(jì)一個(gè)主程序驗(yàn)證。答: include io32.inc.datacount= 5arraydword count dup(0)tempdword ?;共享變量readbufbyte 30 dup(0).codestart:mov ecx,countmov ebx,offset arrayagain:call read;調(diào)用子程序,輸入一個(gè)數(shù)據(jù)mov eax,temp;獲得出口參數(shù)

13、mov ebx,eax;存放到數(shù)據(jù)緩沖區(qū)add ebx,4dec ecxjnz againexit 0readprocpush eaxpush ebxpush ecxpush edxread0:mov eax,offset readbufcall readmsgtest eax,eaxjz readerrcmp eax,10ja readerrmov edx,offset readbufxor ebx,ebxread1:mov al,edxread2:incedxcmp al,'0'jb readerrcmp al,'9'ja readerrsub al,30h

14、imul ebx,10jc readerrmovzx eax,aladd ebx,eaxcmp ebx,0ffffffffhjareaderrdec cxjnzread1jmpread5readerr:mov eax,offset errmsgcall dispmsgjmp read0;read5:mov temp,ebxpop edxpop ecxpop ebxpop eaxreterrmsgbyte 'Input error, enter again: ',0readendpend start習(xí)題5.11編寫(xiě)一個(gè)計(jì)算字節(jié)校驗(yàn)和的子程序。(所謂“校驗(yàn)和”是指不記進(jìn)位的累加,常

15、用于檢查信息的正確性。)主程序提供入口參數(shù),包括數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù)緩沖區(qū)的首地址。子程序回送求和結(jié)果這個(gè)出口參數(shù)。答:;計(jì)算字節(jié)校驗(yàn)和的通用過(guò)程;入口參數(shù):DS:EBX數(shù)組的段地址:偏移地址ECX元素個(gè)數(shù);出口參數(shù):AL校驗(yàn)和;說(shuō)明:除EAX/EBX/ECX外,不影響其他寄存器checksumprocxor al,al;累加器清0sum:add al,ebx;求和inc ebx;指向下一個(gè)字節(jié)loop sumretchecksumendp習(xí)題5.12編制3個(gè)子程序把一個(gè)32位二進(jìn)制數(shù)用8位十六進(jìn)制形式在屏幕上顯示出來(lái),分別運(yùn)用如下3種參數(shù)傳遞方法,并配合3個(gè)主程序驗(yàn)證它。(1)采用EAX寄存器傳遞

16、這個(gè)32位二進(jìn)制數(shù)。(2)采用temp變量傳遞這個(gè)32位二進(jìn)制數(shù)。(3)采用堆棧方法傳遞這個(gè)32位二進(jìn)制數(shù)。答:(1).codestart:mov eax, 1234abcdh;假設(shè)一個(gè)要顯示的數(shù)據(jù)callBin2Hexexit 0Bin2Hexprocpushecxmov ecx,8;8位十六進(jìn)制數(shù)again:rol eax,4;高4位循環(huán)移位進(jìn)入低4位push eax;子程序利用AL返回結(jié)果,所以需要保存EAX中的數(shù)據(jù)call htoasc;調(diào)用子程序pop eax;恢復(fù)保存的數(shù)據(jù)loop againpopecxrethtoascproc;將AL低4位表達(dá)的一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼

17、and al,0fh;只取AL的低4位or al,30h;AL高4位變成3,實(shí)現(xiàn)加30Hcmp al,39h;是09,還是AFjbe htoendadd al,7;是AF,其ASCII碼再加上7htoend:calldispcret;子程序返回htoascendpBin2Hexendpend start習(xí)題5.13利用十六進(jìn)制字節(jié)顯示子程序DISPHB設(shè)計(jì)一個(gè)從低地址到高地址逐個(gè)字節(jié)顯示某個(gè)主存區(qū)域內(nèi)容的子程序DISPMEM。其入口參數(shù):EAX主存偏移地址,ECX字節(jié)個(gè)數(shù)(主存區(qū)域的長(zhǎng)度)。同時(shí)編寫(xiě)一個(gè)主程序進(jìn)行驗(yàn)證。答:;數(shù)據(jù)段varbyte 'This is a test!'

18、;主程序mov eax,offset varmov ecx,sizeof varcall dispmem;子程序dispmemprocpush ebxmov ebx,eaxdispm1:cmp ecx,0jz dispm2mov al,ebxcall disphb mov al,' 'call dispcinc ebxdec ecxjmp dispm1dispm2:pop ebxretdispmemendp習(xí)題5.14數(shù)據(jù)輸入輸出程序。使用有符號(hào)十進(jìn)制數(shù)據(jù)輸入(例5-6)、求平均值(例5-7)以及輸出子程序(例5-4),編程實(shí)現(xiàn)從鍵盤(pán)輸入10個(gè)數(shù)據(jù),并輸出它們的平均值。(1)編

19、寫(xiě)主程序文件:定義必要的變量和交互信息,調(diào)用子程序輸入10個(gè)數(shù)據(jù),求平均值然后輸出。 (2)編寫(xiě)子程序文件:包括3個(gè)子程序的過(guò)程定義。(3)說(shuō)明進(jìn)行模塊連接的開(kāi)發(fā)過(guò)程,并上機(jī)實(shí)現(xiàn)。(4)將子程序文件形成一個(gè)子程序庫(kù),說(shuō)明開(kāi)發(fā)過(guò)程并上機(jī)實(shí)現(xiàn)。答:.data; 數(shù)據(jù)定義count= 10arraydword count dup(0)tempdword ?;共享變量readbufbyte 30 dup(0)writebufbyte 12 dup(0);顯示緩沖區(qū).code; 主程序start:mov ecx,countmov ebx,offset arrayagain:call read;調(diào)用子程序

20、,輸入一個(gè)數(shù)據(jù)mov eax,temp;獲得出口參數(shù)mov ebx,eax;存放到數(shù)據(jù)緩沖區(qū)add ebx,4dec ecxjnz againpush lengthof array;壓入數(shù)據(jù)個(gè)數(shù)push offset array;壓數(shù)組的偏移地址call mean;調(diào)用求平均值子程序,出口參數(shù):EAX平均值(整數(shù)部分)add esp,8;平衡堆棧(壓入了8個(gè)字節(jié)數(shù)據(jù))callwriteexit 0習(xí)題5.18編寫(xiě)一個(gè)宏swap,參數(shù)是兩個(gè)32位寄存器或存儲(chǔ)器操作數(shù),宏定義體實(shí)現(xiàn)兩個(gè)操作數(shù)位置交換,包括兩個(gè)都是存儲(chǔ)器操作數(shù)的情況。答:SWAP MACROop1,op2PUSHOP1PUSHOP2

21、POPOP1POPOP2ENDM習(xí)題5.19定義一個(gè)使用邏輯指令的宏LOGICAL。(1)用它代表4條邏輯運(yùn)算指令:AND/OR/XOR/TEST,可以使用3個(gè)形式參數(shù),并給出一個(gè)宏調(diào)用以及對(duì)應(yīng)宏展開(kāi)的例子。(2)必要時(shí)做一點(diǎn)修改,使該宏能夠把NOT指令包括進(jìn)去,給出一個(gè)使用NOT指令的宏調(diào)用以及對(duì)應(yīng)宏展開(kāi)的例子。答:(1)LOGICALMACROop,dst,srcopdst,srcENDMLOGICAL and,eax,1 00000000 83 E0 01 1andeax,1LOGICAL or,eax,1 00000003 83 C8 01 1oreax,1LOGICAL xor,ea

22、x,1 00000006 83 F0 01 1xoreax,1LOGICAL test,eax,1 00000009 A9 00000001 1testeax,1(2)LOGICALMACROop,dst,srcIFB <src>opdstELSEopdst,srcENDIFENDMLOGICAL not,eax 00000000 F7 D0 1noteax習(xí)題5.20有一個(gè)宏定義:Defstr macro name,num,stringName&numbyte&string&,0Endm給出如下宏調(diào)用的宏展開(kāi):(1)defstr msg,4,<Chapter 4:Program Structure>(2)defstr msg,5,<Chapter 5:Procedure Programming>答:Msg4 byte Chapter 4:Program Structure,0Msg5 byte

溫馨提示

  • 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)論