汇编语言程序设计(第二版) 钱晓捷习题答案第二章(01)2.1(1)AX=1200h(2)AX=0100h(3)AX=4C2Ah(4)AX=3412h(5)AX=4C2Ah(6)AX=7856h(7)AX=65B7h2.2(1) 两操作数类型不匹配(2) IP指令指针禁止用户访问(3) 立即数不允许传给段寄存器(4) 段寄存器之间不允许传送(5) 两操作数类型不匹配(6) 目的操作数应为[ BP ](7) 源操作数应为[BX+DI](8) 立即数不能作目的操作数2.3lea bx,table ;获取table的首地址,BX=200Hmov al,8 ;传送欲转换的数字,AL=8xlat ;转换为格雷码,AL=12H2.4堆栈是一种按“先进后出”原则存取数据的存储区域。
堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
2.5mov ax,8057hpush axmov ax,0f79hpush axpop bx ;bx=0f79hpop [bx] ;DS:[0f79h]=8057h2.6AL=89h CF ZF SF OF PFAL=12h 1 0 0 1 1AL=0afh 0 0 1 0 1AL=0afh 1 0 1 0 1AL=00h 0 1 0 0 1AL=0ffh 0 0 1 0 1AL=00h 0 1 0 0 12.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,0A0H2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,Dmov ax,X ;ax=Aimul Y ;dx,ax = A*B (将操作数看作符号数,以下同)mov cx,axmov bx,dx ;bx,ax <-- dx,ax =A*Bmov ax,Z ;ax = Ccwd ;dx,ax =C (扩展符号后为双字)add cx,axadc bx,dx ;bx,cx <-- bx,cx+dx,ax=A*B+Csub cx,540sbb bx,0 ;bx,cx<-- A*B+C-540mov ax, V ;ax= Dcwd ;dx,ax= D (扩展符号后为双字)sub ax, cxsbb dx, bx ;dx,ax = dx,ax - bx,cx = D-(A*B+C-540)idiv X ;运算结果:[D-(A*B+C-540h)]/A ;ax存商,dx存余数2.10;(1)xchg的操作数不能是立即数(2不能对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数第二章(02)2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。
第2章(03)1. 左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。
2. 移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。
根据最高符号位是否改变设置OF,如改变OF=1.3. ‘ u ’表示无定义,‘ - ’表示无影响。
2.13; (1);不考虑进位mov bl,almov cl,3shl al,cladd al,bl ;shl bl,1add al,bl;考虑进位xor ah,ahmov bx,axmov cl,3shl ax,cladd ax,bx ;shl bx,1add ax,bx(2)数字0~9的ASCII码是:30h~39h非压缩BCD码的0~9是:00h~09h方法一:and al,0fh ;实现ASCII到非压缩BCD码的转换or al,30h ;实现非压缩BCD码到ASCII的转换方法二:xor al,30h ;求反D5D4位,其他不变;即高4位为3,则变为0;高4位为0,则变为3mov cl,4again: shr dx,1 ;实现逻辑右移;采用“sar dx,1”,则实现算术右移rcr ax,1dec cljnz again2.14; (1)用sar编写2.20; 8086的条件转移的转移范围:在当前指令地址的+127---- -128之内。
如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。
2.21; (1)JMP Bx ;转移的有效地址EA=BX=1256h(2)JMP tABLE[Bx] ;转移的有效地址EA=[ds:20a1h+1256h]=[232f7]=3280h(3)JMP [Bx][si] ;转移的有效地址EA=[ds:1256h+528fh]=264e5h=2450h2.22; (1) xor ax,1e1ehje equal;AX=1e1eh(异或后为0)(2)test al,10000001bjnz there;AL的D0或D7至少有一位为1(3) cmp cx,64hjb there;CX(无符号数)< 64h2.23;mov cx,0 不循环,因为一进入循环就判cx=0? 如cx=0 就退出循环delay:loop delay2.24; (1)若DX > DI,转到above执行cmp dx,dija above ;=jnbe above(2)若AX > SI,转到greater执行cmp ax,sijg greater ;=jnle greater(3)若CX = 0,转到zero执行cmp cx,0 jcxz zerojz zero(4)若AX-SI产生溢出,转到overflow执行;cmp ax,dijo overflow(5)若SI≤AX,转到less_eq执行;cmp si,axcmp ax,sijle less_eqjge less_eq(6)若DI≤DX,转到below_eq执行。
cmp di,dxcmp dx,dijbe below_eqjae below_eq2.25; 答:将首地址为array得20个字的数组求和,并将结果存入total 单元中。
2.26; (1)mov si,0mov dl,string[si] ;第1个字符送dl寄存器mov si,5mov dh,string[si] ;第6个字符送dh寄存器(2)xor si,si ;si清零mov al,buffer[si] ;第一字节inc simov ah,buffer[si] ;第二字节mov cl,4shl ah,cl ;BCD码移到高半字节or al,ah ;组合成压缩BCD码mov dl,al ;存入dl寄..inc simov al,buffer[si] ;第三字节inc simov ah,buffer[si] ;第四字节mov cl,4shl ah,cl ;BCD码移到高半字节or al,ah ;组合成压缩BCD码mov dh,al ;存入dh寄..(3)test dx,0f000hjz zeromov ax,-1jmp donezero: mov ax,0done: ret(4)lea bx,buffer1lea dx,buffer2mov cx,8 ;8个字节xor si,si ;si=0clc ;CF=0(5)mov ax,0b800hmov ds,ax ;段地址xor si,si ;地址偏移量si=0xor dx,dx ;和的高字dx=0mov cx,99 ;加的次数mov ax,[si] ;第一个数again: inc si ;指向下一个字单元inc siadd ax,[si] ;加下一个数jnc noc ;无进位转inc dx ;有进位dx=dx+1noc: dec cx ;次数-1jnz cx,again ;非0继续加ret(6)mov si,offset stringmov cx,8000h ;32k=2^15=8000hagain: cmp [si],’$’jnz nextmov [si],20h ;if [si]=’$’ [si]<-- ’ ’next: inc siloop again(7)xor si,si ;si<--0mov cx,100 ;循环次数again: dec array[si]dec cxjnz again(8)xor si,si ;si<--0coun: cmp string[si],’$’je doneinc sijmp coundone: ret2..27; (1)使CF=0 :clc ;and ax,ax ;or ax,ax(2)使AX=0 :xor ax,ax ;and ax,0 ;mov ax,0(3)同时使AX=0和CF=0:and ax,0 ;xor ax,ax ;sub ax,ax2.29; 压缩BCD码加法:AX←AX+BX出口参数:AX=BCD码和2.34; okmsg db ‘OK’, ‘$’errmsg db ‘Error ! Overflow !’, ‘$’…mov ax,Xsub ax,Yjo overflowmov dx,offset okmsgjmp nextoverflow: mov dx,errmsgnext: mov ah,9int 21h错误:mov ax,Xsub ax,Yjo overflowmov dx,offset okmsgokmsg db ‘OK’, ‘$’mov dx,errmsg ;错误1:数据定义在代码中mov ah,9int 21hoverflow: errmsg db ‘Error ! Overflow !’, ‘$’mov dx,errmsg ; 错误2:缺少JMP指令mov ah,9int 21h2.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,[bx]cmp al,'$'jz donecmp al,'a' ; 小于a和大于z的字符不是小写字母jb nextcmp al,'z'ja nextsub al,20h ; 在a和z之间的字符才是小写字母,转换为大写mov [bx],al ; 保存到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21h.exit 0end第三章(01)3.1; 硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。