匯編語言程序設(shè)計(錢曉捷)課后答案.doc_第1頁
匯編語言程序設(shè)計(錢曉捷)課后答案.doc_第2頁
匯編語言程序設(shè)計(錢曉捷)課后答案.doc_第3頁
匯編語言程序設(shè)計(錢曉捷)課后答案.doc_第4頁
匯編語言程序設(shè)計(錢曉捷)課后答案.doc_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

_匯編語言程序設(shè)計(第二版)錢曉捷習(xí)題答案第二章()2.1(1)AX1200h (2)AX0100h (3)AX4C2Ah (4)AX3412h (5)AX4C2Ah (6)AX7856h (7)AX65B7h 2.2(1)兩操作數(shù)類型不匹配 (2) IP指令指針禁止用戶訪問 (3)立即數(shù)不允許傳給段寄存器 (4)段寄存器之間不允許傳送 (5)兩操作數(shù)類型不匹配 (6)目的操作數(shù)應(yīng)為 BP (7)源操作數(shù)應(yīng)為 BX+DI(8)立即數(shù)不能作目的操作數(shù)2.3lea bx,table;獲取table的首地址,BX200H mov al,8;傳送欲轉(zhuǎn)換的數(shù)字,AL8 xlat;轉(zhuǎn)換為格雷碼,AL12H 2.4堆棧是一種按“先進后出”原則存取數(shù)據(jù)的存儲區(qū)域。 堆棧的兩種基本操作是壓棧和出棧,對應(yīng)的指令是PUSH和POP。2.5mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop bx ;DS:0f79h=8057h 2.6AL=89h CF ZF SF OF PF AL=12h 1 0 0 1 1 AL=0afh 0 0 1 0 1 AL=0afh 1 0 1 0 1 AL=00h 0 1 0 0 1 AL=0ffh 0 0 1 0 1 AL=00h 0 1 0 0 1 2.7 W=X+Y+24-Z2.8(1)ADD DX,BX (2)ADD AL,BX+SI (3)ADD BX+0B2H,CX (4)ADD WORD PTR 0520H,3412H (5)ADD AL,0A0H 2.9;為了避免與操作數(shù)地址混淆,將題中X,Y,Z,V 字操作數(shù)改為A,B,C,D mov ax,X;ax=A imul Y;dx,ax = A*B (將操作數(shù)看作符號數(shù),以下同) mov cx,ax mov bx,dx;bx,ax - dx,ax =A*B mov ax,Z;ax = C cwd;dx,ax =C(擴展符號后為雙字) add cx,ax adc bx,dx;bx,cx - bx,cx+dx,ax=A*B+C sub cx,540 sbb bx,0;bx,cx DI,轉(zhuǎn)到above執(zhí)行 cmp dx,di ja above;jnbe above (2)若AX SI,轉(zhuǎn)到greater執(zhí)行 cmp ax,si jg greater;jnle greater (3)若CX = 0,轉(zhuǎn)到zero執(zhí)行 cmp cx,0 jcxz zero jz zero(4)若AXSI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行; cmp ax,di jo overflow (5)若SIAX,轉(zhuǎn)到less_eq執(zhí)行; cmp si,ax cmp ax,si jle less_eq jge less_eq (6)若DIDX,轉(zhuǎn)到below_eq執(zhí)行。 cmp di,dx cmp dx,di jbe below_eq jae below_eq2.25; 答:將首地址為array得20個字的數(shù)組求和,并將結(jié)果存入 total 單元中。2.26; (1) mov si,0 mov dl,stringsi;第1個字符送dl寄存器 mov si,5 mov dh,stringsi;第6個字符送dh寄存器 (2) xor si,si;si清零 mov al,buffersi;第一字節(jié) inc si mov ah,buffersi;第二字節(jié) mov cl,4 shl ah,cl;BCD碼移到高半字節(jié) or al,ah;組合成壓縮BCD碼 mov dl,al;存入dl寄. inc si mov al,buffersi;第三字節(jié) inc si mov ah,buffersi;第四字節(jié) mov cl,4 shl ah,cl;BCD碼移到高半字節(jié) or al,ah;組合成壓縮BCD碼 mov dh,al;存入dh寄. (3) test dx,0f000h jz zero mov ax,-1 jmp done zero: mov ax,0 done: ret (4) lea bx,buffer1 lea dx,buffer2 mov cx,8;8個字節(jié) xor si,si;si=0 clc;CF=0 (5) mov ax,0b800h mov ds,ax;段地址 xor si,si;地址偏移量si=0 xor dx,dx;和的高字dx=0 mov cx,99;加的次數(shù) mov ax,si;第一個數(shù) again: inc si;指向下一個字單元 inc si add ax,si;加下一個數(shù) jnc noc;無進位轉(zhuǎn) inc dx;有進位dx=dx+1 noc: dec cx;次數(shù)-1 jnz cx,again;非0繼續(xù)加 ret (6) mov si,offset string mov cx,8000h;32k=215=8000h again: cmp si,$ jnz next mov si,20h;if si=$ si- next: inc si loop again (7) xor si,si;si-0 mov cx,100;循環(huán)次數(shù) again: dec arraysi dec cx jnz again (8) xor si,si ;si-0 coun: cmp stringsi,$ je done inc si jmp coun done: ret2.27; (1)使CF0 : clc; and ax,ax;or ax,ax (2)使AX0 : xor ax,ax; and ax,0;mov ax,0 (3)同時使AX0和CF0: and ax,0 ;xor ax,ax ;sub ax,ax2.29; 壓縮BCD碼加法:AXAXBX 出口參數(shù):AXBCD碼和2.34; 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 錯誤: mov ax,X sub ax,Y jo overflow mov dx,offset okmsg okmsg db OK, $ mov dx,errmsg ;錯誤1:數(shù)據(jù)定義在代碼中 mov ah,9 int 21h overflow: errmsg db Error ! Overflow !, $ mov dx,errmsg ; 錯誤2:缺少JMP指令 mov ah,9 int 21h 2.37; ;xt237.asm.model small.stack.dataarray db 255db 0array1 db 255 dup($)array2 db 0dh,0ah,$ .code.startupmov ah,0ah ; 鍵盤輸入字符串mov dx,offset arrayint 21hmov dx,offset array2 ; 回車換行mov ah,09hint 21hmov bx,offset array1again: mov al,bxcmp al,$jz donecmp al,a ; 小于a和大于z的字符不是小寫字母jb nextcmp al,zja nextsub al,20h ; 在a和z之間的字符才是小寫字母,轉(zhuǎn)換為大寫mov bx,al ; 保存到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21h.exit 0end第三章(01) 3.1; 硬指令:每個硬指令就是一個處理器指令,在CPU執(zhí)行時產(chǎn)生相應(yīng)功能; 偽指令:偽指令并不產(chǎn)生處理器指令,它通常用于輔助匯編程序?qū)υ闯绦蜻M行匯編。3.2;3.5; 編輯文本編輯程序匯編語言源程序.asm 匯編匯編程序目標(biāo)模塊文件.obj 連接連接程序可執(zhí)行文件.exe或.com 調(diào)試調(diào)試程序應(yīng)用程序3.6; ;xt236.asm簡化段定義格式 .model small ;定義程序的存儲模式(小模式) .stack;定義堆棧段(默認(rèn)1024個字節(jié)) .data;定義數(shù)據(jù)段 str1 ab Input Number:09 : ,0dh,0ah,$str2 ab Error!,0dh,0ah,$ .cade;定義代碼段 .startup;說明程序的起始點,建立ds,ss的內(nèi)容。 mov ah,09h;顯示str1字符串 mov dx,offset str1 int 21h gtekey: mov ah,1;調(diào)用BIOS判斷按鍵功能 int 16h jz getkey;如 zf = 0,無鍵按下,等待 cmp al,0;有鍵按下,鍵值與0比較 jb error;如 0,出錯處理 cmp al, 9 ;有鍵按下,鍵值與 9比較 ja error;如 9,出錯處理 mov ah,02h;調(diào)用DOS顯示字符功能,顯示該數(shù)字 mov dl,al int 21h .exit 0;終止程序執(zhí)行,返回DOS error: mov ah,09h; 出錯,調(diào)用DOS 功能顯示str2字符串 mov dx,offset str2 int 21h jmp getkey;等待按鍵 end; 匯編結(jié)束3.7; ;xt307.asmstack segment dw 512 dup(?) stack endsdata segmentarray db 255db 0array1 db 255 dup($)array2 db 0dh,0ah,$ data endscode segment codeassume cs:code, ds:data, ss:stackstart: mov ax,data mov ds,ax mov ah,0ah ; 鍵盤輸入字符串mov dx,offset arrayint 21hmov dx,offset array2 ; 回車換行mov ah,09hint 21hmov bx,offset array1again: mov al,bxcmp al,$jz donecmp al,a ; 小于a和大于z的字符不是小寫字母jb nextcmp al,zja nextsub al,20h ; 在a和z之間的字符才是小寫字母,轉(zhuǎn)換為大寫mov bx,al ; 保存到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21hmov ax,4c00hint 21hcode endsend start3.9; (1) mov byte ptr bx,1000;1000超出了一個字節(jié)范圍 (2) mov bx,offset mywordsi;寄存器的值只有程序執(zhí)行時才能確定, ;而offset是匯編過程計算偏移地址,故無法確定 ;可以改為lea bx,mywordsi (3) cmp mybyte1,mybyte2;兩個都是存儲單元,指令不允許 (4) mov al,mybyte1+mybyte2 ;變量值只有執(zhí)行時才確定,匯編過程不能計算 (5) sub al,myword;字節(jié)量AL與字量myword,類型不匹配 (6) jnz myword;Jcc指令只有相對尋址方式,不支持間接尋址方式3.10; 前者為“與”操作硬指令助記符,可匯編成機器代碼。 后者為邏輯運算符,在匯編時進行“與”運算,產(chǎn)生具體數(shù)值。3.11; 注:對于邏輯運算,有關(guān)操作數(shù)可化為二進制數(shù)。 (1)mov al,23h AND 45h OR 67h; 67h (2)mov ax,1234h/16 + 1Oh; 133h (3)mov ax,NOT(65535 XOR 1234h); 1234h (4)mov al, LOW 1234h OR HIGH 5678h; 76h (5)mov ax,23h SHL 4; 0234h (6)mov ax, 1234h SHR 6; 0048h (7)mov al,a AND (NOT(a-A) ; 41h (8)mov al,H OR 00100000b; 68h (9)mov ax,(76543 LT 32768) XOR 7654h; 7654h3.12; 假設(shè)block開始的數(shù)據(jù)塊有32個字節(jié)數(shù)據(jù):16個正數(shù)+100 (64h),16個負(fù)數(shù) -48 (0doh) 分別連續(xù)分布: block db 16 dup(100),16 dup(-48) ;也可以是任意字節(jié)數(shù)據(jù),隨意分布。 dplus db 32 dup(?);為正數(shù)預(yù)留存儲空間 dminus db 32 dup(?);為負(fù)數(shù)預(yù)留存儲空間 count equ 32;字節(jié)數(shù)3.15; mydataseg segment my1b db Personal Computer my2b db 20 my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup(?) my6c equ 100 ;my6c = 100 my7c equ mydataseg ends3.18; 段地址:表示標(biāo)號所在代碼段的段地址; 偏移地址:表示標(biāo)號所在代碼段的段內(nèi)偏移地址; 類型:引用該標(biāo)號時,表示它所在同一個段near類型,還是另外一個段far類型。3.19; mydata segment ORG lO0h VARW DW l234H,5678H VARB DB 3,4 AGLIN 4 VARD DD 12345678H EVEN BUFF DB 10 DUP(?) MESS DB HELLO MOV AX, OFFSET VARB + OFFSET MESS;AX = 4+16H = 1AH MOV AX, TYFE TYPE BUFF+TYPE MESS+TYPE VARD;AX = 1+1+4 = 06H MOV AX,SIZE VARW+SIZE BUFF+SIZE MESS;AX = 4+10+5 = 19 = 13H MOV AX,LENGTH VARW + LENGTH VARD;AX = 2+1 = 03H MOV AX,LENGTH BUFF + SIZE VARW;AX = 10+4 =14 = 0EH MOV AX,TYPE BIGIN;AX = FF02H (近) MOV AX,OFFSET BEGIN;AX = 1BH3.22; 段定義偽指令段名定位組合類別組名 .CODE _TEXT WORD PUBLIC CODE.DATA _DATA WORD PUBLIC DATA DGROUP .STACK STACKPARA STACK STACK DGROUP 3.25; .model small .stack .data num equ 5 datalist dw -1,0,2,5,4,? .code .startup mov bx,offset datalist mov cx,num xor ax,ax again: add ax,bx inc bx inc bx loop again mov bx,ax .exit 0 end3.26; stack segment para stackdw 512 dup(?) stack ends data segment dword array db 100 dup(?) data ends code segment code assume cs:code,ds:data,es:data,ss:stack org 100h start: mov ax,data mov ds,ax mov es,ax mov di,offset array mov al,64h mov cx,100 cld rep stosb mov ax,4c00h int 21h code ends end start3.27;解答;xt327.asm .model small .stack 256;定義堆棧段大小為256個字節(jié) .data anum dd 11223344h;定義兩個雙字的數(shù)(隨意) bnum dd 77553311h sum dd ?;定義結(jié)果,執(zhí)行后為:88776655h .code .startup xor si, si;相對于變量的位移量清零 mov cx, 2;分高低字分別相加,共兩次 clc;清零cf again:mov ax, anumsi;取第一個數(shù)的一個字(先低字后高字) adc ax, bnumsi;取第二個數(shù)的一個字(先低字后高字) mov sumsi, ax;存和的一個字(先低字后高字) inc si;修改位移量指向下一個字(加2) inc si loop again;cx=cx-1 ,if cx0 ,jump again .exit 0 end 3.28; .startup xor si, si;位移量清零 mov al, bdatasi;取第一個數(shù) mov cx, num-1;累加次數(shù) again: inc si;指向下一個數(shù) adc al, bdatasi;累加 loop again;如未完,繼續(xù)累加 mov sum, al;完了,存結(jié)果 .exit 0 end4.3; 思路:設(shè)這四組從低位到高位分別放在AL、BL、CL和DL寄存器中。這里僅列出代碼段: mov bl, al;將al中的兩組分開 and al, 0fh;屏蔽高四位后送al mov cl, 4;原al中的數(shù)據(jù)邏輯右移4次送bl shr bl, cl mov dl, ah;將ah中的兩組分開 and dl, 0f0h;屏蔽低高四位后送dl mov cl, 4;原ah中的數(shù)據(jù)邏輯右移4次送dl shr dl, cl mov cl, ah;屏蔽高四位后送cl and cl, 0fh4.4; getkey: mov ah, 1;從鍵盤輸入,出口:al存鍵值 int 21h cmp al, a;判鍵值是小寫字母? jb getkay cmp al, z ja getkay sub al,20h;是小寫字母轉(zhuǎn)換為大寫字母 mov ah, 09h;顯示 int 21h4.8; (1) 將jmp tablebx指令改為:mov dx, tablebx(2) 去掉源程序中:.exit 0-end之間的語句4.17; .model small .stack 256 .data stri1 db please input number:1-9,odh,oah,$ .code .startup again: mov dx,offset stri1;顯示stri1,提示輸入 mov ah,09h int 21h mov ah,01h;調(diào)用輸入一個字符 int 21h;輸入一個字符存在al中 cmp al, 1;判該字符,如不在1-9 jb again;重新輸入 cmp al, 9 ja again and al,0fh;在1-9,屏蔽高4位 mov cx, al;振鈴次數(shù)送cx .repeat mov dl, 07h;調(diào)用一次振鈴 mov ah, 02h int 21h mov dx ,0ffffh;延時 abc: dec dx jnz abc .untilcxz;cx=cx-1,cx=0 退出 .exit 0 end4.22;crazy PROC;crazy PROC push ax; xor ax,ax; xor ax,ax xor dx,dx; xor dx,dx again: add ax,bx;again: add ax,bx adc dx,0; adc dx,0 inc bx; inc bx inc bx; inc bx loop again; loop again ret; ret ENDP crazy; crazy ENDP425;子程序中又調(diào)用子程序就形成子程序嵌套。 子程序中直接或間接調(diào)用該子程序本身就形成子程序遞歸。426; .model small .stack 256 .data stdng db HeLLO eveRyboDy ! , 0 .code .startup mov bx, offset atring again: mov al, bx call chan;調(diào)用過程 mov bx , al next: inc bx jmp againdone: .exit 0chan proc;大寫轉(zhuǎn)換為小寫字母的過程 or al, al jz done cmp al,A jb next cmp al, Z ja next or al, 20h ret chan endp end 427;astob proc and dh, 0fh;十位數(shù)的ASCII碼轉(zhuǎn)為二進制數(shù) mov al, dh mul 10;al= 10*dh and dl, 0fh;個位數(shù)的ASCII碼轉(zhuǎn)為二進制數(shù) add al, dl;al= 10*dh + dl ret astob endp51; cmp X, 5 je abc jmp done abc: cmp ax, bx jne cde jmp done cde: inc ax done:.52;cmp X, 5 je abc jmp done cmp ax, bx jne abc jmp done abc: inc ax done: .54;宏定義采用一對偽指令實現(xiàn),格式如下(其中方括號表示可選): 宏名 macro 形參表 宏定義體 endm 宏調(diào)用時,利用宏名帶上實參即可,格式如下: 宏名 實參表56;宏的參數(shù)功能非常強大,即可以沒有參數(shù),也可以帶有一個或多個參數(shù);而且參數(shù)的形式非常靈活,可以是常量、變量、存儲單元、指令或它們的一部分,還可以是表達式等。 宏展開時的形參與實參結(jié)合是用位置匹配的實參對形參進行取代。實參個數(shù)與形參個數(shù)不同時,多余的實參沒有作用,缺少的實參則用空格代替。取代時,不進行有效性等檢查。57;宏匯編的特點是在匯編階段進行語句展開,無需返回,不減少目標(biāo)程序代碼,執(zhí)行速度沒有改變;通過形參、實參結(jié)合傳遞參數(shù)。宏匯編適合于程序段較短或要求執(zhí)行速度快的場合。 子程序在執(zhí)行階段需要由主程序執(zhí)行調(diào)用指令CALL進行調(diào)用,進而轉(zhuǎn)入子程序執(zhí)行,子程序執(zhí)行結(jié)束執(zhí)行返回指令RET返回主程序。子程序如果被多次使用,則會減少目標(biāo)程序代碼;主程序與子程序之間主要采用寄存器、存儲單元、堆棧等傳遞參數(shù)。子程序適合于程序段較長或為減少目標(biāo)代碼的場合。59;shrot word ptr bx,4,ror 1 push cx 1 mov cl,4 1 ror word ptr bx,cl 1 pop cx5.10;logical macro lcode,dopd,sopd lcode dopd,sopd endm 例如,如果使用“and ax,bx”指令,可以利用該宏定義,寫出宏指令如下: logical and,ax,bx 初看起來,這個問題似乎比較難解決。實際上,這4條邏輯指令都具有相同的指令操作數(shù)格

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論