《新版汇编语言程序设计课后答案.doc》由会员分享,可在线阅读,更多相关《新版汇编语言程序设计课后答案.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流新版汇编语言程序设计课后答案.精品文档. 第2章(03)2.12;指令注释执行结果 CF OF SF ZF PF mov si,ax si=ax si=0008h - - - - - shl si,1 si=2*ax si=0010h 0 0 0 0 0 add si,ax si=3*ax si=0018h 0 0 0 0 1 mov dx,bx dx=bx dx=0010h - - - - - mov cl,03h cl=03h - - - - - shl dx,cl dx=8*bx dx=0080h 0 u 0 0 0 sub dx,bx
2、 dx=7*bx dx=0070h 0 0 0 0 0 add dx,si dx=7*bx+3*ax dx=0088h 0 0 0 0 1 注意: 1. 左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。 2. 移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。根据最高符号位是否改变设置OF,如改变 OF=1. 3. u 表示无定义, - 表示无影响。2.13; (1) ;不考虑进位mov bl,al mov cl,3 shl al,cl add al,bl ;shl bl,1 add al,bl ;考虑进位xor ah,ah mov bx,ax
3、mov cl,3 shl ax,cl add ax,bx ;shl bx,1 add ax,bx (2) 数字09的ASCII码是:30h39h 非压缩BCD码的09是:00h09h 方法一: and al,0fh ;实现ASCII到非压缩BCD码的转换 or al,30h ;实现非压缩BCD码到ASCII的转换 方法二: xor al,30h;求反D5D4位,其他不变 ;即高4位为3,则变为0;高4位为0,则变为3 mov cl,4 again: shr dx,1 ;实现逻辑右移 ;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl jnz again 2.14; (1
4、)用sar编写 mov al,0f7h ;-9送al sar al,1 ;结果:al=0fbh即-5 (2)用idiv编写 mov al,0f7h;-9送al cbw ;字节符号扩展位字 mov bl,2 ;注意除数不可为立即数 idiv bl;结果:商为al=fch (-4) ; 余数为ah=ffh (-1)结论:符号数的除法 用idiv 准确 2.19;短转移:指段内128127之间的转移,位移量用一个字节表示 近转移:指段内32K之间的转移,位移量用一个字表示 远转移:指段间1MB范围的转移 段内转移:指在同一个代码段内的转移,可以是短转移或者近转移 段间转移:指转移到另外一个代码段,就
5、是远转移 8086/8088CPU的JMP、CALL和INT n指令可以实现段间转移 第2章(04)2.20; 8086的条件转移的转移范围:在当前指令地址的 +127- -128之内。 如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。2.21; (1)JMP Bx;转移的有效地址EA=BX=1256h (2)JMP tABLEBx ;转移的有效地址EA=ds:20a1h+1256h=232f7=3280h (3)JMP Bxsi;转移的有效地址EA=ds:1256h+528fh=264e5h=2450h2.22; (1) xor ax,1e1eh j
6、e equal ;AX1e1eh(异或后为0) (2)test al,10000001b jnz there ;AL的D0或D7至少有一位为1 (3) cmp cx,64h jb there ;CX(无符号数) 64h 2.23;mov cx,0不循环,因为一进入循环就判 cx=0? 如cx=0 就退出循环 delay:loop delay 2.24; (1)若DX DI,转到above执行 cmp dx,di ja above;jnbe above (2)若AX SI,转到greater执行 cmp ax,si jg greater;jnle greater (3)若CX = 0,转到zer
7、o执行 cmp cx,0 jcxz zero jz zero(4)若AXSI产生溢出,转到overflow执行; cmp ax,di jo overflow (5)若SIAX,转到less_eq执行; cmp si,ax cmp ax,si jle less_eq jge less_eq (6)若DIDX,转到below_eq执行。 cmp di,dx cmp dx,di jbe below_eq jae below_eq2.25; 答:将首地址为array得20个字的数组求和,并将结果存入 total 单元中。 第2章(05)2.26; (1) mov si,0 mov dl,strings
8、i;第1个字符送dl寄存器 mov si,5 mov dh,stringsi;第6个字符送dh寄存器 (2) xor si,si;si清零 mov al,buffersi;第一字节 inc si mov ah,buffersi;第二字节 mov cl,4 shl ah,cl;BCD码移到高半字节 or al,ah;组合成压缩BCD码 mov dl,al;存入dl寄. inc si mov al,buffersi;第三字节 inc si mov ah,buffersi;第四字节 mov cl,4 shl ah,cl;BCD码移到高半字节 or al,ah;组合成压缩BCD码 mov dh,al;
9、存入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个字节 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;加的次数 mov ax,si;第一个数 again: inc si;指向下一个字单元 inc si add ax,si;加下一个数 jnc
10、 noc;无进位转 inc dx;有进位dx=dx+1 noc: dec cx;次数-1 jnz cx,again;非0继续加 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;循环次数 again: dec arraysi dec cx jnz again (8) xor si,si ;si-0 coun: cmp strings
11、i,$ 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 出口参数:AXBCD码和2.24; okmsg db OK, $errmsg db Error ! Overflow !, $ mov ax,X sub ax,Y jo overflow mov dx,offset okmsg jmp
12、 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:数据定义在代码中 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 d
13、b 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之间的字符才是小写字母,转换为大写mov bx,al ; 保存
14、到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21h.exit 0end 第三章(01) 3.1; 硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能; 伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。3.2;3.5; 编辑文本编辑程序汇编语言源程序.asm 汇编汇编程序目标模块文件.obj 连接连接程序可执行文件.exe或.com 调试调试程序应用程序3.6; ;xt236.asm简化段定义格式 .model small ;定义程序的存储模式(小模式) .stack;定
15、义堆栈段(默认1024个字节) .data;定义数据段 str1 ab Input Number:09 : ,0dh,0ah,$str2 ab Error!,0dh,0ah,$ .cade;定义代码段 .startup;说明程序的起始点,建立ds,ss的内容。 mov ah,09h;显示str1字符串 mov dx,offset str1 int 21h gtekey: mov ah,1;调用BIOS判断按键功能 int 16h jz getkey;如 zf = 0,无键按下,等待 cmp al,0;有键按下,键值与0比较 jb error;如 0,出错处理 cmp al, 9 ;有键按下,键
16、值与 9比较 ja error;如 9,出错处理 mov ah,02h;调用DOS显示字符功能,显示该数字 mov dl,al int 21h .exit 0;终止程序执行,返回DOS error: mov ah,09h; 出错,调用DOS 功能显示str2字符串 mov dx,offset str2 int 21h jmp getkey;等待按键 end; 汇编结束3.7; ;xt307.asmstack segment dw 512 dup(?) stack endsdata segmentarray db 255db 0array1 db 255 dup($)array2 db 0dh,
17、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和
18、z之间的字符才是小写字母,转换为大写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超出了一个字节范围 (2) mov bx,offset mywordsi;寄存器的值只有程序执行时才能确定, ;而offset是汇编过程计算偏移地址,故无法确定 ;可以改为lea bx,mywordsi (3) cmp mybyte1,mybyte2;两个都
19、是存储单元,指令不允许 (4) mov al,mybyte1+mybyte2 ;变量值只有执行时才确定,汇编过程不能计算 (5) sub al,myword;字节量AL与字量myword,类型不匹配 (6) jnz myword;Jcc指令只有相对寻址方式,不支持间接寻址方式3.10; 前者为“与”操作硬指令助记符,可汇编成机器代码。 后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。3.11; 注:对于逻辑运算,有关操作数可化为二进制数。 (1)mov al,23h AND 45h OR 67h; 67h (2)mov ax,1234h/16 + 1Oh; 133h (3)mov ax
20、,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; 假设block开始的数据块有32个字节数据:16个正数+100 (64h),16个负数 -48 (0doh) 分别连续分布:
21、block db 16 dup(100),16 dup(-48) ;也可以是任意字节数据,随意分布。 dplus db 32 dup(?);为正数预留存储空间 dminus db 32 dup(?);为负数预留存储空间 count equ 32;字节数 第三章(02) 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.1
22、8; 段地址:表示标号所在代码段的段地址; 偏移地址:表示标号所在代码段的段内偏移地址; 类型:引用该标号时,表示它所在同一个段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 VA
23、RD;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 _DA
24、TA 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(?) stac
25、k 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;
26、定义堆栈段大小为256个字节 .data anum dd 11223344h;定义两个双字的数(随意) bnum dd 77553311h sum dd ?;定义结果,执行后为:88776655h .code .startup xor si, si;相对于变量的位移量清零 mov cx, 2;分高低字分别相加,共两次 clc;清零cf again:mov ax, anumsi;取第一个数的一个字(先低字后高字) adc ax, bnumsi;取第二个数的一个字(先低字后高字) mov sumsi, ax;存和的一个字(先低字后高字) inc si;修改位移量指向下一个字(加2) inc si
27、loop again;cx=cx-1 ,if cx0 ,jump again .exit 0 end 3.28; .startup xor si, si;位移量清零 mov al, bdatasi;取第一个数 mov cx, num-1;累加次数 again: inc si;指向下一个数 adc al, bdatasi;累加 loop again;如未完,继续累加 mov sum, al;完了,存结果 .exit 0 end第四章4.3; 思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。这里仅列出代码段: mov bl, al;将al中的两组分开 and al, 0fh;屏蔽
28、高四位后送al mov cl, 4;原al中的数据逻辑右移4次送bl shr bl, cl mov dl, ah;将ah中的两组分开 and dl, 0f0h;屏蔽低高四位后送dl mov cl, 4;原ah中的数据逻辑右移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;是小写字母转换为大写字母 mov ah, 09h;显示 int
29、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;调用输入一个字符 int 21h;输入一个字符存在al中 cmp al, 1;判该字符,如不在1-9 jb again;重新输入
30、cmp al, 9 ja again and al,0fh;在1-9,屏蔽高4位 mov cx, al;振铃次数送cx .repeat mov dl, 07h;调用一次振铃 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
31、,0; adc dx,0 inc bx; inc bx inc bx; inc bx loop again; loop again ret; ret ENDP crazy; crazy ENDP425;子程序中又调用子程序就形成子程序嵌套。 子程序中直接或间接调用该子程序本身就形成子程序递归。426; .model small .stack 256 .data stdng db HeLLO eveRyboDy ! , 0 .code .startup mov bx, offset atring again: mov al, bx call chan;调用过程 mov bx , al next: inc bx jmp againdone: .exit 0chan proc;大写转换为小写字母的过程 or al, al jz done cmp al