钱晓捷新版汇编语言程序设计习题答案
第一章 汇编语言基础知识
1.17、举例说明CF和OF标志的差异。
溢出标志OF和进位标志CF是两个意义不同的标志
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确?例1:3AH + 7CH=B6H 无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出?例2:AAH + 7CH=(1)26H 无符号数运算:170+124=294,范围外,有进位 有符号数运算:-86+124=28 ,范围内,无溢出
1.20、8086有哪4种逻辑段,各种逻辑段分别是什么用途?(解答)
代码段(Code Segment)用来存放程序的指令序列。处理器利用CS : IP取得下一条要执行的指令
?堆栈段(Stack Segment)确定堆栈所在的主存区域。处理器利用SS : SP操作堆栈中的数据
?数据段(Data Segment)存放当前运行程序所用的数据。处理器利用DS : EA存取数据段中的数据
?附加段(Extra Segment)是附加的数据段,也用于数据的保存。处理器利用ES : EA存取数据段中的数据
第二章8086指令系统
2.1已知DS = 2000H、BX = 0100H、SI = 0002H,存储单元[20100H] ~ [20103H]依次存放12 34 56 78H,[21200H] ~ [21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
(1) mov ax,1200h ;AX=1200h (2) mov ax,bx ; AX=0100h (3) mov ax,[1200h] ; AX=4C2Ah (4) mov ax,[bx] ; AX=3412h (5) mov ax,[bx+1100h] ; AX=4C2Ah (6) mov ax,[bx+si] ; AX=7856h (7) mov ax,[bx][si+1100h] ; AX=65B7h
2.2指出下列指令的错误
(1) mov cx,dl 两操作数类型不匹配
第 1 页 共 23 页
(2) mov ip,ax IP 指令指针禁止用户访问 (3) mov es,1234h 立即数不允许传给段寄存器 (4) mov es,ds 段寄存器之间不允许传送 (5) mov al,300 两操作数类型不匹配 (6) mov [sp],ax 目的操作数应为[ BP ] (7) mov ax,bx+di 源操作数应为 [BX+DI] (8) mov 20h,ah 立即数不能作目的操作数
2.3已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。 lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H
2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令? 堆栈是一种按“先进后出”原则存取数据的存储区域。 堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
2.5已知SS = FFA0H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化? mov ax,8057h push ax mov ax,0f79h
push ax
pop bx ;bx=0f79h
第 2 页 共 23 页
pop [bx] ;DS:[0f79h]=8057h
2.6 给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态: mov al,89h AL=89h CF ZF SF OF PF add al,al AL=12h 1 0 0 1 1 add al,9dh AL=0afh 0 0 1 0 1 cmp al,0bch AL=0afh 1 0 1 0 1 sub al,al AL=00h 0 1 0 0 1 dec al AL=0ffh 0 0 1 0 1 inc al AL=00h 0 1 0 0 1
2.7 设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。 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
2.8请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。 ADD DX,BX (2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 ADD AL,[BX+SI]
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。 ADD [BX+0B2H],CX
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。 ADD WORD PTR [0520H],3412H
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 ADD AL,0A0H
第 3 页 共 23 页
2.9;设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。 为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,D mov ax,X ;ax=A
imul Y ;dx,ax = A*B (将操作数看作符号数,以下同) 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<-- A*B+C-540 mov ax, V ;ax= D
cwd ;dx,ax= D (扩展符号后为双字) sub ax, cx
sbb 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 [si],30h xchg的操作数不能是立即数 (2 ) pop cs 不能对CS直接赋值
(3) sub [si],[di] 两个操作数不能都是存储单元 (4)push ah 堆栈的操作数不能是字节量 (5) adc ax,ds adc的操作数不能是段寄存器 (6) add [si],80h 没有确定是字节还是字操作 (7) in al,3fch in不支持超过FFH的直接寻址 (8) out dx,ah out只能以AL/AX为源操作数
2.11; 给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。 指令 AX的值 CF OF SF ZF PF Mov ax,1407h 1470h - - - - - And ax,ax 1470h 0 0 0 0 0 Or ax,ax 1470h 0 0 0 0 0 Xor ax,ax 0 0 0 0 1 1 Not ax 0ffffh - - - - - Test ax,0f0f0h 0ffffh 0 0 1 0 1 注意: 1. mov, not指令不影响标志位
第 4 页 共 23 页
2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。
2.12; 假设例题2.32的程序段中,AX = 08H,BX = 10H,请说明每条指令执行后的结果和各个标志位的状态。
指令 注释 执行结果 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 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) 用位操作指令实现AL(无符号数)乘以10 ;不考虑进位mov bl,al mov cl,3 shl al,cl
add al,bl ;shl bl,1 add al,bl
;考虑进位xor ah,ah mov bx,ax mov cl,3 shl ax,cl
add ax,bx ;shl bx,1 add ax,bx
(2) 用逻辑运算指令实现数字0 ~ 9的ASCII码与非压缩BCD码的互相转换 数字0~9的ASCII码是:30h~39h
第 5 页 共 23 页
钱晓捷新版汇编语言程序设计习题答案(1-4)



