版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、匯編語言程序設(shè)計(第四版)第4 章【課后答案】作者:日期:匯編語言程序設(shè)計第四版【課后習(xí)題答案】-囤禧植第4章基本匯編語言程序設(shè)計習(xí)題4.1例題4.2如果要求算術(shù)右移 8位,如何修改程序。 解答思路:首先由最高位字節(jié)向次低位字節(jié)傳送次低位字節(jié)向最低位字節(jié)傳送(共7次);再判最高位字節(jié)符號位,如為0,送00h到最高位字節(jié);如為 1,送fh到最高位字節(jié)。傳送可參考例題4.2不過應(yīng)從第一號字節(jié)送第零號字節(jié),最高位字節(jié)向次低位字節(jié)傳送;也可以用循環(huán)來完成:.model small.stack 256 .dataqvar dq 1234567887654321h .code .startupmov cx
2、,7mov si,1again: mov al, byte ptr qvarsimov byte ptr qvarsi-1,al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz: mov bl,0 done: mov byte ptr qvar7,bl.exit 0 end習(xí)題4.2例題4.2如果要求算術(shù)左移 7位,如何用移位指令實現(xiàn)。 解答思路:可設(shè)計外循環(huán)體為 8個字節(jié)左移一次,方法是:最低位字節(jié)算術(shù)左移一次,次低位字節(jié)至最高位字節(jié)依次帶 CF位循環(huán)左移一次(內(nèi)循環(huán)共 8次),外循環(huán)體控制執(zhí)行 7 次即可。.mod
3、el small.stack 256 .dataqvar dq 1234567887654321h.code.startup;外循環(huán)次數(shù);最低位字節(jié)送ax;最低位字節(jié)左移一次,其 d7移入CF位;內(nèi)循環(huán)次數(shù);高位字節(jié)依次左移P50mov dx, 7mov ax, byte ptr qvar0Ipp: shl ax, 1mov si, 1mov cx, 7again: rcl byte ptr qvarsi, 1inc siloop again dec dx jnz Ipp .exit 0.end習(xí)題4.3將AX寄存器中的16位數(shù)連續(xù)4位分成一組,共 4組,然后把這 4組數(shù)分別 放在 AL、BL
4、、CL和DL寄存器中。解答思路:設(shè)這四組從低位到高位分別放在AL、BL、CL和DL寄存器中。僅列出代碼段:mov bl, al ;將al中的兩組分開and al, 0fh ;屏蔽高四位后送 almov cl, 4;原al中的數(shù)據(jù)邏輯右移 4次送blshr bl, clmov dl, ah ;將ah中的兩組分開and dl, 0f0h ;屏蔽低高四位后送dlmov cl, 4;原ah中的數(shù)據(jù)邏輯右移 4次送dlshr dl, clmov cl, ah ;屏蔽高四位后送 cl and cl, 0fh習(xí)題4.4編寫一個程序,把從鍵盤輸入的一個小寫字母用大寫字母顯示出來。 解答;從鍵盤輸入,出口 :a
5、l存鍵值;判鍵值是小寫字母?;是小寫字母轉(zhuǎn)換為大寫字母;顯示getkey: mov ah, 1 int 21h cmp al, 'a' jb getkay cmp al, 'z' ja getkay sub al,20h mov dl,al mov ah, 02h int 21h習(xí)題4.5已知用于LED數(shù)碼管顯示的代碼表為:LEDtableDB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB 80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示0 9、A F這16個數(shù)碼的顯示代碼?,F(xiàn)編寫一個程序?qū)崿F(xiàn)將ledn
6、um中的一個數(shù)字(0 9、A F)轉(zhuǎn)換成對應(yīng)的 LED顯示代碼。解答 .model small .stack 256 .dataLEDtable DB 0c0h , 0f9h , 0a4h,0b0h,99h,92h , 82h , 0f8hDB 80h, 90h, 88h, 83h, 0c6h, 0clh、86h,8eh lednum DB ? .code .startup mov bx, offset LEDtable mov al, lednum xlat; al中存有對應(yīng)的 LED顯示代碼.exit 0 end習(xí)題4.6編制一個程序,把變量 bufX和bufY中較大者存入bufZ ;若兩
7、者相等,則把 其中之一存入bufZ中。假設(shè)變量存放的是8位無符號數(shù)。解答.model small .stack 256 .data bu僅db ?bufYdb ?bufzdb ?.code .startup mov al, bufX mov bl, bufY cmp al,bl ja next mov bufZ, bl jmp done next: mov bufZ, al done: .exit 0 end習(xí)題4.7設(shè)變量bufX為有符號16位數(shù),請將它的符號狀態(tài)保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存-1 (ffh)。編寫該程序。解答.model small.st
8、ack .data bufXdw -7signXdb ?.code .startup cmp bufX,0 ;test bufX,80h jl next;jnz nextmov signX,0 jmp done next:mov signX,-1done:.exit 0end習(xí)題4.8bufX、bufY和bufZ是3個有符號16進制數(shù),編寫一個比較相等關(guān)系的程序: (1)如果這3個數(shù)都不相等,則顯示 0;(2)如果這3個數(shù)中有兩個數(shù)相等,則顯示 1;(3)如果這3個數(shù)都相等,則顯示 2。 解答.model small .stack 256 .data bu僅dw ?bufYdw ?bufzdw
9、 ?.code .startup mov ax, bufX mov bx, bufY mov cx, bufZ mov dl, '0' cmp ax,bx jnz next1 inc dl next1: cmp ax,cx jnz next2 inc dl next2: cmp bx,cx jnz next3 inc dl next3: cmp dl, ' 3' jb next4 mov dl, ' 2' next4: mov ah,02h ;顯示int 21h .exit 0 end習(xí)題4.9例題4.8內(nèi)外循環(huán)次數(shù)共是多少?如果要求按從大到小排
10、序,程序如何修改?解答外循環(huán)次數(shù)是:count-1次 (19次)內(nèi)循環(huán)次數(shù)是:(count-1)!次(19!次)內(nèi)外循環(huán)次數(shù)共是count-1 + (count-1) !次,即19+19!次習(xí)題4.10串操作指令常要利用循環(huán)結(jié)構(gòu),現(xiàn)在不用串操作指令實現(xiàn)字符串string1內(nèi)容傳送到字符串 string2,字符長度為count。解答.model small.stack 256 .datastring1 db 'good morning!'len = $-string1string2 db len dup(?).code.startupmov cx, len ;字符數(shù)mov si,
11、 offset string1 ; 源指針mov di, offset string2 ;目標指針again:mov al, si;送個字符mov di, al inc siinc diloop again;cx=cx-1,cx=0時退出循環(huán).exit 0 end習(xí)題4.11不用串操作指令求主存0040h : 0開始的一個64KB物理段中共有多少個空格?解答這里僅列出主程序段:mov ax,0040h;送段地址mov ds, axxor si, si ;偏移量地址xor cx, cx;計數(shù)(循環(huán)次數(shù))xor dx, dx;空格計數(shù)器清零again:cmp si, 20h;與空格的 ASCII
12、碼比較jne next;不是空格,轉(zhuǎn)inc dx;是空格,空格數(shù)加1next:inc si;修改地址指針loop again ; cx=cx-1,如 cx=0 退出循環(huán).exit 0, end習(xí)題4.12編程實現(xiàn)把鍵入的一個字符,用二進制形式(0 / 1)顯示出它的 ASCII代碼值。解答.model small.stack 256 .datastri1 db 'please input',0dh,0ah,'$'.code.startupmov dx,offset stri1mov ah,09hint 21hmov ah, 01hint 21hmov cx, 8
13、 again: xor dl,dlshl al, 1adc dl, '0'mov ah,02hint 21hloop again.exit 0 end習(xí)題4.13編寫程序,要求從鍵盤接收一個數(shù)bellN (0 9),然后響鈴bellN次。解答.model small.stack .data stri1 db 'please input number:1-9',0dh,0ah,'$'.code.startupagain: mov dx,offset stri1 ;顯示 stri1,提示輸入mov ah,09hint 21hmov ah,01h ;調(diào)
14、用輸入一個字符int 21h;輸入一個字符存在 al中cmp al, '1'判該字符,如不在-''9'jb again;重新輸入cmp al, '9'ja again / and al,0fh mov cl, alxor ch,ch abc:mov dl, 07hmov ah, 02h;在-''9'屏蔽高4位;振鈴次數(shù)送cx;調(diào)用一次振鈴int 21hloop abc.exit 0 end習(xí)題4.14編寫程序,將一個包含有20個有符號數(shù)據(jù)的數(shù)組arrayM分成兩個數(shù)組:正數(shù)數(shù)組arrayP和負數(shù)數(shù)組arrayN ,
15、并分別把這兩個數(shù)組中的數(shù)據(jù)個數(shù)顯示出來。解答.model smallinclude io.inc.stack.dataarrayM db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8;源數(shù)組arrayP db 20 dup(?);正數(shù)數(shù)組arrayN db 20 dup(?);負數(shù)數(shù)組dispP db 'Plus Number: ','$'dispN db 0dh,0ah,'Negs Number: ','$'.code.startup mov cx, 20 xor bx, bx
16、 xor si, si;源數(shù)組元素數(shù);設(shè)bh為正數(shù)個數(shù),bl為負數(shù)個數(shù),均清零;源數(shù)組地址位移量again:;循環(huán)20次mov ax, arrayMsi ; 取 個元素cmp ax,0jl Neg inc bhjmp next Neg:inc blnext:inc siloop again mov ah, 09h;判正數(shù);是,正數(shù)個數(shù)加 1;否,負數(shù)個數(shù)加 1;修改位移量;循環(huán)次數(shù)減1;調(diào)用顯示字符串功能mov dx, offset dispP ;顯示個數(shù) int 21hmov al,bhcall dispuib mov ah, 09h;調(diào)用I/O子程序庫中的子程序;調(diào)用顯示字符串功能mov
17、dx, offset dispN ;顯示個數(shù)int 21h mov al,bl call dispuib ;調(diào)用I/O子程序庫中的子程序 .exit 0 end習(xí)題4.15編寫計算100個正整數(shù)之和的程序。如果和不超過16位字的范圍(65535),則保存其和到 wordsum,如超過則顯示 oveflow/解答.model small .stack .data num equ 100 wlist dw num dup(?) wordsum dw ? error db 'overflow. $'.code .startup mov bx,offset wlist mov cx,n
18、um xor ax,ax again: add ax,bx jc next inc bx inc bx loop again mov bx,ax jmp done next:mov dx,offset errormov ah,9 int 21h done:.exit 0end習(xí)題4.16編程判斷主存 0070h: 0開始的1KB中有無字符串 DEBUG。這是一個字符 串包含的問題,可以采用逐個向后比較的簡單算法。解答.model small .stack .datadisp1 db 'There is DEBUG in the aera! ,0dh,0ah,' $'di
19、sp2 db 'There is no DEBUG in the aera! ,0dh,0ah,' $'.code .startupmov ax, 0070h;送段地址mov ds, ax xor si, si ;地址指針清零 mov cx,1024 cmp si,'D'與叱較jne next ;不是,轉(zhuǎn) inc si;是,地址增 1cmp si, 'E'同上jne next inc si cmp si, 'B' jne next inc si cmp si, 'U' jne next inc si cmp
20、 si, 'G' je yes ;是DEBUGSnext:inc si;不是,地址增 1loop again;循環(huán)no:mov dx, offset disp2 ;沒找到,顯示 disp2jmp dspyes: mov dx, offset disp1 ; 找至L 顯示 disp1 dsp: mov ah, 09h int 21h .exit 0 end習(xí)題4.17編程把一個16位無符號二進制數(shù)轉(zhuǎn)換成為用 8421BCD碼表示的5位十進制 數(shù)。轉(zhuǎn)換算法可以是:用二進制數(shù)除以10000,商為 萬位”,再用余數(shù)除以1000,得到 千位”;依次用余數(shù)除以 100、10和1,得到 百位
21、“、十位“和 個位”。解答.model small.stack 256 .data var dw 3546 dbcd db 5 dup(?).code.startup mov ax, var mov bx, 10000 mov cl, 10 xor si, si xor dx, dxagain:div bxmov dbcdsi, al inc si xchg ax, bx div cl xchg ax, bx cmp si,5jnz again.exit 0end習(xí)題4.18沒有。習(xí)題 4.19-習(xí)題 4.20-習(xí)題 4.21-PUSH指令、出口為習(xí)題4.22過程定義的一般格式是怎樣的?子程序
22、入口為什么常有 什么有POP指令?下面的程序段有什么不妥嗎?若有,請改正: crazy PROCpush ax xor ax,ax xor dx,dxagain: add ax,bxadc dx,0inc bxinc bxloop againretENDP crazy解答crazy PROC;crazy PROCpush ax;xor ax,ax; xor ax,axxor dx,dx; xor dx,dxagain: add ax,bx;again: add ax,bxadc dx,0;adc dx,0inc bx; inc bxinc bx; inc bxloop again; loop
23、againret;retENDP crazy;crazy ENDP習(xí)題4.23子程序的參數(shù)傳遞有哪些方法,請簡單比較。解答寄存器、共享變量(公共存儲單元)、堆棧用寄存器傳遞參數(shù)是把參數(shù)存于約定的寄存器中,這種方法簡單易行,經(jīng)常采用;用變量傳遞參數(shù)是主程序與被調(diào)用過程直接用同一個變量名訪問傳遞的參數(shù),就是利用變 量傳遞參數(shù)。如果調(diào)用程序與被調(diào)用程序在同一個源程序文件中,只要設(shè)置好數(shù)據(jù)段寄存 器DS,則子程序與主程序訪問變量的形式相同,也就是它們共享數(shù)據(jù)段的變量,調(diào)用程序 與被調(diào)用程序不在同一個源文件中,必須利用public/extern進行聲明,才能用變量傳遞參數(shù),利用變量傳遞參數(shù),過程的通用性
24、比較差,然而,在多個程序段間,尤其在不同程序 的模塊間,利用全局變量共享數(shù)據(jù)也是一種常見的參數(shù)傳遞方法;用堆棧傳遞參數(shù)是主程序?qū)⒆映绦虻娜肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程 序?qū)⒊隹趬喝攵褩?,主程序彈出堆棧取得它們。?xí)題4.24采用堆棧傳遞參數(shù)的一般方法是什么,為什么應(yīng)該特別注意堆棧平衡問題。 解答采用堆棧傳遞參數(shù)的一般方法是主程序?qū)⒆映绦虻娜肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù)子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們。因為堆棧采用先進后出原則存取,而且返回地址和保護的寄存器等也要存于堆棧,所以要特別注意堆棧平衡問題。習(xí)題4.25什么是子程序的嵌套、遞歸和重入?解答子程序中
25、又調(diào)用子程序就形成子程序嵌套。子程序中直接或間接調(diào)用該子程序本身就形成子程序遞歸。子程序的重入是指子程序被中斷后又被中斷服務(wù)程序所調(diào)用,能夠重入的子程序稱為可重 入子程序。習(xí)題4.26將例題4.7的大寫轉(zhuǎn)換為小寫字母寫成過程,利用 AL作為入口、出口參數(shù)完 成。解答.model small.stack 256.datastdng db 'HeLLO eveRyboDy ! ' , 0 .code.startupmov bx, offset atringagain: mov al, bxcall chan;調(diào)用過程mov bx , alnext: inc bxjmp againd
26、one: .exit 0chan proc;大寫轉(zhuǎn)換為小寫字母的過程or al, al jz done cmp al,'A'jb next cmp al, 'Z' ja next or al, 20h retchan endp end習(xí)題4.27請按如下子程序說明編寫過程:;子程序功能:把用 ASCII碼表示的兩位十進制數(shù)轉(zhuǎn)換為對應(yīng)二進制數(shù);入口參數(shù):DH=十位數(shù)的 ASCII碼,DL=j位數(shù)的 ASCII碼;出口參數(shù):AL=對應(yīng)的二進制數(shù)解答astob proc and dh, 0fh ;十位數(shù)的 ASCII碼轉(zhuǎn)為二進制數(shù) mov al, dh mul 10;
27、 al= 10*dhand dl, 0fh ;個位數(shù)的 ASCII碼轉(zhuǎn)為二進制數(shù) add al, dl ; al= 10*dh + dl ret astob endp習(xí)題4.28寫一個子程序,根據(jù)入口參數(shù) AL=0/1/2 ,分別實現(xiàn)對大寫字母轉(zhuǎn)換成小寫、 小寫轉(zhuǎn)換成大寫或大小寫字母互換。欲轉(zhuǎn)換的字符串在string中,用0表示結(jié)束。解答Change procPush bx;保護 bxxor bx, bx;位移量清零cmp al,0;根據(jù)入口參數(shù) AL=0/1/2 ,分別處理jz chan_0 dec al jz chan_1 dec al jz chan_2 jmp done chan_0:
28、 mov al,stringbx;實現(xiàn)對大寫字母轉(zhuǎn)換成小寫cmp al,0 jz donecmp al, ' A'是大寫字母 jb next0 cmp al, ' Z ;是大寫字母 ja next0 add al, 20h;轉(zhuǎn)換mov stringbx, alnext0:inc bx1,指向下一字母chanl:;實現(xiàn)對小寫字母轉(zhuǎn)換成大寫jmp chan_0 mov al,stringbxcmp al,0 jz done cmp al, 'a'是大寫字母jb nextl cmp al, ' z'是大寫字母ja nextl sub al, 2
29、0h;轉(zhuǎn)換mov stringbx, alnext0:inc bx;位移量加1,指向下一字母jmp chan_1chan_2: mov al,stringbx;實現(xiàn)對大寫字母轉(zhuǎn)換成小寫cmp al,0 jz donecmp al, ' A'是大寫字母jb next2 cmp al, ' Z ;是大寫字母 ja next20 add al, 20h;轉(zhuǎn)換jmp next2next20: cmp al, a'是大寫字母 jb next2 cmp al, ' z'是大寫字母ja next2 sub al, 20h;轉(zhuǎn)換mov stringbx, aln
30、ext2:inc bx;位移量加1,指向下一字母jmp chan_2 done:pop bx;恢復(fù) bxret change endp習(xí)題4.29編制一個子程序把一個 16位二進制數(shù)用十六進制形式在屏幕上顯示出來,分 別運用如下3種參數(shù)傳遞方法,并用一個主程序驗證它。(1)采用AX寄存器傳遞這個16位二進制數(shù)采用wordTEMP變量傳遞這個16位二進制數(shù)(3)采用堆棧方法傳遞這個16位二進制數(shù)解答(1)采用AX寄存器傳遞這個16位二進制數(shù).model small .stack .datawdata dw 34abh.code.startup mov ax,wdata call dispa .e
31、xit 0;dispa procpush cx push dx mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx retdispa endp ;dldisp procpush ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7 dldisp1: mov ah,2int 21hpop ax retdldis
32、p endp end采用wordTEMP變量傳遞這個16位二進制數(shù) .model small .stack.datawdata dw 34abh4 wordtemp dw ?.code.startup mov ax,wdata mov wordtemp,ax call dispa .exit 0;dispa procpush cx push dx mov cl,4 mov dl,byte ptr wordtemp+1 shr dl,cl call dldispmov dl,byte ptr wordtemp+1and dl,0fh call dldisp mov dl,byte ptr wor
33、dtemp shr dl,cl call dldisp mov dl,byte ptr wordtemp and dl,0fh call dldisp pop dx pop cx retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2 int 21hpop ax retdldisp endp end(3)采用堆棧方法傳遞這個16位二進制數(shù).model small.stack.datawdata dw 34abh.code .startup push wdata c
34、all dispa pop ax;add sp,2.exit 0;dispa proc push bp mov bp,sp push ax push cx push dx mov ax,bp+4 mov cl,4 mov dl,ah shr dl,cl call dldisp mov dl,ah and dl,0fh call dldisp mov dl,al shr dl,cl call dldisp mov dl,al and dl,0fh call dldisp pop dx pop cx pop ax pop bp retdispa endp ;dldisp proc push ax or dl,30h cmp dl,39h jbe dldisp1 add dl,7dldisp1: mov ah,2int 21h pop
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年軟件許可合同履約責(zé)任保證
- 2025年度屋面綠化與箱涵施工一體化合同細則3篇
- 2024年綠色出行汽車指標租憑及維護合同范本2篇
- 2024年度商業(yè)貸款擔保答辯狀制作手冊3篇
- 二零二五年養(yǎng)老服務(wù)崗位聘任與健康管理合作協(xié)議3篇
- 2025年度圖書展覽展示合作合同3篇
- 2024年租賃合同違約責(zé)任及其賠償機制
- 大班春季國旗下講話發(fā)言稿范文
- 關(guān)于春節(jié)拜年日記模板合集5篇
- 2025年度民辦學(xué)校教師培訓(xùn)及聘用綜合合同3篇
- 2025年1月普通高等學(xué)校招生全國統(tǒng)一考試適應(yīng)性測試(八省聯(lián)考)英語試題
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之21:“7支持-7.5成文信息”(雷澤佳編制-2025B0)
- 2024-2025學(xué)年冀人版五年級第一學(xué)期期末科學(xué)試題(含答案)
- 部編版五年級語文上冊快樂讀書吧測試題及答案
- 2023-2024年6月廣東省普通高中學(xué)業(yè)水平考試化學(xué)試題及答案
- GIS組合電器概述
- 黑龍江省哈爾濱市香坊區(qū)2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)試題
- 《S7-1500PLC應(yīng)用技術(shù)》 課件 第1、2章 PLC概述、S7-1500 PLC硬件系統(tǒng)
- 施工進度計劃橫道圖含資源動態(tài)圖(道路、橋梁、排水、防護工程)
- 助念往生儀規(guī)
- Les Miserables 音樂劇《悲慘世界》歌詞
評論
0/150
提交評論