版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、ch03 匯編語言程序設(shè)計習題參考答案ch03 匯編語言程序設(shè)計習題與思考題1下列語句在存儲器中分別為變量分配多少字節(jié)空間?并畫出存儲空間的分配圖。var1 db10,2var2dw5 dup(?),0var3dbhow are you?,3 dup(1,2)var4dd-1,1,0解答:字節(jié)空間-var1:2;var2:12;var3:20;var4:12。存儲空間的分配圖:ds:0000 0a 02 00 00 00 00 00 0000 00 00 00 00 00 48 4f0010 57 20 20 41 52 45 20 2059 4f 55 3f 01 02 01 020020
2、01 02 ff ff ff ff 01 0000 00 00 00 00 002假定var1和var2為字變量,lab為標號,試指出下列指令的錯誤之處。(1)addvar1,var2(2)subal,var1(3)jmplabcx(4)jnzvar1 (5) mov 1000h,100 (6)shl al, 4 解答:(1)兩個操作數(shù)中至少有一個為寄存器;(2)al為字節(jié),var1為字變量,不匹配;(3)中不能用cx,lab為標號,非變量;(4)轉(zhuǎn)向地址應(yīng)為標號,不能是變量;(5)目的操作數(shù)的類型不確定;(6)shl指令中,當所移位數(shù)超過1時,必須用cl或cx來取代所移位數(shù)。3對于下面的符號
3、定義,指出下列指令的錯誤。a1db?a2db10k1equ1024(1)movk1,ax(2)mova1,ax(3)cmpa1,a2(4)k1equ2048解答:(1)k1為常量,不能用mov指令賦值;(2)a1為字節(jié),ax為字變量,不匹配;(3)a1未定義,無法做比較指令;(4)k1重新賦值前,必須用purge釋放。4數(shù)據(jù)定義語句如下所示: first db 90h,5fh,6eh,69h second db 5 dup(?) third db 5 dup(?)自first單元開始存放的是一個四字節(jié)的十六進制數(shù)(低位字節(jié)在前),要求:編一段程序?qū)⑦@個數(shù)左移兩位后存放到自second開始的單元
4、,右移兩位后存放到自third開始的單元。(注意保留移出部分)解答:data segmentfirst db 90h,5fh,6eh,69h second db 5 dup(?) third db 5 dup(?) data ends code segmentassume cs:code,ds:data start:mov ax,datamov ds,axlea si,firstlea di,secondmov cx,2clc;左移2位mov ax,si;ax=5f90h為低十六位數(shù)據(jù)inc siinc simov dx,si;dx=696eh為高十六位數(shù)據(jù)push dx;保存原有的高十六位數(shù)
5、據(jù) push ax;保存原有的低十六位數(shù)據(jù)rol dx,cl;將高位數(shù)據(jù)不帶進位循環(huán)左移兩位,即高2位數(shù)據(jù)在dl的低2位 and dl,03h;讓dl中僅保存移出的高2位數(shù)據(jù) mov di+4 ,dl;將移出的高2位數(shù)據(jù)放入second中的最高單元中 rol ax,cl;將低位數(shù)據(jù)不帶進位循環(huán)左移兩位,即ax的高2位在al的低2位 and al,03h;讓al中僅保存移出的ax高2位數(shù)據(jù) mov bl ,al;將al中的數(shù)據(jù)放入bl中保存 pop ax;彈出原有的低十六位數(shù)據(jù) pop dx;彈出原有的高十六位數(shù)據(jù) shl dx,cl;將高位數(shù)據(jù)算術(shù)邏輯左移2位shl ax,cl;將低位數(shù)據(jù)算術(shù)
6、邏輯左移2位or dl,bl;將ax中移出的高2位數(shù)據(jù)放入dx的低2位mov di ,axmov di+2 ,dx;右移2位lea si,firstlea di,thirdmov cx,2clcmov ax,si;ax=5f90h為低十六位數(shù)據(jù)inc siinc simov dx,si;dx=696eh為高十六位數(shù)據(jù)push dx;保存原有的高十六位數(shù)據(jù) push ax;保存原有的低十六位數(shù)據(jù)ror ax,cl;將低位數(shù)據(jù)不帶進位循環(huán)右移兩位,即低2位數(shù)據(jù)在ah的高2位 and ah,0c0h;讓ah中僅保存移出的低2位數(shù)據(jù)push cxmov cx,6shr ah,clpop cx mov
7、di ,ah;將移出的低2位數(shù)據(jù)放入third中的最低單元中 ror dx,cl;將低位數(shù)據(jù)不帶進位循環(huán)左移兩位,即ax的高2位在al的低2位 and dh,0c0h;讓dh中僅保存移出的dx低2位數(shù)據(jù) mov bl ,dh;將dh中的數(shù)據(jù)放入bl中保存 pop ax;彈出原有的低十六位數(shù)據(jù) pop dx;彈出原有的高十六位數(shù)據(jù) shr dx,cl;將高位數(shù)據(jù)算術(shù)邏輯左移2位shr ax,cl;將低位數(shù)據(jù)算術(shù)邏輯左移2位or ah,bl;將dx中移出的低2位數(shù)據(jù)放入ax的高2位mov di+1 ,axmov di+3 ,dxmov ah,4chint 21h code ends end sta
8、rt5(14)在當前數(shù)據(jù)區(qū)從400h開始的256個單元中存放著一組數(shù)據(jù),試編程序?qū)⑺鼈冺樞虬嵋频綇腶000h開始的順序256個單元中。解答:data segment org 400hdat1 db .;256 dup (?) org 0a000hdat2 db .;256 dup (?)data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax;ch3-14 lea si,dat1 lea di,dat2 mov cx,128a
9、gain: mov al,si mov di,al inc si inc di loop again;ch3-15,將兩個數(shù)據(jù)塊逐個單元進行比較,若有錯bl=00h,否則bl=ffh lea si,dat1 lea di,dat2 mov cx,128next: mov al,si mov bl,di cmp al,bl jnz error inc si inc di loop next mov bl,0ffh jmp exiterror: mov bl,00hexit: mov ax,4c00h int 21hcode endsend start6試編程序?qū)斍皵?shù)據(jù)區(qū)從buff開始的4k個單
10、元中均寫入55h,并逐個單元讀出比較,看寫入的與讀出的是否一致。若全對,則將err單元置0h;如果有錯,則將err單元置ffh。解答:data segmentbuff db 1000h dup(?)err db ?data ends;code segment assume cs:code,ds:datastart:mov ax,datamov ds,ax;將55h依次放入buff開始的4k個單元lea si,buffmov cx,1000hmov al,55hntxt:mov si,alinc siloop next;取出與55h比較,全對則err=0,否則err=ffhlea di,buff
11、lea si,errmov cx,1000hnext1:mov al,diinc dicmp al,55hjnz error;若有一個不同,即置err=ffhloop next1mov al,00hmov si,al;全比較完無錯,則置err=0jmp exiterror:mov al,0ffhmov si,al;返回dosexit:mov ah,4chint 21hcode endsend startend7在上題中,如果發(fā)現(xiàn)有錯時,要求在err單元中存放出錯的數(shù)據(jù)個數(shù),則程序該如何修改?解答:data segmentbuff db 1000h dup(?)err dw ?data ends
12、;code segment assume cs:code,ds:datastart:mov ax,datamov ds,ax;將55h依次放入buff開始的4k個單元lea si,buffmov cx,1000hmov al,55hntxt:mov si,alinc siloop next;取出與55h比較lea di,bufflea si,errmov dx,0000hmov cx,1000hnext1:mov al,diinc dicmp al,55hjz next2;若相同,則比較下一個inc dx;否則將放出錯個數(shù)的dx加1next2:loop next1mov si,dx;exit:
13、mov ah,4chint 21hcode endsend startend8試編寫程序段,完成將數(shù)據(jù)區(qū)從0100h開始的一串字節(jié)數(shù)據(jù)逐個從f0h端口輸出,已知數(shù)據(jù)串以0ah為結(jié)束符。解答:data segmentorg 0100hdata1 db n dup(?)data ends;code segment assume cs:code,ds:datastart:mov ax,datamov ds,ax;將data1數(shù)據(jù)串中的數(shù)據(jù)取出并從f0h端口中輸出lea si,data1mov cx,nmov bl,0ahntxt:mov al,sicmp al,bljz exitout 0f0h,a
14、linc siloop next;返回dosexit:mov ah,4chint 21hcode endsend startend9(24)內(nèi)存中以first和second開始的單元中分別存放著兩個4位用壓縮bcd碼表示的十進制數(shù), 低位在前。編程序求這兩個數(shù)的和,仍用壓縮bcd碼表示, 并存到以third開始的單元。解答:data segmentfirst dw 3412hsecond dw 7856hthird db ?,?,?data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:d
15、atastart: mov ax,data mov ds,ax lea si,first lea di,second lea bx,third mov cx,2 clcagain: mov al,byte ptrsi mov dl,byte ptrdi adc al,dl daa mov byte ptrbx,al inc si inc di inc bx loop again jc aa mov byte ptrbx,0 jmp exitaa: mov byte ptrbx,1exit: mov ax,4c00h int 21hcode endsend start10(27)設(shè)字變量單元a、
16、b、c存放有三個數(shù),若三個數(shù)都不為零,則求三個數(shù)的和,存放在d中;若有一個為零,則將其余兩個也清零,試編寫程序。解答:data segmenta db ?b db ?c db ?d dw ?data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,axlea si,alea di,dmov al,sicmp al,00jz zeroadc dx,allea si,bmov al,sicmp al,00jz zeroadc dx,al
17、lea si,cmov al,sicmp al,00jz zeroadc dx,almov di,dxjmp exitzero:mov al,0mov a,almov b,almov c,al;exit: mov ax,4c00h int 21hcode endsend start11(16)試編程序,統(tǒng)計由table開始的128個單元中所存放的字符“a”的個數(shù),并將結(jié)果存放在dx中。解答:data segmenttable db x1,x2,.x128data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss
18、:stack,es:datastart: mov ax,data mov ds,ax lea si,table mov dx,0 mov cx,128again: mov al,si cmp al,'a' jnz next inc dxnext: inc si loop again mov ax,4c00h int 21hcode endsend start12試編制一個匯編語言程序,求出首地址為data的1000個字數(shù)組中的最小偶數(shù),并把它存放于min單元中。解答:data segmentarray dw x1,x2,.x1000array_even dw 1000 dup(
19、?)min dw ?max dw ?data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax;將數(shù)組中的偶數(shù)放入array_even中l(wèi)ea si,arraylea di,array_even mov cx,1000again: mov ax,si test ax,01hjnz nextmov di,axinc diinc dinext: inc siinc siloop again;找出array_even中的最大數(shù)lea
20、si,array_evenmov cx,999mov ax,simov bx,axinc siinc sinext:cmp ax,sijae llmov ax,sill:inc siinc siloop nextmov max,ax;找出array_even中的最小數(shù)(第13題增加的部分)lea si,array_evenmov cx,999mov ax,simov bx,axinc siinc sinext:cmp ax,sijbe ssmov ax,siss:inc siinc siloop nextmov min,ax;返回dos mov ax,4c00h int 21hcode end
21、send start13在上題中,如果要求同時找出最大和最小的偶數(shù),并把它們分別存放于max和min單元中,試完成程序。解答:略(見第12題)。14(28)在data字數(shù)組中存放有100h個16位補碼數(shù),試編寫一程序求它們的平均值,放在ax中,并求出數(shù)組中有多少個數(shù)小于平均值,將結(jié)果存于bx中。解答:data segmentdat dw x1,x2,.x256data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax;將數(shù)組中的
22、100h個數(shù)求和后求平均值lea si,dat mov cx,100hclcmov bx,0000mov dx,0000again: mov ax,si add bx,axjnc nextadc dx,1next: inc siinc siloop againmov cx,100hmov ax,bxdiv cx;找出dat中的小于平均值的個數(shù)lea si,datmov cx,100hmov dx,0000hagain0:mov bx,sicmp bx,ax;與平均值ax比較,大于等于則轉(zhuǎn)next0,否則將讀數(shù)器dx加1jge next0inc dxnext0:inc siinc siloop
23、again0mov bx,dx;返回dos mov ax,4c00h int 21hcode endsend start15(17)編寫一個子程序,對al中的數(shù)據(jù)進行偶校驗,并將經(jīng)過校驗的結(jié)果放回al中。 解答:data segmentcount equ 7data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax push ax mov dx,0 mov cx,countagain: rcr al,1 jnc l inc dx
24、l: loop again pop ax test dx,01 jz exit or al,80exit: mov ax,4c00h int 21h;another methord jp exit or al,80hexit: mov ax,4c00h int 21hcode endsend start16(18)利用上題的予程序,對data開始的256個單元的數(shù)據(jù)加上偶校驗,試編程序。解答:data segmentdat db .;256 dup (?)result db .;256 dup (?)num equ 256count equ 7data ends;stack segmentst
25、ack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax lea si,dat lea di,result mov cx,numnext: mov al,si call sub1 mov di,al;mov si,al inc si inc di loop next mov ax,4c00h int 21hsub1 proc push ax mov dx,0 mov cx,countagain: rcr al,1 jnc l inc dxl: loop again pop a
26、x test dx,01 jz quit or al,80hquit: retsub1 endpcode endsend start17(19)試編寫程序?qū)崿F(xiàn)將鍵盤輸入的小寫字母轉(zhuǎn)換成大寫字母并輸出。解答:data segmentmess db 'the input is not correct.',0dh,0ah,'$'data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,axnext: mov
27、 ah,01h int 21h cmp al,'q' jz exit cmp al,'a' jb error cmp al,'z' ja error sub al,20h mov ah,02h mov dl,al int 21h jmp nexterror: mov ah,09h lea dx,mess int 21h jmp nextexit: mov ax,4c00h int 21hcode endsend start18從鍵盤接收20個字符,按鍵入順序查找最大的字符,并顯示輸出。解答:data segmentdat db 20 dup(?)
28、data ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax;從鍵盤接收20個字符,并送dat中保存lea si,datmov cx,20next:mov ah,01hint 21hmov si,alinc siloop next;比較20個字符中的最大字符,并放入al中 mov cx,19lea si,datmov al,siinc sinext1:cmp al,sijae llmov al,sill:inc siloop ne
29、xt1;將最大的字符的ascii碼由al送dl顯示mov dl,almov ah,2hint 21h;返回dos mov ax,4c00h int 21hcode endsend start19(29)編寫匯編程序,接收從鍵盤輸入的10個數(shù),輸入回車符表示結(jié)束,然后將這些數(shù)加密后存于buff緩沖區(qū)中。加密表為:輸入數(shù)字:0,1,2,3,4,5,6,7,8,9;密碼數(shù)字:7,5,9,1,3,6,8,0,2,4解答:data segmentbuff db 10 dup(?)table db 7,5,9,1,3,6,8,0,2,4data ends;stack segmentstack ends;c
30、ode segmentassume ds:data,cs:code,ss:stack,es:datastart: mov ax,data mov ds,ax;lea di,buffnext:mov ah,01hint 21h;從鍵盤上接收單個字符cmp al,0ah;與0ah比,判是否要結(jié)束jz exitsub al,30h;否則,將09的ascii碼轉(zhuǎn)換為十進制數(shù)lea bx,tablexlat;用查表指令進行加密mov di,alinc dijmp next;退出并返回dosexit: mov ax,4c00h int 21hcode endsend start20(23)有一個100個字
31、節(jié)的數(shù)據(jù)表,表內(nèi)元素已按從大到小的順序排列好,現(xiàn)給定一元素,試編程序在表內(nèi)查找,若表內(nèi)已有此元素,則結(jié)束;否則,按順序?qū)⒋嗽夭迦氡碇羞m當?shù)奈恢茫⑿薷谋黹L。解答:;調(diào)試時用了十個數(shù)據(jù),本程序已通過調(diào)試data segmenttable_len db ?x db 99htable db 98h,90h,80h,70h,60h,50h,40h,30h,20h,10h;x1,x2,.,x100count equ $-tabledata ends;stack segmentstack ends;code segmentassume ds:data,cs:code,ss:stack,es:datast
32、art: mov ax,data mov ds,ax;將數(shù)組中的100h個數(shù)求和后求平均值mov dx,0000lea si,tablemov cx,countmov al,x;假設(shè)x為給定元素;在table中是否有元素xagain:mov bl,sicmp bl,aljz exitinc siloop again;x元素不在表中,將x插入表中適當位置lea si,tablemov di,si;di為表的末地址add di,count-1mov cx,countagain0:mov bl,sicmp bl,alja next0bb:cmp di,sijz aamov ah,dimov di+1,ah;將比x小的元素后移一位
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度掛車司機運輸合同違約責任與賠償合同
- 2025年度網(wǎng)絡(luò)安全行業(yè)競業(yè)限制協(xié)議生效細則及數(shù)據(jù)隱私
- 二零二五年度創(chuàng)業(yè)公司股權(quán)分配及股權(quán)激勵協(xié)議
- 2025年度消防電梯采購與應(yīng)急救援系統(tǒng)配套合同
- 2025年度水果種植基地農(nóng)業(yè)保險合同
- 2025年度綠色能源股權(quán)合作開發(fā)合同
- 施工現(xiàn)場施工防傳染病制度
- 施工進度管理及控制制度
- 應(yīng)對突發(fā)事件應(yīng)急預(yù)案
- 防凍防雪應(yīng)急預(yù)案
- 醫(yī)院消防安全培訓課件
- 質(zhì)保管理制度
- 《00541語言學概論》自考復習題庫(含答案)
- 2025年機關(guān)工會個人工作計劃
- 2024年全國卷新課標1高考英語試題及答案
- 華為經(jīng)營管理-華為激勵機制(6版)
- 江蘇省南京市、鹽城市2023-2024學年高三上學期期末調(diào)研測試+英語+ 含答案
- 2024護理不良事件分析
- 光伏項目的投資估算設(shè)計概算以及財務(wù)評價介紹
- 2024新版《藥品管理法》培訓課件
- 干燥綜合征診斷及治療指南
評論
0/150
提交評論