钱晓捷新版汇编语言程序设计习题答案
第1章 汇编语言基础知识
1.17、举例说明CF和OF标志的差异。
 溢出标志OF和进位标志CF是两个意义不同的标志
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确13AH + 7CHB6H
无符号数运算:58124182,范围内,无进位
有符号数运算: 58124182 ,范围外,有溢出2AAH + 7CH=(126H
无符号数运算:170124294,范围外,有进位
有符号数运算:-8612428 ,范围内,无溢出
1.20、8086有哪4种逻辑段,各种逻辑段分别是什么用途?(解答) 
代码段(Code Segment)用来存放程序的指令序列。处理器利用CS : IP取得下一条要执行的指令
堆栈段(Stack Segment)确定堆栈所在的主存区域。处理器利用SS : SP操作堆栈中的数据
数据段(Data Segment)存放当前运行程序所用的数据。处理器利用DS : EA存取数据段中的数据
附加段(Extra Segment)是附加的数据段,也用于数据的保存。处理器利用ES : EA存取数据段中的数据
第二章8086指令系统
2.1已知DS  2000HBX = 0100HSI = 0002H,存储单元[20100H] ~ [20103H]依次存放12 34 56 78H[21200H] ~ [21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
    1字符串长度可以为1吗 mov ax,1200h          ;AX1200h 
    2 mov ax,bx              ; AX0100h 
    3 mov ax,[1200h]          ; AX4C2Ah 
    4 mov ax,[bx]            ; AX3412h 
    5 mov ax,[bx+1100h]      ; AX4C2Ah 
    6 mov ax,[bx+si]          ; AX7856h 
    7 mov ax,[bx][si+1100h]    ; AX65B7h 
2.2指出下列指令的错误
(1)  mov cx,dl         两操作数类型不匹配 
(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对应的格雷码依次为:18H34H05H06H09H0AH0CH11H12H14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
lea bx,table ;获取table的首地址,BX200H 
mov al,8 ;传送欲转换的数字,AL
xlat ;转换为格雷码,AL12H 
2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?
堆栈是一种按先进后出原则存取数据的存储区域。 
堆栈的两种基本操作是压栈和出栈,对应的指令是PUSHPOP
2.5已知SS = FFA0HSP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如
何变化?
mov ax,8057h 
push ax 
mov ax,0f79h 
push ax 
pop bx    ;bx=0f79h 
pop [bx]  ;DS:[0f79h]=8057h 
2.6 给出下列各条指令执行后AL值,以及CFZFSFOFPF的状态:
 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 XYZ均为双字数据,分别存放在地址为XX+2YY+2ZZ+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)用寄存器BXSI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。    ADD AL,[BX+SI] 
3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。  ADD [BX+0B2H],CX
4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。    ADD WORD PTR [0520H],3412H
5)把数0A0HAL寄存器的内容相加,并把结果送回AL中。  ADD AL,0A0H 
2.9XYZV均为16位带符号数,分别装在XYZV存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
为了避免与操作数地址混淆,将题中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]        两个操作数不能都是存储单元 
4push 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; 给出下列各条指令执行后的结果,以及状态标志CFOFSFZFPF的状态。 指令 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指令不影响标志位 
2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。
 
2.12; 假设例题2.32的程序段中,AX = 08HBX = 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。