




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
16。32位微機原理、匯編語言及接口技術(第二版)第三章課后習題答案。>第3章3.1:匯編語言有什么特點 解: 匯編語言是一種以處理器指令系統為基礎的低級程序設計語言,它采用助記符表達指令操作碼,采用標識符號表示指令操作數,可以直接、有效地控制計算機硬件,因而容易創建代碼序列短小、運行快速的可執行程序3.2編寫匯編語言源程序時,一般的組成原則是什么?解: (1)完整的匯編語言源程序由段組成 (2)一個匯編語言源程序可以包含若干個代碼段、數據段、附加段或堆棧段,段與段之間的順序可隨意排列 (3)需獨立運行的程序必須包含一個代碼段,并指示程序執行的起始點,一個程序只有一個起始點 (4)所有的可執行性語句必須位于某一個代碼段內,說明性語句可根據需要位于任一段內 (5)通常,程序還需要一個堆棧段3.3MODEL偽指令是簡化段定義源程序格式中必不可少的語句,它設計了哪7種存儲模式?各用于創建什么性質的程序?解: 存儲模式特點TINYCOM類型程序,只有一個小于64KB的邏輯段(MASM6.x支持)SMALL小應用程序,只有一個代碼段和一個數據段(含堆棧段),每段不大于64KBCOMPACT代碼少、數據多的程序,只有一個代碼段,但有多個數據段MEDIUM代碼多、數據少的程序,可有多個代碼段,只有一個數據段LARGE大應用程序,可有多個代碼段和多個數據段(靜態數據小于64KB)HUGE更大應用程序,可有多個代碼段和多個數據段(對靜態數據沒有限制)FLAT32位應用程序,運行在32位80x86CPU和Windows9x或NT環境3.4如何規定一個程序執行的開始位置,主程序執行結束應該如何返回DOS,源程序在何處停止匯編過程?解: 開始位置:用標號指明 返回DOS:利用DOS功能調用的4CH子功能3.7DOS支持哪兩種可執行程序結構,編寫這兩種程序時需要注意什么?解:(1).EXE程序 程序可以有多個代碼段和多個數據段,程序長度可以超過64KB 通常生成EXE結構的可執行程序(2).COM程序 只有一個邏輯段,程序長度不超過64KB 需要滿足一定條件才能生成COM結構的可執行程序(MASM6.x需要采用TINY模式)3.8舉例說明等價“EUQ”偽指令和等號“=”偽指令的用途解: 符號定義偽指令有“等價EQU”和“等號=”: 符號名EQU數值表達式 符號名EQU<字符串> 符號名=數值表達式 EQU用于數值等價時不能重復定義符號名,但“=”允許有重復賦值。例如: X=7 ;等效于:Xequ7 X=X+5 ;“XEQUX+5”是錯誤的3.9給出下列語句中,指令立即數(數值表達式)的值(1)moval,23hAND45hOR67h(2)movax,1234h/16+10h3:movax,23hSHL44:moval,‘a’and(NOT(‘a’-‘A’))5:movax,(76543LT32768)XOR7654h解: (1)al=67h (2)ax=133h,dx=4h (3)ax=0230h (4)al=41h (4)ax=7654h3.10畫圖說明下列語句分配的存儲空間及初始化的數據值(1)byte_vardb‘abc’,10,10h,‘EF’,3dup(-1,?,3,dup(4))(2:)word_vardw10h,-5,3,dup(?)解: (1)41h42h43h1010h45h46h-1?444-1?444-1?444(2)10h00h0fbh0ffh??????3.11請設置一個數據段,按照如下要求定義變量:(1)my1b為字符串常量,表示字符串“personalComputer”(2)my2b為用十進制數表示的字節變量,這個數的大小為20(3)my3b為用十六進制數表示的字節變量,這個數的大小為20(4)my4b為用二進制數表示的字節變量,這個數的大小為20(5)my5w為20個未賦值的字變量(6)my6c為100的符號常量(7)my7c為字符串常量,代替字符串“personalComputer”解:.data my1bdb'PersonalComputer' my2bdb20 my3bdb14h my4bdb00010100b my5wdw20dup(?) my6c=100 my7c=<'PersonalComputer'>3.12希望控制變量或程序代碼在段中的偏移地址,應該使用哪個偽指令?解: 利用定位偽指令控制,如org,even,align3.13名字和符號有什么屬性?解: 包括邏輯地址和類型兩種屬性。3.14設在某個程序中有如下片段,請寫出每條傳送指令執行后寄存器AX的內容:;數據段Org100hVarwdw1234h,5678hVarbdb3,4Varddd12345678hBuffdb10dup(?)Messdb‘hello’;代碼段Movax,offsetmessMovax,typebuff+typemess+typevardMovax,sizeofvarw+sizeofbuff+sizeofmessMovax,lengthofvarw+lengthofvard解: ;數據段 org100h varw dw 1234h , 5678h varb db 3 , 4 vard dd 12345678h buff dd 10 dup(?) mess db 'Hello' ;代碼段 mov ax , offset varb + offset mess mov ax , type buff + type mess + type vard mov ax , sizeof varw+sizeof buff+sizeofmess mov ax , lengthof varw+lengthof vard3.15假設myword是一個字變量,mybyte1和mybyte2是兩個字節變量,指出下列語句中的具體錯誤原因。(1)movbyteptr{bx},1000(2)movbx,offsetmyword{si}(3)cmpmybyte1,mybyte2(4)movmybyte1,al+1(5)subal,myword(6)jnzmyword解: (1)1000超過一個字節所能表達的最大整數 (2)SI應為偶數 (3)兩個內存單元不能直接運算 (4)應改為[al+1] (5)條件轉移指令后面應接標號,而不是變量3.16編寫一個程序,把從鍵盤輸入的一個小寫字母用大寫字母顯示出來解: movah,1 ;只允許輸入小寫字母 int21h subal,20h ;轉換為大寫字母 movdl,al movah,2 int21h ;顯示3.17已知用于LED數碼管的顯示代碼表為:LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hdb80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示0~9,A~F這16個數碼的顯示代碼。現編寫一個程序實現將lednum中的一個數字(0~9,a~f)轉換成對應的LED顯示代碼解: movbx,offsetLEDtable moval,lednum xlat3.18編制一個程序,把變量bufX和bufY中較大者存入bufZ;若兩者相等,則把其中之一存入bufZ中。假設變量存放的是8位有符號數。解: movax,bufX cmpax,bufY jaedone movax,bufYdone: movbufZ,ax3.19為有符號16位數,請將它們的符號狀態保存在signX,即:如果變量值大于等于0,保存0;如果X小于0,保存-1。編寫該程序。設變量bufX解: .modelsmall .stack .databufX dw-7signX db? .code .startup cmpbufX,0 ;testbufX,80h jlnext ;jnznext movsignX,0 jmpdonenext: movsignX,-1done: .exit0 end3.20bufX、bufY和bufZ是3個有符號16進制數,編寫一個比較相等關系的程序(1)如果這3個數都不相等,則顯示0(2)如果這三個數中有兩個數相等,則顯示1(3)如果這三個數都相等,則顯示2解: movdl,’2 movax,bufX cmpax,bufY jenext1 decdlnext1: cmpax,bufZ jenext2 decdlnext2: movah,2 int21h3.21例3.7中,如果要實現所有為1的位都順序執行相應的處理程序段(而不是例題中僅執行最低為1位的處理程序段),請寫出修改后的代碼段?解: ;代碼段 moval,number movbx,0 ;BX←記錄為1的位數restart: cmpal,0 ;AL=0結束 jzdoneagain: shral,1 ;最低位右移進入CF jcnext ;為1,轉移 incbx ;不為1,繼續 jmpagainnext: pushax pushbx shlbx,1 ;位數乘以2(偏移地址要用2個字節單元) jmpaddrs[bx] ;間接轉移:IP←[table+BX] ;以下是各個處理程序段fun0: movdl,'0' jmpdispfun1: movdl,'1' jmpdispfun2: movdl,'2' jmpdispfun3: movdl,'3' jmpdispfun4: movdl,'4' jmpdispfun5: movdl,'5' jmpdispfun6: movdl,'6' jmpdispfun7: movdl,'7' jmpdisp ;disp: movah,2 ;顯示一個字符 int21h popbx popax jmprestartdone: …編制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10個字節數據之和,并將結果存入字節變量SUM中(不考慮溢出和進位)。;wjxt322.asm .modelsmall .stack .datab_data db12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始數據num equ10 ;數據個數sum db? ;預留結果單元 .code .startup xorsi,si ;位移量清零 xoral,al ;取第一個數 movcx,num ;累加次數again: addal,b_data[si] ;累加 incsi ;指向下一個數 loopagain ;如未完,繼續累加 movsum,al ;完了,存結果 .exit0 end3.23求主存0040h:0開始的一個64KB物理段中共有多少個空格?;wjxt323.asm .modelsmall .codestart: movax,0040h ;送段地址 movds,ax movsi,0 ;偏移地址 movcx,si ;計數(循環次數) xorax,ax ;空格計數器清零again: cmpbyteptr[si],20h ;與空格的ASCII碼比較 jnenext ;不是空格,轉 incax ;是空格,空格數加1next: incsi ;修改地址指針 loopagain ;cx=cx-1,如cx=0退出循環 .exit0 endstart3.24編寫計算100個16位正整數之和的程序。如果和不超過16位字的范圍(65535),則保存其和到wordsum,如超過則顯示‘overflow’。答: ;數據段count equ100parray dwcountdup(?) ;假設有100個數據wordsum dw0msg db‘overflow’,’$’ ;代碼段 movcx,count movax,0 movbx,offsetparrayagain: addax,[bx] jncnext movdx,offsetmsg movah,9 int21h ;顯示溢出信息 jmpdone ;然后,跳出循環體next: addbx,2 loopagain movwordsum,axdone: …3.25編程把—個16位無符號二進制數轉換成為用8421BCD碼表示的5位十進制數。轉換算法可以是:用二進制數除以10000,商為“萬位”,再用余數除以1000,得到“千位”;依次用余數除以l00、10和l,得到“百位”、“十位”和“個位”。;wjxt325.asm .modelsmall .stack256 .dataarray dw? ;源字數據dbcd db5dup(?) ;五位bcd結果,高對高低對低 .code .startup movdx,array ;取源數據(余數) movbx,10000 ;除數 movcx,10 ;除數系數 movsi,4 ;目的數據高位位移量again: movax,dx ;dx.ax中存放被除數 movdx,0 divbx ;除于bx,商ax,余數dx movdbcd[si],al ;商<10,存結果 pushdx ;暫存余數 movax,bx ;除數除于10 movdx,0 divcx ;dx.ax除于cx,商ax、余數0存在dx movbx,ax ;bx是除數 popdx decsi ;目的數據位移量減1 jnzagain movdbcd,dl ;存個位數(<10) .exit0 end3.26過程定義的一般格式是怎樣的?子程序開始為什么常有PUSH指令?返回錢為什么常有POP指令?下面完成16位無符號數累加的子程序有什么不妥嗎?若有,請改正。CarzyPROCPushaxXorax,axXorax,dxAgainaddax,[bx]Adcdx,0IncbxIncbxLoopagainRetENDPcrazy解: (1)匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下: 過程名 PROC[NEAR|FAR] …… ;過程體 過程名 ENDP (2)保護用到的寄存器內容,以便子程序返回時進行相應的恢復。 (3)改錯: crazy proc pish bx push cx xor ax,ax xor dx,dx again:add a,[bx] adc dx,0 inc bx inc bx loop again pop cx pop bx3.27編寫一個源程序,在鍵盤上按一個鍵,將從AL返回的ASCⅡ碼值顯示出來,如果按下ESC鍵則程序退出。解(不需調用HTOASC子程序):again: movah,1 int21h cmpal,1bh ;ESC的ASCII碼是1bh jedone movdl,al movah,2 int21h ;是大寫字母則轉換為小寫字母 jmpagaindone: …3.28請按如下說明編寫子程序:;子程序功能:把用ASCⅡ碼表示的兩位十進制數轉換為對應二進制數;入口參數:DH=十位數的ASCⅡ碼,DL=個位數的ASCⅡ碼;出口參數:AL=對應的二進制數解答:asctob proc pushcx anddh,0fh ;先轉換十位數 shldh,1 ;十位數乘以10(采用移位指令) movch,dh shldh,1 shldh,1 adddh,ch anddl,0fh ;轉換個位數 adddh,dl ;十位數加個位數 moval,dh ;設置出口參數 popcx retasctob endp3.29調用HTOASC子程序,顯示一個字節的16進制數,后跟“H”的子程序。解:DIPASC proc ;入口參數:AL=要顯示的一個16進制數 pushcx pushdx pushax movcl,4 ;轉換高位 shral,cl callHTOASC movdl,al ;顯示 movah,2 int21h popax ;轉換低位 callHTOASC movdl,al ;顯示 movah,2 int21h movdl,’H’ ;顯示一個字母“H” movah,2 int21h popdx popcx retDIPASC endpHTOASC proc ;將AL低4位表達的一位16進制數轉換為ASCII碼 andal,0fh cmpal,9 jbehtoasc1 addal,37h ;是0AH~0FH,加37H轉換為ASCII碼 ret ;子程序返回htoasc1: addal,30h ;是0~9,加30H轉換為ASCII碼 ret ;子程序返回HTOASC endp3.30寫一個子程序,根據入口參數AL=0、1、2,依次實現對大寫字母轉換成小寫、小寫轉換成大寫或大小字母互換。欲轉換的字符串在string中,用0表示結束解:lucase proc pushbx movbx,offsetstring cmpal,0 jecase0 cmpal,1 jzcase1 cmpal,2 jzcase2 jmpdonecase0: cmpbyteptr[bx],0 jedone cmpbyteptr[bx],’A’ jbnext0 cmpbyteptr[bx],’Z’ janext0 addbyteptr[bx],20hnext0: incbx jmpcase0case1: cmpbyteptr[bx],0 jedone cmpbyteptr[bx],’a’ jbnext1 cmpbyteptr[bx],’z’ janext1 subbyteptr[bx],20hnext1: incbx jmpcase1case2: cmpbyteptr[bx],0 jedone cmpbyteptr[bx],’A’ jbnext2 cmpbyteptr[bx],’Z’ janext20 addbyteptr[bx],20h jmpnext2next20: cmpbyteptr[bx],’a’ jbnext2 cmpbyteptr[bx],’z’ janext2 subbyteptr[bx],20hnext2: incbx jmpcase2done: popbx retlucase endp3.31子程序的參數傳遞有哪些方法?請簡單比較解: (1)用寄存器傳遞參數: 最簡單和常用的參數傳遞方法是通過寄存器,只要把參數存于約定的寄存器中就可以了 由于通用寄存器個數有限,這種方法對少量數據可以直接傳遞數值,而對大量數據只能傳遞地址 采用寄存器傳遞參數,注意帶有出口參數的寄存器不能保護和恢復,帶有入口參數的寄存器可以保護、也可以不保護,但最好能夠保持一致 (2)用共享變量傳遞參數 子程序和主程序使用同一個變量名存取數據就是利用共享變量(全局變量)進行參數傳遞 如果變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTREN聲明 如果主程序還要利用原來的變量值,則需要保護和恢復 利用共享變量傳遞參數,子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數據 (3)用堆棧傳遞參數 參數傳遞還可以通過堆棧這個臨時存儲區。主程序將入口參數壓入堆棧,子程序從堆棧中取出參數;子程序將出口參數壓入堆棧,主程序彈出堆棧取得它們 采用堆棧傳遞參數是程式化的,它是編譯程序處理參數傳遞、以及匯編語言與高級語言混合編程時的常規方法3.32采用堆棧傳遞參數的一般方法是什么?為什么應該特別注意堆棧平衡問題。解: 方法:主程序將入口參數壓入堆棧,子程序從堆棧中取出參數;子程序將出口參數壓入堆棧,主程序彈出堆棧取得它們 注意:壓棧與彈棧必須要一一對應。3.33編寫一個求32位數據補碼的子程序,通過寄存器傳遞入口參數解:方法1:neg32 proc ;入口參數:DX.AX=32位有符號數 negax ;實現0-DX.AX功能 negdx sbbdx,0 ;這條指令也可以用decdx代替 retneg32 endp ;出口參數:DX.AX=32位有符號數的補碼方法2:neg32 proc ;入口參數:DX.AX=32位有符號數 notax ;實現DX.AX求反加1 notdx addax,1 adcdx,0 retneg32 endp ;出口參數:DX.AX=32位有符號數的補碼3.34編寫一個計算字節校驗的子程序。所謂“校驗和”是指不計進位的累加,常用語建廠信息的正確性。主程序提供入口參數,有數據個數和數據緩沖區的首地址。子程序回送求和結果這個出口參數。傳遞參數方法自定。解: ;數據段array db12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;數組count equ$-array ;數組元素個數result db? ;校驗和 ;代碼段 movbx,offsetarray ;BX←數組的偏移地址 movcx,count ;CX←數組的元素個數 callchecksum ;調用求和過程 movresult,al ;處理出口參數 movax,4c00h int21h ;計算字節校驗和的通用過程 ;入口參數:DS:BX=數組的段地址:偏移地址,CX=元素個數 ;出口參數:AL=校驗和 ;說明:除AX/BX/CX外,不影響其他寄存器checksum proc xoral,al ;累加器清0sum: addal,[bx] ;求和 incbx ;指向下一個字節 loopsum retchecksum endp end3.35編寫3個子程序,把一個16位二進制數用4為16進制數在屏幕上顯示出來,分別運用如下3中參數傳遞方法,并配合3個主程序驗證它。(1)采用AX寄存器傳遞這個16位二進制數。(2)采用temp變量傳遞這個16位二進制數。(3)采用堆棧方法傳遞這個16位二進制數。解:⑴ .modelsmall .stack .datawdata dw34abh .code .startup movax,wdata calldispa .exit0 ;dispa proc pushcx pushdx movcl,4 movdl,ah shrdl,cl calldldisp movdl,ah anddl,0fh calldldisp movdl,al shrdl,cl calldldisp movdl,al anddl,0fh calldldisp popdx popcx retdispa endp ;dldisp proc pushax ordl,30h cmpdl,39h jbedldisp1 adddl,7dldisp1: movah,2 int21h popax retdldisp endp end⑵ .modelsmall .stack .datawdata dw34abhwordtemp dw? .code .startup movax,wdata movwordtemp,ax calldispa .exit0 ;dispa proc pushcx pushdx movcl,4 movdl,byteptrwordtemp+1 shrdl,cl calldldisp movdl,byteptrwordtemp+1 anddl,0fh calldldisp movdl,byteptrwordtemp shrdl,cl calldldisp movdl,byteptrwordtemp anddl,0fh calldldisp popdx popcx retdispa endp ;dldisp proc pushax ordl,30h cmpdl,39h jbedldisp1 adddl,7dldisp1: movah,2 int21h popax retdldisp endp end⑶ .modelsmall .stack .datawdata dw34abh .code .startup pushwdata calldispa popax ;addsp,2 .exit0 ;dispa proc pushbp movbp,sp pushax pushcx pushdx movax,[bp+4] movcl,4 movdl,ah shrdl,cl calldldisp movdl,ah anddl,0fh calldldisp movdl,al shrdl,cl calldldisp movdl,al anddl,0fh calldldisp popdx popcx popax popbp retdispa endp ;dldisp proc pushax ordl,30h cmpdl,39h jbedldisp1 adddl,7dldisp1: movah,2 int21h popax retdldisp endp end3.36什么情況需要使用PUBLIC和EXTERN偽指令?請將題3.20的子程序全部用于寄存器傳遞參數,寫成子程序模塊。解:如果利用共享變量傳遞函數,且變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTERN聲明。3.37宏是如何定義、調用和展開的?解:(1)宏定義由一對宏匯編偽指令MACRO和ENDM來完成,格式如下: 宏名 MACRO[形參表] …… ;宏定義體 ENDM宏定義之后就可以使用它,即宏調用: 宏名[實參表](2)宏調用的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實體參數;如果有多個參數,應按形參順序填入實參,也用逗號分
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省郟縣2025屆三年級數學第二學期期末經典試題含解析
- 湖北師范大學文理學院《基礎護理學》2023-2024學年第二學期期末試卷
- 徐州生物工程職業技術學院《時尚傳播》2023-2024學年第二學期期末試卷
- 神木縣2025年數學三下期末綜合測試試題含解析
- 服務產品策略知識訓練講義英文版
- 皮革制品的國內外市場準入規則考核試卷
- 毛織品行業市場服務創新策略優化調整考核試卷
- 智能照明在小型會議室照明中的應用考核試卷
- 煤炭資源開發與區域環境保護協調發展考核試卷
- 電力系統電能質量監測與治理設備考核試卷
- 四大名著文學常識單選題100道及答案解析
- 四川省達州市2024年中考化學真題(含答案)
- 投資并購法律實務(第二版)
- 大學生孵化基金協議書范文模板
- DB31T-語料庫建設管理導則
- 2024年新版全員消防安全知識培訓
- 老舊小區管網改造工程施工組織設計方案
- 2025年遼寧中考語文復習專項訓練:文言文閱讀(含解析)
- 新版工貿企業重大事故隱患-題庫
- 內蒙古建筑圖集 DBJ-T 03-76-2018 自保溫砌塊建筑構造圖集
- 企業規范化管理與標準化建設
評論
0/150
提交評論