匯編語言程序設計課后答案_第1頁
匯編語言程序設計課后答案_第2頁
匯編語言程序設計課后答案_第3頁
匯編語言程序設計課后答案_第4頁
匯編語言程序設計課后答案_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-. z.匯編語言程序設計(第二版)錢曉捷習題答案第二章2.11A*1200h 2A*0100h 3A*4C2Ah 4A*3412h 5A*4C2Ah 6A*7856h 7A*65B7h 2.2(1)兩操作數(shù)類型不匹配 (2) IP指令指針制止用戶訪問 (3)立即數(shù)不允許傳給段存放器 (4)段存放器之間不允許傳送 (5)兩操作數(shù)類型不匹配 (6)目的操作數(shù)應為 BP (7)源操作數(shù)應為 B*+DI(8)立即數(shù)不能作目的操作數(shù)2.3lea b*,table;獲取table的首地址,B*200H mov al,8;傳送欲轉(zhuǎn)換的數(shù)字,AL8 *lat;轉(zhuǎn)換為格雷碼,AL12H 2.4堆棧是一種按“先

2、進后出原則存取數(shù)據(jù)的存儲區(qū)域。 堆棧的兩種根本操作是壓棧和出棧,對應的指令是PUSH和POP。2.5mov a*,8057h push a* mov a*,0f79h push a* pop b* ;b*=0f79h pop b* ;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 12.7W=*+Y+24-Z2.81ADD D*,B* 2ADD AL,B*+S

3、I 3ADD B*+0B2H,C* 4ADD WORD PTR 0520H,3412H 5ADD AL,0A0H 2.9;為了防止與操作數(shù)地址混淆,將題中*,Y,Z,V 字操作數(shù)改為A,B,C,D mov a*,*;a*=A imul Y;d*,a* = A*B (將操作數(shù)看作符號數(shù),以下同 mov c*,a* mov b*,d*;b*,a* - d*,a* =A*B mov a*,Z;a* = C cwd;d*,a* =C擴展符號后為雙字 add c*,a* adc b*,d*;b*,c* - b*,c*+d*,a*=A*B+C sub c*,540 sbb b*,0;b*,c* DI,轉(zhuǎn)到

4、above執(zhí)行 cmp d*,di ja above;jnbe above 2假設A* SI,轉(zhuǎn)到greater執(zhí)行 cmp a*,si jg greater;jnle greater 3假設C* = 0,轉(zhuǎn)到zero執(zhí)行 cmp c*,0 jc*z zero jz zero4假設A*SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行; cmp a*,di jo overflow 5假設SIA*,轉(zhuǎn)到less_eq執(zhí)行; cmp si,a* cmp a*,si jle less_eq jge less_eq 6假設DID*,轉(zhuǎn)到below_eq執(zhí)行。 cmp di,d* cmp d*,di e below

5、_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) *or 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,buffer

6、si;第三字節(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 d*,0f000h jz zero mov a*,-1 jmp done zero: mov a*,0 done: ret (4) lea b*,buffer1 lea d*,buffer2 mov c*,8;8個字節(jié) *or si,si;si=0 clc;CF=0 (5) mov a*,0b800h mov ds,a*;段地址 *or si,si;地址偏移量si=0 *or

7、 d*,d*;和的高字d*=0 mov c*,99;加的次數(shù) mov a*,si;第一個數(shù) again: inc si;指向下一個字單元 inc si add a*,si;加下一個數(shù) jnc noc;無進位轉(zhuǎn) inc d*;有進位d*=d*+1 noc: dec c*;次數(shù)-1 jnz c*,again;非0繼續(xù)加 ret (6) mov si,offset string mov c*,8000h;32k=215=8000h again: cmp si,$ jnz ne*t mov si,20h;if si=$ si- ne*t: inc si loop again (7) *or si,si

8、;si-0 mov c*,100;循環(huán)次數(shù) again: dec arraysi dec c* jnz again (8) *or si,si ;si-0 coun: cmp stringsi,$ je done inc si jmp coun done: ret2.27; (1)使CF0 : clc; and a*,a*;or a*,a* (2)使A*0 : *or a*,a*; and a*,0;mov a*,0 (3)同時使A*0和CF0: and a*,0 ;*or a*,a* ;sub a*,a*2.29; 壓縮BCD碼加法:A*A*B* 出口參數(shù):A*BCD碼和2.34; okms

9、g db OK, $errmsg db Error ! Overflow !, $ mov a*,* sub a*,Y jo overflow mov d*,offset okmsg jmp ne*t overflow: mov d*,errmsg ne*t: mov ah,9 int 21h 錯誤: mov a*,* sub a*,Y jo overflow mov d*,offset okmsg okmsg db OK, $ mov d*,errmsg ;錯誤1:數(shù)據(jù)定義在代碼中 mov ah,9 int 21h overflow: errmsg db Error ! Overflow !

10、, $ mov d*,errmsg ; 錯誤2:缺少JMP指令 mov ah,9 int 21h 2.37; ;*t237.asm.model small.stack.dataarray db 255db 0array1 db 255 dup($)array2 db 0dh,0ah,$ .code.startupmov ah,0ah ; 鍵盤輸入字符串mov d*,offset arrayint 21hmov d*,offset array2 ; 回車換行mov ah,09hint 21hmov b*,offset array1again: mov al,b*cmp al,$jz donecm

11、p al,a ; 小于a和大于z的字符不是小寫字母 ne*tcmp al,zja ne*tsub al,20h ; 在a和z之間的字符才是小寫字母,轉(zhuǎn)換為大寫mov b*,al ; 保存到原位置ne*t: inc b*jmp againdone: mov d*,offset array1mov ah,09hint 21h.e*it 0end第三章(01) 3.1; 硬指令:每個硬指令就是一個處理器指令,在CPU執(zhí)行時產(chǎn)生相應功能; 偽指令:偽指令并不產(chǎn)生處理器指令,它通常用于輔助匯編程序?qū)υ闯绦蜻M展匯編。3.2;3.5; 編輯文本編輯程序匯編語言源程序.asm 匯編匯編程序目標模塊文件.obj

12、 連接連接程序可執(zhí)行文件.e*e或. 調(diào)試調(diào)試程序應用程序3.6; ;*t236.asm簡化段定義格式 .model small ;定義程序的存儲模式小模式 .stack;定義堆棧段默認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 d*,offset str1 int 21h gtekey: mov ah,1;調(diào)用BIOS判斷按鍵功能 int 16

13、h jz getkey;如 zf = 0,無鍵按下,等待 cmp al,0;有鍵按下,鍵值與0比擬 error;如 0,出錯處理 cmp al, 9 ;有鍵按下,鍵值與 9比擬 ja error;如 9,出錯處理 mov ah,02h;調(diào)用DOS顯示字符功能,顯示該數(shù)字 mov dl,al int 21h .e*it 0;終止程序執(zhí)行,返回DOS error: mov ah,09h; 出錯,調(diào)用DOS 功能顯示str2字符串 mov d*,offset str2 int 21h jmp getkey;等待按鍵 end; 匯編完畢3.7; ;*t307.asmstack segment dw 5

14、12 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 a*,data mov ds,a* mov ah,0ah ; 鍵盤輸入字符串mov d*,offset arrayint 21hmov d*,offset array2 ; 回車換行mov ah,09hint 21hmov b*,offset array1again: mov al,b

15、*cmp al,$jz donecmp al,a ; 小于a和大于z的字符不是小寫字母 ne*tcmp al,zja ne*tsub al,20h ; 在a和z之間的字符才是小寫字母,轉(zhuǎn)換為大寫mov b*,al ; 保存到原位置ne*t: inc b*jmp againdone: mov d*,offset array1mov ah,09hint 21hmov a*,4c00hint 21hcode endsend start3.9; 1 mov byte ptr b*,1000;1000超出了一個字節(jié)*圍 2 mov b*,offset mywordsi;存放器的值只有程序執(zhí)行時才能確定,

16、 ;而offset是匯編過程計算偏移地址,故無法確定 ;可以改為lea b*,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; 注:對于邏輯運算,有關操作數(shù)可化為二進制數(shù)。 (1)mov al

17、,23h AND 45h OR 67h; 67h (2)mov a*,1234h/16 + 1Oh; 133h (3)mov a*,NOT(65535 *OR 1234h); 1234h (4)mov al, LOW 1234h OR HIGH 5678h; 76h (5)mov a*,23h SHL 4; 0234h (6)mov a*, 1234h SHR 6; 0048h (7)mov al,a AND (NOT(a-A) ; 41h (8)mov al,H OR 00100000b; 68h (9)mov a*,(76543 LT 32768) *OR 7654h; 7654h3.12

18、; 假設block開場的數(shù)據(jù)塊有32個字節(jié)數(shù)據(jù):16個正數(shù)+100 (64h),16個負數(shù) -48 0doh 分別連續(xù)分布: block db 16 dup100,16 dup-48 ;也可以是任意字節(jié)數(shù)據(jù),隨意分布。 dplus db 32 dup();為正數(shù)預留存儲空間 dminus db 32 dup();為負數(shù)預留存儲空間 count equ 32;字節(jié)數(shù)3.15; mydataseg segment my1b db Personal puter my2b db 20 my3b db 14h ;20h my4b db 00010100b my5w dw 20 dup() my6c eq

19、u 100 ;my6c = 100 my7c equ mydataseg ends3.18; 段地址:表示標號所在代碼段的段地址; 偏移地址:表示標號所在代碼段的段內(nèi)偏移地址; 類型:引用該標號時,表示它所在同一個段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 A*, OFFSET VARB + OFFSET MESS;A* = 4+16H = 1

20、AH MOV A*, TYFE TYPE BUFF+TYPE MESS+TYPE VARD;A* = 1+1+4 = 06H MOV A*,SIZE VARW+SIZE BUFF+SIZE MESS;A* = 4+10+5 = 19 = 13H MOV A*,LENGTH VARW + LENGTH VARD;A* = 2+1 = 03H MOV A*,LENGTH BUFF + SIZE VARW;A* = 10+4 =14 = 0EH MOV A*,TYPE BIGIN;A* = FF02H (近 MOV A*,OFFSET BEGIN;A* = 1BH3.22; 段定義偽指令段名定位組合

21、類別組名 .CODE _TE*T 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 b*,offset datalist mov c*,num *or a*,a* again: add a*,b* inc b* inc b* loop again mov b*,a* .e*it 0 end3.26; s

22、tack 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 a*,data mov ds,a* mov es,a* mov di,offset array mov al,64h mov c*,100 cld rep stosb mov a*,4c00h int 21h code ends end start3.2

23、7;解答;*t327.asm .model small .stack 256;定義堆棧段大小為256個字節(jié) .data anum dd 11223344h;定義兩個雙字的數(shù)隨意 bnum dd 77553311h sum dd ;定義結(jié)果,執(zhí)行后為:88776655h .code .startup *or si, si;相對于變量的位移量清零 mov c*, 2;分上下字分別相加,共兩次 clc;清零cf again:mov a*, anumsi;取第一個數(shù)的一個字先低字后高字 adc a*, bnumsi;取第二個數(shù)的一個字先低字后高字 mov sumsi, a*;存和的一個字先低字后高字

24、inc si;修改位移量指向下一個字加2 inc si loop again;c*=c*-1 ,if c*0 ,jump again .e*it 0 end 3.28; .startup *or si, si;位移量清零 mov al, bdatasi;取第一個數(shù) mov c*, num-1;累加次數(shù) again: inc si;指向下一個數(shù) adc al, bdatasi;累加 loop again;如未完,繼續(xù)累加 mov sum, al;完了,存結(jié)果 .e*it 0 end4.3; 思路:設這四組從低位到高位分別放在AL、BL、CL和DL存放器中。這里僅列出代碼段: mov bl, al

25、;將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;判鍵值是小寫字母? getkay cmp al, z ja getkay sub al,20h;是小寫字母轉(zhuǎn)換為大寫

26、字母 mov ah, 09h;顯示 int 21h4.8; 1 將jmp tableb*指令改為:mov d*, tableb*2 去掉源程序中:.e*it 0-end之間的語句4.17; .model small .stack 256 .data stri1 db please input number:1-9,odh,oah,$ .code .startup again: mov d*,offset stri1;顯示stri1,提示輸入 mov ah,09h int 21h mov ah,01h;調(diào)用輸入一個字符 int 21h;輸入一個字符存在al中 cmp al, 1;判該字符,如不在

27、1-9 again;重新輸入 cmp al, 9 ja again and al,0fh;在1-9,屏蔽高4位 mov c*, al;振鈴次數(shù)送c* .repeat mov dl, 07h;調(diào)用一次振鈴 mov ah, 02h int 21h mov d* ,0ffffh;延時 abc: dec d* jnz abc .untilc*z;c*=c*-1,c*=0 退出 .e*it 0 end4.22;crazy PROC;crazy PROC push a*; *or a*,a*; *or a*,a* *or d*,d*; *or d*,d* again: add a*,b*;again: a

28、dd a*,b* adc d*,0; adc d*,0 inc b*; inc b* inc b*; inc b* 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 b*, offset atring again: mov al, b* call chan;調(diào)用過程 mo

29、v b* , al ne*t: inc b* jmp againdone: .e*it 0chan proc;大寫轉(zhuǎn)換為小寫字母的過程 or al, al jz done cmp al,A ne*t cmp al, Z ja ne*t 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 *, 5

30、 je abc jmp done abc: cmp a*, b* jne cde jmp done cde: inc a* done:.52;cmp *, 5 je abc jmp done cmp a*, b* jne abc jmp done abc: inc a* done: .54;宏定義采用一對偽指令實現(xiàn),格式如下其中方括號表示可選: 宏名 macro 形參表 宏定義體 endm 宏調(diào)用時,利用宏名帶上實參即可,格式如下: 宏名 實參表56;宏的參數(shù)功能非常強大,即可以沒有參數(shù),也可以帶有一個或多個參數(shù);而且參數(shù)的形式非常靈活,可以是常量、變量、存儲單元、指令或它們的一局部,還可以是

31、表達式等。 宏展開時的形參與實參結(jié)合是用位置匹配的實參對形參進展取代。實參個數(shù)與形參個數(shù)不同時,多余的實參沒有作用,缺少的實參則用空格代替。取代時,不進展有效性等檢查。57;宏匯編的特點是在匯編階段進展語句展開,無需返回,不減少目標程序代碼,執(zhí)行速度沒有改變;通過形參、實參結(jié)合傳遞參數(shù)。宏匯編適合于程序段較短或要求執(zhí)行速度快的場合。 子程序在執(zhí)行階段需要由主程序執(zhí)行調(diào)用指令CALL進展調(diào)用,進而轉(zhuǎn)入子程序執(zhí)行,子程序執(zhí)行完畢執(zhí)行返回指令RET返回主程序。子程序如果被屢次使用,則會減少目標程序代碼;主程序與子程序之間主要采用存放器、存儲單元、堆棧等傳遞參數(shù)。子程序適合于程序段較長或為減少目標代碼

32、的場合。59;shrot word ptr b*,4,ror 1 push c* 1 mov cl,4 1 ror word ptr b*,cl 1 pop c*5.10;logical macro lcode,dopd,sopd lcode dopd,sopd endm 例如,如果使用“and a*,b*指令,可以利用該宏定義,寫出宏指令如下: logical and,a*,b* 初看起來,這個問題似乎比擬難解決。實際上,這4條邏輯指令都具有一樣的指令操作數(shù)格式,所以可以歸納為如上宏定義。5.12; move MACRO doprnd,soprnd push a* mov a*,soprnd

33、 mov doprnd,a* pop a* ENDM 第五章(02)5.13;解答movstr strN,dstr,sstr lea si, sstr lea di, dstr mov c*, strN cld rep movsb endm 5.14; ABSDIF Pl,P2,DISTANCEABSDIF B*,SI,DI 1 push a*答:1 push a* 1 mov a*,P1 1 mov a*,b* 1 sub a*,P2 1 sub a*,si 1 cmp a*,0 1 cmp a*,0 1 jge 0000 1 jge 0000 1 neg a* 1 neg a* 1 000

34、0 1 0000 1 mov DISTANCE, a* 1 mov di,a* 1 pop a* 1 pop a*5.15; wtemp =2 repeat 100 dw 0 dw wtemp wtemp =wtemp+2 endm5.18; DOS21H MACRO callnum,calladdress mov ah,callnum ifnb mov d*,calladdress endif int 21h ENDM5.22; 1.編寫主程序,并進展匯編產(chǎn)生OBJ模塊;2.編寫獨立的子程序,也進展匯編產(chǎn)生OBJ模塊;3.分別編寫主程序與子程序時,需要處理好共用變量、過程、邏輯段屬性、參數(shù)傳

35、遞等問題;4.利用連接程序?qū)⒅鞒绦蚰K和子程序模塊連接起來,形成完整的可執(zhí)行程序。5.28; ;數(shù)據(jù)段 table dw 2277,2138,1808,1709,1522,1356,1208,1139 ;對應中音1 7和高音i的定時器記數(shù)值 ;代碼段 mov al,0b6h;設置定時器2工作方式 out 43h,al again: mov ah,1;等待按鍵 int 21h cmp al,1;判斷是否為數(shù)字18 ne*t cmp al,8 ja ne*t sub al,30h ;18的ASCII碼轉(zhuǎn)換為二進制數(shù) sub al,1 ;再減1,將數(shù)字18變?yōu)?7,以便查表 *or ah,ah sh

36、l a*,1;乘以2 mov b*,a* ;記數(shù)值表是16位數(shù)據(jù),無法采用*lat指令 mov a*,tableb*;取出對應的記數(shù)值 out 42h,al;設置定時器2的記數(shù)值 mov al,ah out 42h,al in al,61h;翻開揚聲器聲音 or al,03h;使D1D0PB1PB011b,其他位不變 out 61h,al jmp again;連續(xù)發(fā)聲,直到按下另一個鍵 ne*t: push a* in al,61h;不是數(shù)字18,則關閉揚聲器聲音 and al,0fch;使D1D0PB1PB000b,其他位不變 out 61h,al pop a* cmp al,1bh;判斷是

37、否為ESC鍵對應ASCII碼1bh jne again;不是ESC,繼續(xù);否則程序執(zhí)行完畢 -1。.1立即尋址沒有2直接尋址7237H3使用B*的存放器尋址沒有4使用B*的間接尋址637DH5使用B*的存放器相對尋址0D5F0H(6)基址變址尋址8E18H7相對基址變址004FH2。根據(jù)以下要求,寫出相應的匯編指令。1ADDD*,B*(2)ADDAL,B*SI(3)ADDB*0B2H,C*(4)MOVA*,2A59HADD0524H,A*(5)ADDAL,0B5H3。1存放器間接尋址MOVB*,OFFSETBLOCKADDB*,OAHMOVD*,B*2存放器相對尋址MOVB*,0AHMOVD*

38、,BLOCKB*(3)基址變址尋址MOVB*,OFFSETBLOCKMOVSI,OAHMOVD*,B*SI4?,F(xiàn)有DS=2000H,(B*)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,試說明以下各條指令執(zhí)行完后,A*存放器的內(nèi)容。1MOVA*,1200H1200H(2)MOVA*,B*0100H(3)MOVA*,12004C2AH4MOVA*,B*3412H5MOV1100B*4C2AH(6)MOVA*,B*SI

39、7856H(7)MOVA*,1100B*SI65B7H5。17CD9H(2)212A0+1200H=0600H(3)212A0H+1200H+5119HH=098AH6。MOVB*,2000H或LESB*,2000LESDI,B*MOVA*,ES:B*MOVA*,ES:DI7。轉(zhuǎn)向地址OBJ的值分別為:1064DH(2)0691H(3)05ECH注意有符號數(shù)的符號位8。1MOVA*,0ABH立即數(shù)尋址無物理地址2MOVA*,B*存放器尋址同上3MOVA*,100直接尋址20100H4MOVA*,VAL直接尋址20050H(5)MOVA*,B*存放器間接尋址20100H(6)MOVA*,ES:B

40、*直接尋址21100H(7)MOVA*,BP存放器間接尋址20010H8MOVA*,SI同上200A0H(9)MOVA*,B*+10存放器相對尋址20110H10MOVA*,VALB*同上20150H(11)MOVA*,B*SI基址變址尋址201A0H(12)MOVA*,VALB*SI相對基相變址尋址201F0H9。1的指令:MOVA*,B*0CHMOVZREO,A*(2)的指令:MOVA*,ARRAYB*MOVZREO,A*10。MOVA*,TABLE是把符號地址TABLE里的內(nèi)容送到A*里,指令執(zhí)行完后,(A*)=1234HLEAA*,TABLE是把符號地址TABLE的有效地址這里是偏移量

41、送到指定存放器A*里,指令執(zhí)行完后,A*=0032H11。執(zhí)行完指令后,A*=1E00H12。LEAA*,CSTRINGMOVDL,A*MOVDH,A*+613。這個嘛不想做了,麻煩啊14。LESB*,2000MOVA*,ES:B*注意:一開場我寫的是:MOVA*,ES:8000H,后來看到題目里要求寫兩條指令,所以一條就不行了,就要畫蛇添足15。運算結(jié)果SF,ZF,CF,OF各位的值從左至右依次往下174D4H0000(2)A5C1H1001(3)4240H0010(4)0000H011016。接上表(1)5D140000(2)A8701001(3)D8701000(4)34E4001017

42、。(1).MOVA*,Z;把Z送到A*SUBA*,*;Z-*ADDA*,W;W+(Z-*)MOVZ,A*;結(jié)果保存在Z中(2).MOVA*,R;R送到A*中ADDA*,9;R+9MOVB*,*;*送到B*中ADDB*,6;*+6ADDA*,B*;R+9+(*+6),結(jié)果保存在A*中MOVB*,W;W送到B*中SUBB*,A*;W-R+9-(*+6),連續(xù)減去兩個數(shù),相當于減去這兩個數(shù)的和MOVZ,B*;最終結(jié)果送到Z中(3)MOVA*,W;把W送到A*IMUL*;W*注意:低十六位保存在A*里,高十六位保存在D*里MOVB*,Y;把Y送到B*里ADDB*,6;Y+6IDIVB*;W*/(Y+6

43、)注意:商保存在A*里,余數(shù)保存在D*里MOVZ,A*;把商送到Z中,MOVR,D*;把余數(shù)送到R中(4)MOVA*,W;把W送到A*中SUBA*,*;W-*CWD;把A*中的十六位帶符號數(shù)擴展成為32位,低十六位保存在A*中,高十六位保;在D*中MOVB*,5;把5送到B*中IDIVB*;W-*/5被除數(shù)為32位,除數(shù)為16位商為16位IMULY;上一步結(jié)果再乖以Y,積為32位MOVB*,2;把2送到B*中IMULB*;上一步乘法所得的積再乘以2,各為64位MOVZ,EA*;把結(jié)果中低32位放入Z雙字單元中MOVZ+4,ED*;把結(jié)果中高32位放入Z+4雙字單元中18。指令本條指令執(zhí)行完后A

44、*的內(nèi)容執(zhí)行完后CF,SF,ZF的值MOVA*,1234H1234H000MOVCL,41234H000ROLA*,CL2341H100DECA*2340H100MOVC*,42340H100MULC*8918H000INT20H程序完畢后,A*=8918H(D*)=0000H19。指令執(zhí)行完后A*的內(nèi)容執(zhí)行完后CF,SF,ZF和OF的值MOVA*,000010DECA*FFFFH0100ADDA*,7FFFH7FFEH0000ADDA*,28000H0101NOTA*7FFFH0101SUBA*,0FFFFH8000H1101ADDA*,8000H0000H1011SUBA*,1FFFFH1

45、101ANDA*,58D1H58D1H0000SALA*,1B1A2H0101SARA*,1D8D1H0100NEGA*272FH1000RORA*,19397H100120。1MOVA*,DATA*ADDDATAY,A*2MOVA*,DATA*ADDDATAY,A*MOVA*,DATA*+2ADDDATAY+2,A*3本組指令的作用是:B*-DATA*+DATAY+1(CF的值)帶進位加法4MOVA*,DATA*MULDATAY;結(jié)果的高十六位保存在D*裏,低十六位保存在A*裏5MOVA*,DATA*MOVD*,DATA*+2MULDWORDDATAY;結(jié)果的高三十二位保存在ED*裏,低三十

46、二位保存在EA*裏;這裏所用的DWORD為一屬性操作符,在第四章會學到6MOVA*,DATA*DIV17H;結(jié)果商保存在AL中,余數(shù)在AH中7MOVA*,DATA*CDWDIVDATAY21。NEGD*NEGA*SBBD*,022。MOVA*,A;把雙字長數(shù)的低字放到A*中MOVD*,A+2;把雙字長數(shù)的高字放到D*中TESTD*,8000H;測試雙字長數(shù)的符號JZRIGHT;如果是非負數(shù),則直接保存NEGD*;如果是負數(shù),則求補NEGA*SBBD*,0RIGHT:MOVB,A*MOVB+2,D*1。指令以下指令的錯誤1MOVAH,B*源操作數(shù)與目的操作數(shù)長度不一樣2MOVB*,SI這是兩個內(nèi)

47、存單元在傳遞數(shù)據(jù),而這在匯編語言中是不允許的(3)MOVA*,SIDI不能用兩個變址連用,其中一個應為基址4MOVMYDATB*SI,ES:A*同25MOVBYTEPTRB*,1000必須有一個為存放器6MOVB*,OFFSETMYDATSIOFFSET不能與復雜操作數(shù)相連7MOVCS,A*不能對CS賦值8MOVEC*,A*操作數(shù)類型不同2。1合法2非法3非法4非法3。1非法,操作數(shù)類型不同2合法3非法,不允許兩個內(nèi)存單元直接傳遞數(shù)據(jù),你把人家CPU放哪了?呵4合法5合法6合法7非法,必須有一個存放器把CPU放哪了?8非法,兩個內(nèi)存單元地址相加沒有意義9合法10非法,同34。1兩內(nèi)存單元傳遞數(shù)

48、據(jù)2操作數(shù)類型不同3跳轉(zhuǎn)指令只能跳轉(zhuǎn)到符號地址4轉(zhuǎn)移指令后不能為變量,只能為標號5格式不對,應為NEARPTR。5。圖,就不畫了6。1DW5150H2MOVA*,5150HMOVADDRESS,A*等,寫出幾個就可以7。DATASGSEGMENTFLD1BDBpersonalputerFLD2BDB10DUP(32)FLD3BDB20HFLD4BDB01011001BFLD5BDB32654FLD6BDB10DUP(0)FLD7BDBPART1,DUP20(),PART2,DUP50(),PART3,DUP14()FLD1WDW0FFF0HFLD2WDW01011001BFLD3WDWFLD7

49、BFLD4WDW5,6,7,8,9FLD5WDW5DUP0FLD6WDWFLD6W-FLD1W-FLD7B-FLD1B8。PLENTH的值為22,GE表示該數(shù)據(jù)段的長度9。L的值為710。1MOVA*,OFFSETLNAME2MOVSI,WORDPTRCODE_LIST3CODE_LENGHTEQU$-CODE_LIST11。代碼如下:DATA_SEGSEGMENTDB5DATA_LISTDW0FFFFH,0,2,5,4,5DUP()DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOVA*,5MOVMA*,A*MOVA*,0FF

50、FFHMOVMIN,A*CODE_SEGENDS12。1100252193254843510360FFFFH718313。分別匯編成為:MOVA*,0AHMOVBL,0AHMOVCL,114。1A*=12A*=23C*=14H4D*=32H5C*=115。1操作符錯誤改為:DATA_SEGSEGMENT(2)缺少段名在前面加個段名3引用應該從;開場把那個“/改成“;4構(gòu)造混亂改為:MAIN_PROCPROCFAR。MAIN_PROCENDPEND16。程序框架如下:DATA_SEGSEGMENT;定義數(shù)據(jù)段ORG0E000H;讓下一字節(jié)地址為0E000HFIRST_TYPEEQUTHISWOR

51、D;建立一個與下一存儲單元有一樣段地址和偏移地址的操作數(shù)DATA_GROUPDB100DUP();給DATA_GROUP分配100個字節(jié)的空間DATA_SEGENDS;數(shù)據(jù)段結(jié)束STACK_SEGSEGMENT;定義堆棧段ALIGN16;讓下一字節(jié)從小段首地址開始STACKDB100DUP();為堆棧分配空間STACK_SEGENDS;CODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000H;讓下條指令的第一個字節(jié)從1000H開始START:MOVA*,DATA_SEGMOVDS,A*MOVA*,STACK_SEGMOV

52、SS,A*.CODE_SEGENDSENDSTART;結(jié)束17。程序如下:D_SEGSEGMENT;數(shù)據(jù)段定義AUGENDDD99251D_SEGENDSE_SEGSEGMENT;附加段定義ADDENDDD-15926E_SEGENDSC_SEGSEGMENT;代碼段定義ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGSTART:MOVA*,D_SEGMOVDS,A*MOVA*,E_SEGMOVES,A*MOVEA*,DS:AUGENDADDEA*,ES:ADDENDMOVDS:SUM,EA*C_SEGENDSENDSTART;完畢18。19。需要加上PTR偽操作的有:34;2

53、不需要加,因為B*自動轉(zhuǎn)化為字節(jié)類型5.1試編寫一個匯編語言程序,要求對鍵盤輸入的小寫字母用大寫字母顯示出來.modelsmall.stack100H.codemainprocfarStart:pushd*mova*,0pusha*movah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2int21HretEndstart5.2編寫一個程序,從鍵盤承受一個小寫字母,然后找出它的前導字符和后續(xù)字符,再按順序顯示這三個字符.modelsmall.386.codeMAINPROCFARstart:pushds

54、suba*,a*pusha*input:movah,7Hint21Hcmpe:cmpal,20HJEe*itcmpal,61HJLinputcmpal,7AHJGinputprint:subal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21H;輸出換行回車movdl,0AHmovah,02Hint21Hjmpinpute*it:retMAINENDPENDstart5.3將A*存放器中的16位數(shù)分成4組,每組4位,然后把這四組數(shù)分別放在AL、BL、CL、DL中。

55、.modelsmall.data*DB4dup().stack100H.codeMAINPROCFARstart:pushdsanda*,00Hpusha*mova*,1234Hmovc*,04Hmovsi,00Hlop:pushc*movcl,04Hrola*,clpusha*andal,0FHmovBYTEPTR*si,alpopa*popc*addsi,2Looplopmoval,*movbl,*+2movcl,*+4movdl,*+6print:movah,02Hint21Hmovdl,almovah,02Hint21Hmovdl,blmovah,02Hint21Hmovdl,clmo

56、vah,02Hint21He*it:retMAINENDPENDstart5.4編寫一個程序,要求比擬兩個字符串STRING1和STRING2所含字符是否一樣,假設一樣則顯示MATCH,假設不同在顯示:NOMATCH。.modelsmall.dataSTRING1DBImuststudyhardSTRING2DBImuststudyhard*DBMATCH.$YDBNOMATCH.$.stack100H.codemainprocfarStart:pushd*mova*,0pusha*mova*,datamovds,a*moves,a*leasi,STRING1leadi,STRING2cldm

57、ovc*,(string2-string1)/typeSTRING2retEndstart5.5編寫一個程序,要求能從鍵盤接收一個個位數(shù)N,然后響鈴N次,響鈴的ASCII為07。這題比擬有意思,呵呵。modelsmall.codemainprocfarstart:pushdssuba*,a*pusha*input:movah,01Hint21Hcmpal,20Hjee*itcmpal,30Hjleinputcmpal,3AHjgeinputsubal,30Hmovc*,a*andc*,0FFHlop:movdl,07Hmovah,2Hint21Hlooplopjmpinpute*it:retm

58、ainendpendstart5.6編寫程序,將一個包含有20個數(shù)據(jù)的數(shù)組M分成兩個數(shù)組:正數(shù)數(shù)組和負數(shù)數(shù)組N,并分別把這兩個數(shù)組中的數(shù)據(jù)個數(shù)顯示出來。.modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup()NDB20dup().codeMAINPROCFARstart:PUSHdsANDa*,0PUSHa*MOVa*,datamovds,a*MOVb*,0MOVsi,0MOVdi,0MOVc*,20Dcmpe:CMPMb*,0JLifLowhight:MOVal,byteptrMb

59、*MOVbyteptrPsi,alincsiJMPmonContrlifLow:MOVal,byteptrMb*MOVbyteptrNdi,alINCdimonContrl:INCb*loopcmpemova*,sicallshowNumbercallprintCRmova*,dicallshowNumbere*it:retMAINENDP;注意,ShowNumber這個子過程有問題,請自行修改;showNumberPROCNEARcovernum:DAAMOVd*,a*MOVcl,2Hshow:ROLdl,4Hpushd*ANDdl,0fHADDdl,30HMOVah,02Hint21Hpo

60、pd*loopshowretshowNumberENDP;printCRPROCNEARmovdl,0aHmovah,02Hint21Hmovdl,0dHmovah,02Hint21HretprintCRENDPendstart5.7編制一個匯編語言程序,求出首地址為DATA的100D字數(shù)組中的最小偶數(shù),并把它放在A*中。此題根據(jù)題意要求應該使用完整匯編格式,因為精簡格式也使用DATA.dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論