新版匯編語(yǔ)言程序設(shè)計(jì)【課后習(xí)題答案】錢(qián)曉捷主編電子工業(yè)出版社.doc
《新版匯編語(yǔ)言程序設(shè)計(jì)【課后習(xí)題答案】錢(qián)曉捷主編電子工業(yè)出版社.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《新版匯編語(yǔ)言程序設(shè)計(jì)【課后習(xí)題答案】錢(qián)曉捷主編電子工業(yè)出版社.doc(21頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
新版匯編語(yǔ)言程序設(shè)計(jì)【課后習(xí)題答案】 錢(qián)曉捷 主編 電子工業(yè)出版社 第2章 8086的指令系統(tǒng)(全) 第2章 8086的指令系統(tǒng) 〔習(xí)題2.1〕已知DS=2000H、BX=0100H、SI=0002H,存儲(chǔ)單元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,說(shuō)明下列每條指令執(zhí)行完后AX寄存器的內(nèi)容。 (1) mov ax,1200h (2) mov ax,bx (3) mov ax,[1200h] (4) mov ax,[bx] (5) mov ax,[bx+1100h] (6) mov ax,[bx+si] (7) mov ax,[bx][si+1100h] 〔解答〕 (1)AX=1200H (2)AX=0100H (3)AX=4C2AH ;偏移地址=bx=0100h (4)AX=3412H ;偏移地址=bx=0100h (5)AX=4C2AH ;偏移地址=bx+1100h=1200h (6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h (7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h 〔習(xí)題2.2〕指出下列指令的錯(cuò)誤 (1) mov cx,dl (2) mov ip,ax (3) mov es,1234h (4) mov es,ds (5) mov al,300 (6) mov [sp],ax (7) mov ax,bx+di (8) mov 20h,ah 〔解答〕 (1)兩操作數(shù)類(lèi)型不匹配 (2)IP指令指針禁止用戶(hù)訪問(wèn) (3)立即數(shù)不允許傳給段寄存器 (4)段寄存器之間不允許傳送 (5)兩操作數(shù)類(lèi)型不匹配 (6)目的操作數(shù)應(yīng)為[ SI ] (7)源操作數(shù)應(yīng)為 [BX+DI] (8)立即數(shù)不能作目的操作數(shù) 〔習(xí)題2.3〕已知數(shù)字0 ~ 9對(duì)應(yīng)的格雷碼依次為:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table為首地址(設(shè)為200H)的連續(xù)區(qū)域中。請(qǐng)為如下程序段的每條指令加上注釋?zhuān)f(shuō)明每條指令的功能和執(zhí)行結(jié)果。 lea bx,table mov al,8 xlat 〔解答〕 lea bx,table ;獲取table的首地址,BX=200H mov al,8 ;傳送欲轉(zhuǎn)換的數(shù)字,AL=8 xlat ;轉(zhuǎn)換為格雷碼,AL=12H P35 〔習(xí)題2.4〕什么是堆棧,它的工作原則是什么,它的基本操作有哪兩個(gè),對(duì)應(yīng)哪兩種指令? 〔解答〕 堆棧是一種按“先進(jìn)后出”原則存取數(shù)據(jù)的存儲(chǔ)區(qū)域,位于堆棧段中,使用SS段寄存器記錄其段地址;它的工作原則是先進(jìn)后出;堆棧的兩種基本操作是壓棧和出棧,對(duì)應(yīng)的指令是PUSH和POP。 〔習(xí)題2.5〕已知SS = 2200H、SP = 00B0H,畫(huà)圖說(shuō)明執(zhí)行下面指令序列時(shí),堆棧區(qū)和SP的內(nèi)容如何變化? mov ax,8057h push ax mov ax,0f79h push ax pop bx pop [bx] 〔解答〕 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 〔習(xí)題2.6〕給出下列各條指令執(zhí)行后AL值,以及CF、ZF、SF、OF和PF的狀態(tài): mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 〔解答〕 mov al,89h ; AL=89h CF ZF SF OF PF add al,al ; AL=12h 1 0 0 1 1 ; 1000 1001 +1000 1001 10001 0010 add al,9dh ; AL=0afh 0 0 1 0 1 ; 0001 0010 + 1001 1101 1010 1111 cmp al,0bch ; AL=0afh 1 0 1 0 1 ; 1010 1111 -1011 1100 * 0100 0011 sub al,al ; AL=00h 0 1 0 0 1 dec al ; AL=0ffh 0 0 1 0 1 ; 0000 0000 - 0000 0001 *1111 1111 inc al ; AL=00h 0 1 0 0 1 ;1111 1111 +0000 0001 *1111 1111 〔習(xí)題2.7〕設(shè)X、Y、Z均為雙字?jǐn)?shù)據(jù),分別存放在地址為X、X+2;Y、Y+2;Z、Z+2的存儲(chǔ)單元中,它們的運(yùn)算結(jié)果存入W單元。閱讀如下程序段,給出運(yùn)算公式。 mov ax,X mov dx,X+2 add ax,Y adc dx,Y+2 add ax,24 adc dx,0 sub ax,Z sbb dx,Z+2 mov W,ax mov W+2,dx 〔解答〕 W=X+Y+24-Z 〔習(xí)題2.8〕請(qǐng)分別用一條匯編語(yǔ)言指令完成如下功能: (1)把BX寄存器和DX寄存器的內(nèi)容相加,結(jié)果存入DX寄存器。 (2)用寄存器BX和SI的基址變址尋址方式把存儲(chǔ)器的一個(gè)字節(jié)與AL寄存器的內(nèi)容相加,并把結(jié)果送到AL中。 (3)用BX和位移量0B2H的寄存器相對(duì)尋址方式把存儲(chǔ)器中的一個(gè)字和CX寄存器的內(nèi)容相加,并把結(jié)果送回存儲(chǔ)器中。 (4)用位移量為0520H的直接尋址方式把存儲(chǔ)器中的一個(gè)字與數(shù)3412H相加,并把結(jié)果送回該存儲(chǔ)單元中。 (5)把數(shù)0A0H與AL寄存器的內(nèi)容相加,并把結(jié)果送回AL中。 〔解答〕 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H 〔習(xí)題2.9〕設(shè)X、Y、Z、V均為16位帶符號(hào)數(shù),分別裝在X、Y、Z、V存儲(chǔ)單元中,閱讀如下程序段,得出它的運(yùn)算公式,并說(shuō)明運(yùn)算結(jié)果存于何處。 mov ax,X ;ax=X imul Y ;DX.AX=X*Y mov cx,ax ;cx=X*Y的低16位 mox bx,dx ;bx=X*Y的高16位 mov ax,Z ;ax=Z cwd add cx,ax ;cx=Z的低16位+X*Y的低16位 adc bx,dx ;bx=Z的高16位+X*Y的高16位+低位進(jìn)位 sub cx,540 ;cx=Z的低16位+X*Y的低16位-540 sbb bx,0 ;bx=Z的高16位+X*Y的高16位+低位進(jìn)位-低位借位 mov ax,V ;ax=V cwd sub ax,cx ;ax=V的低16位-(Z的低16位+X*Y的低16位-540) sbb dx,bx ;dx=V的高16位-(Z的高16位+X*Y的高16位+低位進(jìn)位-低位借位)-低位借位 idiv X ;/X 〔解答〕 [V-(X*Y+Z-540)]/X AX存商,DX存余數(shù) 〔習(xí)題2.10〕指出下列指令的錯(cuò)誤: (1) xchg [si],30h (2) pop cs (3) sub [si],[di] (4) push ah (5) adc ax,ds (6) add [si],80h (7) in al,3fch (8) out dx,ah 〔解答〕 (1)xchg的操作數(shù)不能是立即數(shù) (2)不應(yīng)對(duì)CS直接賦值 (3)兩個(gè)操作數(shù)不能都是存儲(chǔ)單元 (4)堆棧的操作數(shù)不能是字節(jié)量 (5)adc的操作數(shù)不能是段寄存器 (6)沒(méi)有確定是字節(jié)還是字操作 (7)in不支持超過(guò)FFH的直接尋址 (8)out只能以AL/AX為源操作數(shù) 〔習(xí)題2.11〕給出下列各條指令執(zhí)行后的結(jié)果,以及狀態(tài)標(biāo)志CF、OF、SF、ZF、PF的狀態(tài)。 mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 〔解答〕 mov ax,1470h ;AX=1470H CF ZF SF OF PF and ax,ax ;AX=1470H 0 0 0 0 0 ;0001 0100 0111 0000 or ax,ax ;AX=1470H 0 0 0 0 0 xor ax,ax ;AX=0000H 0 1 0 0 1 not ax ;AX=FFFFH 0 1 0 0 1 test ax,0f0f0h ;AX=FFFFH 0 0 1 0 1 注意:MOV和NOT指令不影響標(biāo)志位;其他邏輯指令使CF=OF=0,根據(jù)結(jié)果影響其他標(biāo)志位。 〔習(xí)題2.12〕假設(shè)例題2.32的程序段中,AX = 08H,BX = 10H,請(qǐng)說(shuō)明每條指令執(zhí)行后的結(jié)果和各個(gè)標(biāo)志位的狀態(tài)。 〔解答〕 指令 ; 執(zhí)行結(jié)果 CF OF SF ZF PF mov si,ax ; SI=AX=0008H - - - - - shl si,1 ; SI=2*AX=0010H0 0 0 0 0 add si,ax ; SI=3*AX=0018H 0 0 0 0 1 mov dx,bx; DX=BX=0010H 0 0 0 0 1 mov cl,03h; CL=03H0 0 0 0 1 shl dx,cl ; DX=8*BX=0080H 0 u 0 0 0 sub dx,bx ; DX=7*BX=0070H 0 0 0 0 0 add dx,si; DX=7*BX+3*AX=0088H0 0 0 0 1 注意:邏輯左移N次相當(dāng)于無(wú)符號(hào)整數(shù)乘以2的N次方,邏輯右移N次相當(dāng)于無(wú)符號(hào)整數(shù)除以2的N次方。移位指令根據(jù)移位的數(shù)據(jù)設(shè)置CF,根據(jù)移位后的結(jié)果影響SF,ZF,PF。在進(jìn)行一位移位時(shí),根據(jù)最高符號(hào)位是否改變?cè)O(shè)置OF,如改變則OF=1。另外,程序注釋用“u”表示標(biāo)志無(wú)定義(不確定),“-”表示無(wú)影響。 〔習(xí)題2.13〕編寫(xiě)程序段完成如下要求: (1)用位操作指令實(shí)現(xiàn)AL(無(wú)符號(hào)數(shù))乘以10 (2)用邏輯運(yùn)算指令實(shí)現(xiàn)數(shù)字0 ~ 9的ASCII碼與非壓縮BCD碼的互相轉(zhuǎn)換 (3)把DX.AX中的雙字右移4位 〔解答〕 (1);不考慮進(jìn)位 mov bl,al mov cl,3 shl al,cl ;*8 add al,bl ;shl bl,1 add al,bl ;考慮進(jìn)位 xor ah,ah mov bx,ax mov cl,3 shl ax,cl add ax,bx ;shl bx,1 add ax,bx (2)數(shù)字0~9的ASCII碼是:30h~39h 非壓縮BCD碼的0~9是:00h~09h 方法一: and al,0fh ;實(shí)現(xiàn)ASCII到非壓縮BCD碼的轉(zhuǎn)換 or al,30h ;實(shí)現(xiàn)非壓縮BCD碼到ASCII的轉(zhuǎn)換 方法二: xor al,30h ;求反D5D4位,其他不變 ;即高4位為3,則變?yōu)?;高4位為0,則變?yōu)? (3) mov cl,4 again:shr dx,1 ;實(shí)現(xiàn)邏輯右移 ;采用“sar dx,1”,則實(shí)現(xiàn)算術(shù)右移 rcr ax,1 dec cl jnz again 〔習(xí)題2.14〕已知AL = F7H(表示有符號(hào)數(shù)-9),分別編寫(xiě)用SAR和IDIV指令實(shí)現(xiàn)的除以2的程序段,并說(shuō)明各自執(zhí)行后,所得的商是什么? 〔解答〕 (1)用sar編寫(xiě) mov al,0f7h ; -9送AL 1111 1001 sar al,1 ; 結(jié)果:AL=1111 1100B=0FBH 即-5 (2)用idiv編寫(xiě) mov al,0f7h ; -9送al cbw ; 字節(jié)符號(hào)擴(kuò)展位字 mov bl,2 ; 注意除數(shù)不可為立即數(shù) idiv bl ; 結(jié)果:商為al=fch (-4) ; 余數(shù):ah=ffh (-1) 結(jié)論:符號(hào)數(shù)的除法用idiv 準(zhǔn)確。 〔習(xí)題2.15〕已知數(shù)據(jù)段500h ~600h處存放了一個(gè)字符串,說(shuō)明下列程序段執(zhí)行后的結(jié)果: mov si,600h mov di,601h mov ax,ds mov es,ax mov cx,256 std rep movsb 〔解答〕 〔習(xí)題2.16〕說(shuō)明下列程序段的功能 cld mov ax,0fefh mov cx,5 mov bx,3000h mov es,bx mov di,2000h rep stosw 〔解答〕 將es:di (即3000:2000h或32000h)開(kāi)始的5個(gè)單元的內(nèi)容置為0fefh。 〔習(xí)題2.17〕指令指針I(yè)P是通用寄存器還是專(zhuān)用寄存器?有指令能夠直接它賦值嗎?哪類(lèi)指令的執(zhí)行會(huì)改變它的值? 〔解答〕 指令指針I(yè)P不是通用寄存器,不可直接賦值,屬于專(zhuān)用寄存器。有且僅有循環(huán)、轉(zhuǎn)移、子程序調(diào)用和返回、中斷類(lèi)等指令可以改變它的值。 〔習(xí)題2.18〕控制轉(zhuǎn)移類(lèi)指令中有哪三種尋址方式? 〔解答〕 控制轉(zhuǎn)移類(lèi)指令的尋址方式:相對(duì)尋址、直接尋址方式和間接尋址方式(又可以分成寄存器和存儲(chǔ)器間接尋址)。 〔習(xí)題2.19〕什么是短轉(zhuǎn)移short jump、近轉(zhuǎn)移near jump和遠(yuǎn)轉(zhuǎn)移far jump?什么是段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移?8086有哪些指令可以實(shí)現(xiàn)段間轉(zhuǎn)移? 〔解答〕 短轉(zhuǎn)移:指段內(nèi)-128~127之間的轉(zhuǎn)移,位移量用一個(gè)字節(jié)表示 近轉(zhuǎn)移:指段內(nèi)32K之間的轉(zhuǎn)移,位移量用一個(gè)字表示 遠(yuǎn)轉(zhuǎn)移:指段間1MB范圍的轉(zhuǎn)移 段內(nèi)轉(zhuǎn)移:指在同一個(gè)代碼段內(nèi)的轉(zhuǎn)移,可以是短轉(zhuǎn)移或者近轉(zhuǎn)移 段間轉(zhuǎn)移:指轉(zhuǎn)移到另外一個(gè)代碼段,就是遠(yuǎn)轉(zhuǎn)移 8086/8088CPU的JMP、CALL和INT n指令可以實(shí)現(xiàn)段間轉(zhuǎn)移 〔習(xí)題2.20〕8086的條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍有多大?實(shí)際編程時(shí),你如何處理超出范圍的條件轉(zhuǎn)移? 〔解答〕 8086的條件轉(zhuǎn)移的轉(zhuǎn)移范圍:在當(dāng)前指令地址的 +127~-128之內(nèi)。 如條件轉(zhuǎn)移的轉(zhuǎn)移范圍超出此范圍,可在此范圍內(nèi)安排一條無(wú)條件轉(zhuǎn)移,再轉(zhuǎn)移到范圍外的目標(biāo)地址。 〔習(xí)題2.21〕假設(shè)DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,試問(wèn)執(zhí)行下列段內(nèi)間接尋址的轉(zhuǎn)移指令后,轉(zhuǎn)移的有效地址是什么? (1) JMP BX (2) JMP TABLE[BX] (3) JMP [BX][SI] 〔解答〕 (1)轉(zhuǎn)移的有效地址EA= BX=1256H (2)轉(zhuǎn)移的有效地址EA= [DS:20A1H+1256H]=[232F7]=3280H (3)轉(zhuǎn)移的有效地址EA= [DS:1256H+528FH]=264E5H=2450H 〔習(xí)題2.22〕判斷下列程序段跳轉(zhuǎn)的條件 (1) xor ax,1e1eh je equal (2)test al,10000001b jnz there (3)cmp cx,64h jb there 〔解答〕 (1)AX=1e1eh(異或后為0) (2)AL的D0或D7至少有一位為1 (3)CX(無(wú)符號(hào)數(shù))< 64h 〔習(xí)題2.23〕設(shè)置CX = 0,則LOOP指令將循環(huán)多少次?例如: mov cx,0 delay:loop delay 〔解答〕 216次。 〔習(xí)題2.24〕假設(shè)AX和SI存放的是有符號(hào)數(shù),DX和DI存放的是無(wú)符號(hào)數(shù),請(qǐng)用比較指令和條件轉(zhuǎn)移指令實(shí)現(xiàn)以下判斷: (1)若DX > DI,轉(zhuǎn)到above執(zhí)行; (2)若AX > SI,轉(zhuǎn)到greater執(zhí)行; (3)若CX = 0,轉(zhuǎn)到zero執(zhí)行; (4)若AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行; (5)若SI≤AX,轉(zhuǎn)到less_eq執(zhí)行; (6)若DI≤DX,轉(zhuǎn)到below_eq執(zhí)行。 〔解答〕 (1)若DX > DI,轉(zhuǎn)到above執(zhí)行 cmp dx,di ja above ;=j(luò)nbe above (2)若AX > SI,轉(zhuǎn)到greater執(zhí)行 cmp ax,si jg greater ;=j(luò)nle greater (3)若CX = 0,轉(zhuǎn)到zero執(zhí)行 cmp cx,0 jz zero ;= jcxz zero (4)若AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行; cmp ax,si jo overflow (5)若SI≤AX,轉(zhuǎn)到less_eq執(zhí)行; cmp si,ax ; cmp ax,si jle less_eq ; jge less_eq (6)若DI≤DX,轉(zhuǎn)到below_eq執(zhí)行。 cmp di,dx ; cmp dx,di jbe below_eq ; jae below_eq 〔習(xí)題2.25〕有一個(gè)首地址為array的20個(gè)字的數(shù)組,說(shuō)明下列程序段的功能。 mov cx,20 mov ax,0 mov si,ax sum_loop: add ax,array[si] add si,2 loop sum_loop mov total,ax 〔解答〕 將首地址為array得20個(gè)字的數(shù)組求和,并將結(jié)果存入 total 單元中。 〔習(xí)題2.26〕按照下列要求,編寫(xiě)相應(yīng)的程序段: (1)起始地址為string的主存單元中存放有一個(gè)字符串(長(zhǎng)度大于6),把該字符串中的第1個(gè)和第6個(gè)字符(字節(jié)量)傳送給DX寄存器。 (2)從主存buffer開(kāi)始的4個(gè)字節(jié)中保存了4個(gè)非壓縮BCD碼,現(xiàn)按低(高)地址對(duì)低(高)位的原則,將它們合并到DX中。 (3)編寫(xiě)一個(gè)程序段,在DX高4位全為0時(shí),使AX = 0;否則使AX = -1。 (4)有兩個(gè)64位數(shù)值,按“小端方式”存放在兩個(gè)緩沖區(qū)buffer1和buffer2中,編寫(xiě)程序段完成buffer1-buffer2功能。 (5)假設(shè)從B800h : 0開(kāi)始存放有100個(gè)16位無(wú)符號(hào)數(shù),編程求它們的和,并把32位的和保存在DX.AX中。 (6)已知字符串string包含有32KB內(nèi)容,將其中的’$’符號(hào)替換成空格。 (7)有一個(gè)100個(gè)字節(jié)元素的數(shù)組,其首地址為array,將每個(gè)元素減1(不考慮溢出)存于原處。 (8)統(tǒng)計(jì)以 ’$’ 結(jié)尾的字符串srting的字符個(gè)數(shù)。 〔解答〕 (1)解答: mov si,0 mov dl,string[si] ;第1個(gè)字符送dl寄存器:mov dl,stirng[0] mov si,5 mov dh,string[si] ;第6個(gè)字符送dh寄存器:mov dl,stirng[5] (2)解答: xor si,si ;si清零 mov al,buffer[si] ;第一字節(jié) inc si mov ah,buffer[si] ;第二字節(jié) mov cl,4 shl ah,cl ;BCD碼移到高半字節(jié) or al,ah ;組合成壓縮BCD碼 mov dl,al ;存入dl寄.. inc si mov al,buffer[si] ;第三字節(jié) inc si mov ah,buffer[si] ;第四字節(jié) mov cl,4 shl ah,cl ;BCD碼移到高半字節(jié) or al,ah ;組合成壓縮BCD碼 mov dh,al ;存入dh寄.. (3)解答: test dx,0f000h ; test dh,0f0h jz next ; jnz next mov ax,-1 ; mov ax,0 jmp again next:mov ax,0 ; mov ax,0ffffh again: ... (4)解答: mov ax, word ptr buffer1 sub ax, word ptr buffer2 ;先減低16位 mov dx, word ptr buffer1+2 sbb dx, word ptr buffer2+2 ;后減高16位,需減低16位的借位 (5)解答: mov ax,0b800h mov ds,ax ;段地址 xor si,si ;地址偏移量si=0 xor dx,dx ;和的高字dx=0 mov cx,99 ;加的次數(shù) mov ax,[si] ;第一個(gè)數(shù) again: inc si ;指向下一個(gè)字單元 inc si add ax,[si] ;加下一個(gè)數(shù) jnc noc ;無(wú)進(jìn)位轉(zhuǎn) inc dx ;有進(jìn)位dx=dx+1 noc: dec cx ;次數(shù)-1 jnz cx,again ;非0繼續(xù)加 (6)解答1:不使用串操作指令(更好) mov si,offset string mov cx,8000h ; 32k=2^15=8000h again: cmp byte ptr [si], ‘$’ ;‘$’ =24h jnz next ; 不要采用 jz 進(jìn)行分支 mov byte ptr [si], ‘ ’ ;‘ ’=20h next: inc si loop again ; dec cx ; jnz again (6)解答2:使用串操作指令 mov di,offset string mov al,’$’ mov cx,8000h cld again: scasb jnz next mov byte ptr es : [di-1], ‘ ’ next: loop again (7)解答1: mov si,offset array mov cx,100 again: dec byte ptr [si] inc si loop again (7)解答2: xor si,si ; si<--0 mov cx,100 ; 循環(huán)次數(shù) again: dec array[si] inc si loop again (7)解答3: mov si,offset array mov di,si mov ax,ds mov es,ax mov cx,100 cld again:lodsb dec al stosb loop again (8)解答: xor si,si ;si<--0 coun: cmp string[si],$ je done inc si jmp coun done: ... 〔習(xí)題2.27〕對(duì)下面要求,分別給出3種方法,每種方法只用一條指令。 (1)使CF=0 (2)使AX=0 (3)同時(shí)使AX=0和CF=0 〔解答〕 (1)解答: clc and ax,ax or ax,ax (2)解答: xor ax,ax and ax,0 mov ax,0 (3)解答: and ax,0 xor ax,ax sub ax,ax 〔習(xí)題2.28〕參照本習(xí)題的示意圖,分析調(diào)用序列,畫(huà)出每次調(diào)用及返回時(shí)的堆棧狀態(tài)。其中CALL前是該指令所在的邏輯地址;另外,段內(nèi)直接調(diào)用指令的機(jī)器代碼的字節(jié)數(shù)為3,段間直接調(diào)用指令則為5個(gè)字節(jié)。 〔解答〕 主程序轉(zhuǎn)子suba時(shí)段內(nèi)調(diào)用:斷點(diǎn)1為2000h:0400h+3, 轉(zhuǎn)子是只將IP壓棧。 suba轉(zhuǎn)子subb時(shí)段間調(diào)用:斷點(diǎn)2為2000h:0840h+5, 轉(zhuǎn)子時(shí)須將cs段地址和IP壓棧 suba轉(zhuǎn)子subc時(shí)段內(nèi)調(diào)用:斷點(diǎn)3為2000h:0c021h+3,轉(zhuǎn)子是只將IP壓棧。 注:壓棧時(shí)先修改sp再壓入斷點(diǎn),彈棧時(shí)先彈出斷點(diǎn)再修改sp。 〔習(xí)題2.29〕已知AX 、BX存放的是4位壓縮BCD表示的十進(jìn)制數(shù),請(qǐng)說(shuō)明如下子程序的功能和出口參數(shù)。 add al,bl daa xchg al,ah adc al,bh daa xchg al,ah ret 〔解答〕 壓縮BCD碼加法:AX←AX+BX 出口參數(shù):AX=BCD碼和 〔習(xí)題2.30〕AAD指令是用于除法指令之前,進(jìn)行非壓縮BCD碼調(diào)整的。實(shí)際上,處理器的調(diào)整過(guò)程是:AL←AH10+AL,AH←0。如果指令系統(tǒng)沒(méi)有AAD指令,請(qǐng)用一個(gè)子程序完成這個(gè)調(diào)整工作。 〔解答〕 shl ah,1 ;ah=2*a (設(shè)原ah=a) mov dl,ah ;dl=2*a mov cl,2 ;設(shè)定移位次數(shù) shl ah,cl ;ah=8*a add ah,dl ;ah=10*a add al,ah ;al=10*a+al xor ah,ah ;清零ah int 3 ;返回DOS 注意: 入口:AX中存放有“和”(兩非壓縮BCD碼) 出口:AL中 已為調(diào)整后的二進(jìn)制數(shù) 〔習(xí)題2.31〕解釋如下有關(guān)中斷的概念: (1) 內(nèi)部中斷和外部中斷 (2) 單步中斷和斷點(diǎn)中斷 (3) 除法錯(cuò)中斷和溢出中斷 (4) 中斷向量號(hào)和中斷向量表 〔解答〕 (1)內(nèi)部中斷是由于8086CPU內(nèi)部執(zhí)行程序引起的程序中斷;外部中斷是來(lái)自8086CPU之外的原因引起的程序中斷; (2)單步中斷是若單步標(biāo)志TF為1,則在每條指令執(zhí)行結(jié)束后產(chǎn)生的中斷;斷點(diǎn)中斷是供調(diào)試程序使用的,它的中斷類(lèi)型號(hào)為3通常調(diào)試程序時(shí),把程序按程序的任務(wù)分成幾段,然后,每段設(shè)一個(gè)段點(diǎn); (3)除法錯(cuò)中斷是在執(zhí)行除法指令時(shí),若除數(shù)為0或商超過(guò)了寄存器所能表達(dá)的范圍產(chǎn)生的中斷;溢出中斷是在執(zhí)行溢出中斷指令I(lǐng)NTO時(shí),若溢出標(biāo)志OF為1時(shí)產(chǎn)生的中斷; (4)中斷向量號(hào)是 中斷類(lèi)型號(hào);中斷向量表是中斷向量號(hào)與它所對(duì)應(yīng)的中斷服務(wù)程序起始地址的轉(zhuǎn)換表。 〔習(xí)題2.32〕試比較INT n和段間CALL指令、IRET和段間RET指令的功能。 〔解答〕 INT n 響應(yīng)中斷時(shí),除象CALL保護(hù)斷點(diǎn)外,還應(yīng)保護(hù)FR;段間CALL指令用在主程序中實(shí)現(xiàn)子程序的調(diào)用。IRET 返回時(shí),除象RET恢復(fù)斷點(diǎn)外,還應(yīng)恢復(fù)FR;子程序執(zhí)行完成后,應(yīng)返回主程序中繼續(xù)執(zhí)行,這一功能由RET指令完成。 〔習(xí)題2.33〕什么是系統(tǒng)功能調(diào)用?匯編語(yǔ)言中,它的一般格式是怎樣的? 〔解答〕 系統(tǒng)功能調(diào)用是用戶(hù)在程序一級(jí)請(qǐng)示操作系統(tǒng)服務(wù)的一種手段,它不是一條簡(jiǎn)單的硬指令,而是帶有一定功能號(hào)的“訪指令”,它的功能并非由硬件直接提供,而是由操作系統(tǒng)操作系統(tǒng)中的一段程序完成的,即由軟件方法實(shí)現(xiàn)的 匯編語(yǔ)言中,它的一般格式是分如下四步進(jìn)行: (1)在AH寄存器置系統(tǒng)功能調(diào)用號(hào); (2)在指定的寄存器中設(shè)置 入口參數(shù); (3)用INT21H(或ROM—BIOS的中斷向量號(hào))指令執(zhí)行功能調(diào)用; (4)據(jù)出口參數(shù)分析功能調(diào)用運(yùn)行情況。 〔習(xí)題2.34〕補(bǔ)充例2.40,當(dāng)有溢出時(shí)顯示“Error! Overflow!”,無(wú)溢出時(shí)顯示“OK”。 〔解答〕 okmsg db ‘OK’, ‘$’ errmsg db ‘Error ! Overflow !’, ‘$’ … mov ax,X sub ax,Y jo overflow mov dx,offset okmsg jmp next overflow: mov dx,errmsg next: mov ah,9 int 21h 錯(cuò)誤解答: mov ax,X sub ax,Y jo overflow mov dx,offset okmsg okmsgdb ‘OK’, ‘$’ mov dx,errmsg ;錯(cuò)誤1:數(shù)據(jù)定義在代碼中 mov ah,9 int 21h overflow: errmsg db ‘Error ! Overflow !’, ‘$’ mov dx,errmsg ; 錯(cuò)誤2:缺少JMP指令 mov ah,9 int 21h 〔習(xí)題2.35〕補(bǔ)充例2.42,顯示“1”的個(gè)數(shù);注意首先將個(gè)數(shù)轉(zhuǎn)換為ASCII碼。 〔解答〕 and al,7fh ;使d7=0 mov dl,al ;轉(zhuǎn)存于dl jnp next ;奇數(shù)個(gè)1轉(zhuǎn) or al,80h ;偶數(shù)個(gè)1 使d7=1 next: xor bl,bl ;紀(jì)錄1的個(gè)數(shù) dl=0 mov cx,8 ;移位次數(shù) again: shl dl,1 ;邏輯左移1次 jnc desp ;如cf=0 轉(zhuǎn) inc bl;否則cf=1 個(gè)數(shù)加1 desp: loop again ;cx=cx-1 如cx不等于0,循環(huán) or bl,30h ;個(gè)數(shù)變?yōu)锳SCII碼 mov ah,02h ;在CRT上顯示個(gè)數(shù) mov dl,bl int 21h ret 〔習(xí)題2.36〕先提示輸入數(shù)字“Input Number:0 ~ 9”,然后在下一行顯示輸入的數(shù)字,結(jié)束;如果不是鍵入了0 ~ 9數(shù)字,就提示錯(cuò)誤“Error!”,繼續(xù)等待輸入數(shù)字。 〔解答〕 ; 數(shù)據(jù)段 str1 db Input Number:0~9 : ,0dh,0ah,$ str2 db Error!,0dh,0ah,$ ; 代碼段 mov ah,09h ; 顯示str1字符串 mov dx,offset str1 int 21h getkey: mov ah,1 ; 調(diào)用DOS功能 int 21h cmp al,0 jb error ; 小于0,出錯(cuò)處理 cmp al,9 ja error ; 大于9,出錯(cuò)處理 mov ah,02h ; 調(diào)用DOS顯示字符功能,顯示該數(shù)字 mov dl,al int 21h ... ; 終止程序執(zhí)行,返回DOS error: mov ah,09h ; 出錯(cuò),調(diào)用DOS 功能顯示str2字符串 mov dx,offset str2 int 21h jmp getkey ; 返回按鍵 〔習(xí)題2.37〕從鍵盤(pán)輸入一個(gè)字符串(不超過(guò)255個(gè)),將其中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母,然后按原來(lái)的順序在屏幕上顯示。 〔解答〕 思路:參考P67 例2.52用0ah號(hào)DOS系統(tǒng)功能調(diào)用,從鍵盤(pán)輸入一個(gè)字符串,然后從鍵盤(pán)緩沖區(qū)逐個(gè)取字符,在“a”與“z”之間的字符為小寫(xiě)字母,需要轉(zhuǎn)換為大寫(xiě)字母(減去20h),其他不變。 ;xt237.asm .model small .stack .data array db 255 db 0 array1 db 255 dup($) array2 db 0dh,0ah,$ .code .startup mov ah,0ah ; 鍵盤(pán)輸入字符串 mov dx,offset array int 21h mov dx,offset array2 ; 回車(chē)換行 mov ah,09h int 21h mov bx,offset array1 again: mov al,[bx] cmp al,$ jz done cmp al,a ; 小于a和大于z的字符不是小寫(xiě)字母 jb next cmp al,z ja next sub al,20h ; 在a和z之間的字符才是小寫(xiě)字母,轉(zhuǎn)換為大寫(xiě) mov [bx],al ; 保存到原位置 next: inc bx jmp again done: mov dx,offset array1 mov ah,09h int 21h .exit 0 end 〔習(xí)題2.38〕指令對(duì)狀態(tài)標(biāo)志的作用可以分成多種情況,例如無(wú)影響、無(wú)定義、按結(jié)果影響、特別說(shuō)明的影響等,你能區(qū)別這些情況嗎?分別用具體的指令來(lái)說(shuō)明。 〔解答〕 〔習(xí)題2.39〕8086指令系統(tǒng)分成哪6個(gè)功能組?各組主要包含什么指令,舉例說(shuō)明。 〔解答〕 8086指令系統(tǒng)分成的6個(gè)功能組是 (1)數(shù)據(jù)傳送類(lèi)令: ①通用數(shù)據(jù)傳送指令如傳送指令MOV、交換指令XCHG、換碼指令XLAT ②堆棧操作指令如進(jìn)棧指令PUSH出棧指令POP ③標(biāo)志傳送指令如標(biāo)志寄存器傳送;標(biāo)志位操作 ④地址傳送指令如有效地址傳送指令LEA、指針傳送指令LDS指針傳送指令LES ⑤輸入輸出指令如輸入指令I(lǐng)N、輸出指令OUT (2)算術(shù)運(yùn)算指令 ①加法指令如加法指令A(yù)DD、帶進(jìn)位加法指令A(yù)DC、增量指令I(lǐng)NC ②減法指令如減法指令SUB、帶借位指令SBB、減量指令DEC、求補(bǔ)指令NEG、比較指令CMP ③乘法指令如無(wú)符號(hào)乘法指令MUL、有符號(hào)乘法指令I(lǐng)MUL ④除法指令如無(wú)符號(hào)數(shù)除法指令DIV、有符號(hào)數(shù)除法指令I(lǐng)DIV ⑤符號(hào)擴(kuò)展指令如字節(jié)轉(zhuǎn)換字指令CBW、字轉(zhuǎn)換字節(jié)指令CWD ⑥十進(jìn)制調(diào)整指令如壓縮BCD碼調(diào)整指令、非壓縮BCD碼調(diào)整指令 (3)位操作類(lèi)指令 ①邏輯運(yùn)算指令如邏輯指令A(yù)ND、邏輯或指令OR、邏輯異或指令XOR、邏輯非指令NOT、測(cè)試指令TEST ②移位指令如邏輯移位指令SHL和SHR、算術(shù)移位指令SAL和SAR ③循環(huán)移位指令如不帶移位指令XOL和ROR、帶移位指令RCL和RCR (4)控制轉(zhuǎn)移類(lèi)指令 ①無(wú)條件轉(zhuǎn)移指令JMP ②條件轉(zhuǎn)移指令如判斷單個(gè)標(biāo)志狀態(tài)JZ/JE、JNZ/JNE、JS/JNS、JP/JPE、JNP/JPO、JC/JB、JNC/JNB/JAE,用于比較無(wú)符號(hào)數(shù)高低JB(JNAE)、JNB(JAE)、JBE(JNA)、JNBE(JA),用于比較有符號(hào)數(shù)大小JL(JNGE)、JNL(JGE)、JLE(JNG)、JNLE(JG) ③循環(huán)指令LOOP ④子程序指令如子程序調(diào)用指令CALL、子程序返回指令RET ⑤中斷指令如INT N (5)串操作類(lèi)指令 ①串傳送指令MOVS ②串存儲(chǔ)指令STOS ③串讀取指令LODS ④串比較指令CMPS- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
4 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 課后習(xí)題答案 新版 匯編 語(yǔ)言程序設(shè)計(jì) 課后 習(xí)題 答案 錢(qián)曉捷 主編 電子工業(yè) 出版社
鏈接地址:http://www.820124.com/p-2845963.html