位微機原理課后習題答案_第1頁
位微機原理課后習題答案_第2頁
位微機原理課后習題答案_第3頁
位微機原理課后習題答案_第4頁
位微機原理課后習題答案_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第3章 3.1:匯編語言是一種以處理器指令系統(tǒng)為基礎的低級程序設計語言,它采用助記符表達指令操作碼,采用標識符號表示指令操作數(shù),可以直接、有效地控制計算機硬件,因而容易創(chuàng)建代碼序列短小、運行快速的可執(zhí)行程序3.2 解:(1)完整的匯編語言源程序由段組成(2)一個匯編語言源程序可以包含若干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列(3)需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點(4)所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)(5)通常,程序還需要一個堆棧段3.3 解:存儲模式特 點TINYCOM類型程序,

2、只有一個小于64KB的邏輯段(MASM 6.x支持)SMALL小應用程序,只有一個代碼段和一個數(shù)據(jù)段(含堆棧段),每段不大于64KBCOMPACT代碼少、數(shù)據(jù)多的程序,只有一個代碼段,但有多個數(shù)據(jù)段MEDIUM代碼多、數(shù)據(jù)少的程序,可有多個代碼段,只有一個數(shù)據(jù)段LARGE大應用程序,可有多個代碼段和多個數(shù)據(jù)段(靜態(tài)數(shù)據(jù)小于64KB)HUGE更大應用程序,可有多個代碼段和多個數(shù)據(jù)段(對靜態(tài)數(shù)據(jù)沒有限制)FLAT32位應用程序,運行在32位80x86CPU和Windows 9x或NT環(huán)境3.4解:開始位置:用標號指明返回DOS:利用DOS功能調(diào)用的4CH子功能來實現(xiàn)匯編停止:執(zhí)行到一條END偽指令

3、時,停止匯編3.5解:段定位、段組合和段類型。3.6給出采用一個源程序格式書寫的例題3.1源程序例題3.1:創(chuàng)建一個在屏幕上顯示一段信息的程序 解:stack segment stackdb 1024(0)stack endsdata segment string db Hello,Assembly!,0dH,0aH,$data ends code segment codeassume cs:code,ds:data,ss:stackstart: mov dx,offset stringmov ah,9int 21hcode endsend start3.7DOS支持哪兩種可執(zhí)行程序結(jié)構,編寫

4、這兩種程序時需要注意什么? 解:(1). EXE程序程序可以有多個代碼段和多個數(shù)據(jù)段,程序長度可以超過64KB通常生成EXE結(jié)構的可執(zhí)行程序(2). COM程序只有一個邏輯段,程序長度不超過64KB需要滿足一定條件才能生成COM結(jié)構的可執(zhí)行程序(MASM 6.x需要采用TINY模式)3.8舉例說明等價“EUQ”偽指令和等號“=”偽指令的用途 解:符號定義偽指令有“等價EQU”和“等號”:符號名 EQU 數(shù)值表達式符號名 EQU 符號名 數(shù)值表達式EQU用于數(shù)值等價時不能重復定義符號名,但“”允許有重復賦值。例如:X= 7;等效于:X equ 7X= X+5;“X EQU X+5”是錯誤的3.9

5、 解:(1) al=67h(2) ax=133h,dx=4h(3) ax=0230h(4) al=41h(4) ax=7654h3.10解:(1)41h42h43h1010h45h46h-1?444-1?444-1?444(2)10h00h0fbh0ffh?3.11 解:.data my1b db Personal Computermy2b db 20my3b db 14hmy4b db 00010100bmy5w dw 20 dup(?)my6c = 100my7c = 3.12 希望控制變量或程序代碼在段中的偏移地址,應該使用哪個偽指令?解:利用定位偽指令控制,如org,even,alig

6、n3.13名字和符號有什么屬性? 解:包括邏輯地址和類型兩種屬性。3.14解:;數(shù)據(jù)段org 100hvarwdw1234h,5678hvarbdb3,4varddd12345678hbuffdd10dup(?)messdbHello;代碼段movax,offsetvarb+ offsetmessmovax,typebuff+ typemess+typevardmovax,sizeofvarw+ sizeofbuff+ sizeof messmovax,lengthofvarw+ lengthofvard3.15解:(1) 1000超過一個字節(jié)所能表達的最大整數(shù)(2)SI應為偶數(shù)(3)兩個內(nèi)存

7、單元不能直接運算(4)應改為al+1(5)條件轉(zhuǎn)移指令后面應接標號,而不是變量3.16編寫一個程序,把從鍵盤輸入的一個小寫字母用大寫字母顯示出來 解:mov ah,1;只允許輸入小寫字母int 21hsub al,20h;轉(zhuǎn)換為大寫字母mov dl,almov ah,2int 21h;顯示3.17 解:mov bx,offset LEDtablemov al,lednumxlat3.18解:mov ax, bufXcmp ax, bufYjae donemov ax, bufYdone:mov bufZ, ax3.19解:.model small.stack.databufXdw -7sign

8、Xdb ?.code.startupcmp bufX,0;test bufX,80hjl next;jnz nextmov signX,0jmp donenext:mov signX,-1done:.exit 0end3.20 解:mov dl,2mov ax,bufXcmp ax,bufYje next1dec dlnext1:cmp ax,bufZje next2dec dlnext2:mov ah,2int 21h3.21 解:;代碼段mov al,numbermov bx,0;BX記錄為1的位數(shù)restart:cmp al,0;AL0結(jié)束jz doneagain:shr al,1;最低

9、位右移進入CFjc next;為1,轉(zhuǎn)移inc bx;不為1,繼續(xù)jmp againnext:push axpush bxshl bx,1;位數(shù)乘以2(偏移地址要用2個字節(jié)單元)jmp addrsbx;間接轉(zhuǎn)移:IPtableBX;以下是各個處理程序段fun0:mov dl,0jmp dispfun1:mov dl,1jmp dispfun2:mov dl,2jmp dispfun3:mov dl,3jmp dispfun4:mov dl,4jmp dispfun5:mov dl,5jmp dispfun6:mov dl,6jmp dispfun7:mov dl,7jmp disp;disp:

10、mov ah,2;顯示一個字符int 21hpop bxpop axjmp restartdone: 3.22;wjxt322.asm.model small.stack.datab_datadb 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始數(shù)據(jù)numequ 10;數(shù)據(jù)個數(shù)sumdb ?;預留結(jié)果單元.code.startupxor si, si;位移量清零xor al, al;取第一個數(shù)mov cx, num;累加次數(shù)again:add al, b_datasi;累加inc si;指向下一個數(shù)loop again;如未完,繼續(xù)累加mov sum,

11、 al;完了,存結(jié)果.exit 0end3.23 求主存0040h:0開始的一個64KB物理段中共有多少個空格?; wjxt323.asm.model small.codestart:mov ax,0040h;送段地址mov ds, axmov si, 0;偏移地址mov cx, si;計數(shù)(循環(huán)次數(shù))xor ax, ax;空格計數(shù)器清零again:cmp byte ptr si, 20h;與空格的ASCII碼比較jne next;不是空格,轉(zhuǎn)inc ax;是空格,空格數(shù)加1next:inc si;修改地址指針loop again;cxcx1,如cx0 退出循環(huán).exit 0end start

12、3.24 編寫計算100個16位正整數(shù)之和的程序。如果和不超過16位字的范圍(65535),則保存其和到wordsum,如超過則顯示overflow。答:;數(shù)據(jù)段countequ 100parraydw count dup(?);假設有100個數(shù)據(jù)wordsumdw 0msgdb overflow,$;代碼段mov cx,countmov ax,0mov bx,offset parrayagain:add ax,bxjnc nextmov dx,offset msgmov ah,9int 21h;顯示溢出信息jmp done;然后,跳出循環(huán)體next:add bx,2loop againmov

13、 wordsum,axdone:3.25 編程把個16位無符號二進制數(shù)轉(zhuǎn)換成為用8421BCD碼表示的5位十進制數(shù)。轉(zhuǎn)換算法可以是:用二進制數(shù)除以10000,商為“萬位”,再用余數(shù)除以1000,得到“千位”;依次用余數(shù)除以l00、10和l,得到“百位”、“十位”和“個位”。;wjxt325.asm .model small .stack 256 .data arraydw ?;源字數(shù)據(jù) dbcddb 5 dup(?);五位bcd結(jié)果,高對高低對低 .code .startup mov dx, array;取源數(shù)據(jù)(余數(shù)) mov bx, 10000;除數(shù) mov cx, 10;除數(shù)系數(shù) mov

14、 si, 4;目的數(shù)據(jù)高位位移量 again:mov ax, dx;dx.ax中存放被除數(shù) mov dx, 0div bx;除于bx,商ax,余數(shù)dx mov dbcdsi, al;商10,存結(jié)果 push dx;暫存余數(shù)mov ax, bx;除數(shù)除于10 mov dx,0div cx;dx.ax除于cx,商ax、余數(shù)0存在dx mov bx, ax;bx是除數(shù) pop dxdec si;目的數(shù)據(jù)位移量減1jnz againmov dbcd, dl;存?zhèn)€位數(shù)( 10 ) .exit 0end3.26 解:(1)匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:過程名PROC

15、 NEAR|FAR;過程體過程名ENDP(2)保護用到的寄存器內(nèi)容,以便子程序返回時進行相應的恢復。(3)改錯:crazyprocpishbxpushcxxorax,axxordx,dxagain:adda,bxadcdx,0incbxincbxloopagainpopcxpopbx3.27 編寫一個源程序,在鍵盤上按一個鍵,將從AL返回的ASC碼值顯示出來,如果按下ESC鍵則程序退出。 解(不需調(diào)用HTOASC子程序):again:mov ah,1int 21hcmp al,1bh;ESC的ASCII碼是1bhje donemov dl,almov ah,2int 21h;是大寫字母則轉(zhuǎn)換為

16、小寫字母jmp againdone:3.28 解答:asctobprocpush cxand dh,0fh;先轉(zhuǎn)換十位數(shù)shl dh,1;十位數(shù)乘以10(采用移位指令)mov ch,dhshl dh,1shl dh,1add dh,chand dl,0fh;轉(zhuǎn)換個位數(shù)add dh,dl;十位數(shù)加個位數(shù)mov al,dh;設置出口參數(shù)pop cxretasctobendp3.29 調(diào)用HTOASC子程序,顯示一個字節(jié)的16進制數(shù),后跟“H”的子程序。 解:DIPASCproc;入口參數(shù):AL要顯示的一個16進制數(shù)push cxpush dxpush axmov cl,4;轉(zhuǎn)換高位shr al,c

17、lcall HTOASCmov dl,al;顯示mov ah,2int 21hpop ax;轉(zhuǎn)換低位call HTOASCmov dl,al;顯示mov ah,2int 21hmov dl,H;顯示一個字母“H”mov ah,2int 21hpop dxpop cxretDIPASCendpHTOASCproc;將AL低4位表達的一位16進制數(shù)轉(zhuǎn)換為ASCII碼and al,0fhcmp al,9jbe htoasc1add al,37h;是0AH0FH,加37H轉(zhuǎn)換為ASCII碼ret;子程序返回htoasc1:add al,30h;是09,加30H轉(zhuǎn)換為ASCII碼ret;子程序返回HTO

18、ASCendp3.30寫一個子程序,根據(jù)入口參數(shù)AL=0、1、2,依次實現(xiàn)對大寫字母轉(zhuǎn)換成小寫、小寫轉(zhuǎn)換成大寫或大小字母互換。欲轉(zhuǎn)換的字符串在string中,用0表示結(jié)束 解:lucaseprocpush bxmov bx,offset stringcmp al,0je case0cmp al,1jz case1cmp al,2jz case2jmp donecase0:cmp byte ptr bx,0je donecmp byte ptr bx,Ajb next0cmp byte ptr bx,Zja next0add byte ptr bx,20hnext0:inc bxjmp case

19、0case1:cmp byte ptr bx,0je donecmp byte ptr bx,ajb next1cmp byte ptr bx,zja next1sub byte ptr bx,20hnext1:inc bxjmp case1case2:cmp byte ptr bx,0je donecmp byte ptr bx,Ajb next2cmp byte ptr bx,Zja next20add byte ptr bx,20hjmp next2next20:cmp byte ptr bx,ajb next2cmp byte ptr bx,zja next2sub byte ptr

20、bx,20hnext2:inc bxjmp case2done:pop bxretlucaseendp3.31子程序的參數(shù)傳遞有哪些方法?請簡單比較 解:(1)用寄存器傳遞參數(shù):最簡單和常用的參數(shù)傳遞方法是通過寄存器,只要把參數(shù)存于約定的寄存器中就可以了由于通用寄存器個數(shù)有限,這種方法對少量數(shù)據(jù)可以直接傳遞數(shù)值,而對大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護和恢復,帶有入口參數(shù)的寄存器可以保護、也可以不保護,但最好能夠保持一致(2)用共享變量傳遞參數(shù)子程序和主程序使用同一個變量名存取數(shù)據(jù)就是利用共享變量(全局變量)進行參數(shù)傳遞如果變量定義和使用不在同一個源程序中,

21、需要利用PUBLIC、EXTREN聲明如果主程序還要利用原來的變量值,則需要保護和恢復利用共享變量傳遞參數(shù),子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)(3)用堆棧傳遞參數(shù)參數(shù)傳遞還可以通過堆棧這個臨時存儲區(qū)。主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語言與高級語言混合編程時的常規(guī)方法3.32采用堆棧傳遞參數(shù)的一般方法是什么?為什么應該特別注意堆棧平衡問題。 解:方法:主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主

22、程序彈出堆棧取得它們注意:壓棧與彈棧必須要一一對應。3.33 編寫一個求32位數(shù)據(jù)補碼的子程序,通過寄存器傳遞入口參數(shù) 解:方法1:neg32proc;入口參數(shù):DX.AX32位有符號數(shù)neg ax;實現(xiàn)0DX.AX功能neg dx sbb dx,0;這條指令也可以用dec dx代替retneg32endp;出口參數(shù):DX.AX32位有符號數(shù)的補碼方法2:neg32proc;入口參數(shù):DX.AX32位有符號數(shù)not ax;實現(xiàn)DX.AX求反加1not dx add ax,1adc dx,0retneg32endp;出口參數(shù):DX.AX32位有符號數(shù)的補碼3.34 解:;數(shù)據(jù)段arraydb 1

23、2h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;數(shù)組countequ $-array;數(shù)組元素個數(shù)resultdb ?;校驗和;代碼段mov bx,offset array;BX數(shù)組的偏移地址mov cx,count;CX數(shù)組的元素個數(shù)call checksum;調(diào)用求和過程mov result,al;處理出口參數(shù)mov ax,4c00hint 21h;計算字節(jié)校驗和的通用過程;入口參數(shù):DS:BX數(shù)組的段地址:偏移地址,CX元素個數(shù);出口參數(shù):AL校驗和;說明:除AX/BX/CX外,不影響其他寄存器checksumprocxor al,al;累加器清0sum

24、:add al,bx;求和inc bx;指向下一個字節(jié)loop sumretchecksumendpend3.35 解:.model small.stack.datawdatadw 34abh.code.startupmov ax,wdatacall dispa.exit 0;dispaprocpush cxpush dxmov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cx

25、retdispaendp;dldispprocpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1:mov ah,2int 21hpop axretdldispendpend.model small.stack.datawdatadw 34abhwordtempdw ?.code.startupmov ax,wdatamov wordtemp,axcall dispa.exit 0;dispaprocpush cxpush dxmov cl,4mov dl,byte ptr wordtemp+1shr dl,clcall dldispmov

26、dl,byte ptr wordtemp+1and dl,0fhcall dldispmov dl,byte ptr wordtempshr dl,clcall dldispmov dl,byte ptr wordtempand dl,0fhcall dldisppop dxpop cxretdispaendp;dldispprocpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1:mov ah,2int 21hpop axretdldispendpend.model small.stack.datawdatadw 34abh.code.s

27、tartuppush wdatacall dispapop ax;add sp,2.exit 0;dispaprocpush bpmov bp,sppush axpush cxpush dxmov ax,bp+4mov cl,4mov dl,ahshr dl,clcall dldispmov dl,ahand dl,0fhcall dldispmov dl,alshr dl,clcall dldispmov dl,aland dl,0fhcall dldisppop dxpop cxpop axpop bpretdispaendp;dldispprocpush axor dl,30hcmp dl,39hjbe dldisp1add dl,7dldisp1:mov ah,2int 21hpop axretdldispendpend3.36 解: 如果利用共享變量傳遞函數(shù),且變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTERN聲明。3.37宏是如何定義、調(diào)用和展開的? 解: (1)宏定義由一對宏匯編偽指令MACRO和ENDM來完成,格式如下:宏名MACRO 形參表;宏定義體ENDM宏定義之后就可以使用它,即宏調(diào)用:宏名 實參表 (2)宏調(diào)用的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實體參數(shù);如果有多個參數(shù),應按

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論