汇编第二章习题Word文件下载.docx
《汇编第二章习题Word文件下载.docx》由会员分享,可在线阅读,更多相关《汇编第二章习题Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
![汇编第二章习题Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/3/4dc817ef-ff3e-4e96-b07f-b0560c910801/4dc817ef-ff3e-4e96-b07f-b0560c9108011.gif)
(7)movax,[bx][si+1100h]
(1)AX=1200h
(2)AX=0100h
(3)AX=4C2Ah
(4)AX=3412h
(5)AX=4C2Ah
(6)AX=7856h
(7)AX=65B7h
2.8'
DS=1000H,BX=0200H,SI=0002H
(10200H~10205H)依次存有10H,2AH,3CH,46H,59H,6BH
(1)MOVAX,0200H;
AX=0200
(2)MOVAX,[200H]
物理地址=1000H×
10H+0200H=10200H,AX=2A10H
(3)MOVAX,BX;
AX=0200H
(4)MOVAX,3[BX]
10H+0200H+3H=10203H,AX=5946H
(5)MOVAX,[BX+SI]
10H+0200H+2H=10202H,AX=463CH
(6)MOVAX,2[BX+SI]
10H+200H+2H+2H=10204H,AX=6B59H
DS=1000H,ES=2000H,SS=3500H,
SI=00A0H,DI=0024H,BX=0100H,BP=0200H,VAL=0030H
(1)MOVAX,[100H]直接寻址方式,10100H
物理地址=DS×
10H+100H=10000H+0100H=10100H
(2)MOVAX,VAL直接寻址方式,10030H
10H+VAL=10000H+0030H=10030H
(3)MOVAX,[BX]寄存器间接寻址,10100H
10H+BX=10000H+0100H=10100H
(4)MOVAX,ES:
[BX]寄存器间接寻址,20100H
物理地址=ES×
10H+BX=20000H+0100H=20100H
(5)MOVAX,[SI]寄存器间接寻址,100A0H
物理地址=DS×
10H+SI=10000H+00A0H=100A0H
(6)MOVAX,[BX+10H]寄存器相对寻址,10110H
10H+BX+10H=10000H+0100H+10H=10110H
(7)MOVAX,[BP]寄存器间接寻址,35200H
物理地址=SS×
10H+BP=35000H+0200H=35200H
(8)MOVAX,VAL[BP][SI]相对基址变址寻址,352D0H
10H+BP+SI+VAL
=35000H+0200H+00A0H+0030H=352D0H
(9)MOVAX,VAL[BX][DI]相对基址变址寻址,10154H
10H+BX+DI+VAL
=10000H+0100H+0024H+0030H=10154H
(10)MOVAX,[BP][DI]基址变址寻址,35224H
10H+BP+DI
=35000H+0200H+0024H=35224H
说明下列指令中源操作数的寻址方式?
如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。
(1)movdx,[1234h]
(2)movdx,1234h
(3)movdx,bx
(4)movdx,[bx]
(5)movdx,[bx+1234h]
(6)movdx,[bx+di]
(7)movdx,[bx+di+1234h]
(1)直接寻址,EA=1234h
(2)立即数寻址,DX=1234h
(3)寄存器寻址,DX=2000h
(4)间接寻址,EA=2000h
(5)相对寻址,EA=3234h
(6)基址变址寻址,EA=2040h
(7)相对基址变址寻址,EA=3274h
2.9
指出下列指令的错误
(1)movcx,dl
(2)movip,ax
(3)moves,1234h(4)moves,ds
(5)moval,300(6)mov[sp],ax
(7)movax,bx+di(8)mov20h,ah
(1)两操作数类型不匹配
(2)IP指令指针禁止用户访问
(3)立即数不允许传给段寄存器
(4)段寄存器之间不允许传送
(5)两操作数类型不匹配
(6)目的操作数应为[BP]
(7)源操作数应为[BX+DI]
(8)立即数不能作目的操作数
2.9'
(1)xchg[si],30h
(2)popcs
(3)sub[si],[di](4)pushah
(5)adcax,ds(6)add[si],80h
(7)inal,3fch(8)outdx,ah
(1)xchg的操作数不能是立即数
(2不能对CS直接赋值
(3)两个操作数不能都是存储单元
(4)堆栈的操作数不能是字节量
(5)adc的操作数不能是段寄存器
(6)没有确定是字节还是字操作
(7)in不支持超过FFH的直接寻址
(8)out只能以AL/AX为源操作数
(1)MOVDL,AX
错,寄存器寻址方式中,目的操作数与源操作数长度必须一致
(2)MOV8650H,AX
错,目的操作数不可以是立即数
(3)MOVDS,0200H
错,MOV指令不允许将立即数传入段寄存器
(4)MOV[BX],[1200H]
错,MOV指令的两个操作数不能同时为存储器
(5)MOVIP,0FFH
错,IP不能作为MOV指令的目的操作数
(6)MOV[BX+SI+3],IP
错,IP不能作为MOV指令的源操作数
(7)MOVAX,[BX][BP]
错,BX与BP不可以同时出现在源操作数当中
(8)MOVAL,ES:
[BP]对
(9)MOVDL,[SI][DI]
错,SI与DI是两个变址寄存器,不可以同时出现在源操作数中。
(10)MOVAX,OFFSET0A20H
错,OFFSET后面跟的应该是符号地址,再把符号地址的值作为操作数。
(11)MOVAL,OFFSETTABLE
错,TABLE的偏移地址是16位,目的与源长度不一致
(12)XCHGAL,50H
错,交换指令可以在寄存器之间,寄存器和存储器之间进行,不可以是立即数。
(13)INBL,05H
错,BL不能作为IN指令的目的操作数,只能用AL或AX
(14)OUTAL,0FFEH
错,端口地址0FFEH>
FFH,应用DX间接寻址,同时源操作数和目标操作数的位置颠倒了,应改为OUTDX,AL。
2.10
leabx,table;
获取table的首地址,BX=200H
moval,8;
传送欲转换的数字,AL=8
xlat;
转换为格雷码,AL=12H
2.11
给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
moval,89h
addal,al
addal,9dh
cmpal,0bch
subal,al
decal
incal
AL=89hCFZFSFOFPF
AL=12h10011
AL=0afh00101
AL=0afh10101
AL=00h01001
AL=0ffh00101
AL=00h01001
2.12
请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
(1)ADDDX,BX
(2)ADDAL,[BX+SI]
(3)ADD[BX+0B2H],CX
(4)ADDWORDPTR[0520H],3412H
(5)ADDAL,0A0H
2.13
设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
movax,X
imulY
movcx,ax
moxbx,dx
movax,Z
cwd
addcx,ax
adcbx,dx
subcx,540
sbbbx,0
movax,V
subax,cx
sbbdx,bx
idivX
;
为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,D
movax,X;
ax=A
imulY;
dx,ax=A*B(将操作数看作符号数,以下同)
movbx,dx;
bx,ax<
--dx,ax=A*B
movax,Z;
ax=C
cwd;
dx,ax=C(扩展符号后为双字)
adcbx,dx;
bx,cx<
--bx,cx+dx,ax=A*B+C
sbbbx,0;
bx,cx<
--A*B+C-540
movax,V;
ax=D
dx,ax=D(扩展符号后为双字)
subax,cx
sbbdx,bx;
dx,ax=dx,ax-bx,cx=D-(A*B+C-540)
idivX;
运算结果:
[D-(A*B+C-540h)]/A;
ax存商,dx存余数
2.13'
PRINTVALMACROX
LOCALPRINTTEMP2,PRINTT1,PRINTT2,PRINTT3,PRINTT4,PRINTT5
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAX,X
MOVBX,10
MOVDX,0
MOVCX,5
PRINTTEMP2:
DIVBX
LOOPPRINTTEMP2
POPAX
MOVBH,AL
MOVBL,AL
MOVCH,AL
MOVCL,AL
CMPBH,0
JAPRINTT1
CMPBL,0
JAPRINTT2
CMPCH,0
JAPRINTT3
CMPCL,0
JAPRINTT4
JMPPRINTT5
PRINTT1:
MOVDL,BH
ADDDL,30H
MOVAH,02H
INT21H
PRINTT2:
MOVDL,BL
PRINTT3:
MOVDL,CH
PRINTT4:
MOVDL,CL
PRINTT5:
MOVDL,AL
MOVDL,10
MOVDL,13
POPDX
POPCX
POPBX
ENDM
DOSSEG
.MODELTINY
.STACK
.DATA
XDW33
YDW44
ZDW55
VDW8888
.CODE
;
ASSUMECS:
CODE,DS:
DATA
BEGIN:
MOVAX,@DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
[]=============计算=====================[]
MOVAX,X;
AX=X
IMULY;
DX:
AX=X*Y
CLC;
清除进位位
ADDAX,Z;
AX+Z
ADCDX,0;
加上进位位,是1加1,是0不变
CLC
SUBAX,540;
AX-540
SBBBX,0;
同上(X*Y+Z-540)已经计算完毕
MOVDX,V;
DX=V
SUBDX,AX;
(V-(X*Y+Z-541))已经计算完毕
MOVAX,DX;
AX=DX
MOVDX,0;
AX=AX
-------
MOVBX,X;
((X*Y+Z-540)/X)已经计算完毕
IDIVBX
[]============打印======================[]
PRINTVALAX
PRINTVALDX
MOVAH,4CH
ENDBEGIN
结果商=240,余数=1
设X、Y、Z均为双字数据,分别存放在地址为X、X+2;
Y、Y+2;
Z、Z+2的存储单元中,它们的运算结果存入W单元。
阅读如下程序段,给出运算公式。
movdx,X+2
addax,Y
adcdx,Y+2
addax,24
adcdx,0
subax,Z
sbbdx,Z+2
movW,ax
movW+2,dx
W=X+Y+24-Z
2.14
给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
mov
ax,1470h
and
ax,ax
or
xor
not
ax
test
ax,0f0f0h
注意:
1.mov,not指令不影响标志位
2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。
指令
AX的值
CF
OF
SF
ZF
PF
Mov
ax,1407h
1470h
-
And
ax,ax
Or
Xor
1
Not
ax
0ffffh
Test
ax,0f0f0h
0f0f0h
2.16'
段内间接寻址方式的转移指令中转移的有效地址的计算方法:
举例:
指令执行前:
设:
(DS)=2000H,(BX)=1256H,(SI)=528FH,
TABLE=20A1H,
(232F7H)=3280H,(264E5H)=2450H
例1、JMPBX
指令执行后:
(IP)=1256H
例2、JMPWORDPTRTABLE[BX]
PA=16d´
(DS)+(BX)+TABLE=232F7H
(IP)=3280H=(232F7H)
例3、JMPWORDPTR[BX][SI]
PA=16d´
(DS)+(BX)+(SI)=264E5H
(IP)=2450H=(264E5H)
注意:
如果指令操作数已被定义为16位的存储器,则:
WORDPTR可以省去。
2.17
(1)xorax,1e1eh
jeequal
(2)testal,10000001b
jnzthere
(3)cmpcx,64h
1)xorax,1e1eh
;
AX=1e1eh(异或后为0)
(2)testal,10000001b
AL的D0或D7至少有一位为1
(3)cmpcx,64h
jbthere
CX(无符号数)<64h
jbthere
2.18=2.18'
设置CX=0,则LOOP指令将循环多少次?
例如:
movcx,0
delay:
loopdelay
循环次数是2的16次方,即2^16=65536。
2.19
有一个首地址为array的20个字的数组,说明下列程序段的功能。
movcx,20
movax,0
movsi,ax
sum_loop:
addax,array[si]
addsi,2
loopsum_loop
movtotal,ax
答:
将首地址为array得20个字的数组求和,并将结果存入total单元中。
例2.16'
:
假设例题2.32的程序段中,AX=08H,BX=10H,请说明每条指令执行后的结果和各个标志位的状态。
指令注释执行结果CFOFSFZFPF
movsi,axsi=axsi=0008h-----
shlsi,1si=2*axsi=0010h00000
addsi,axsi=3*axsi=0018h00001
movdx,bxdx=bxdx=0010h-----
movcl,03hcl=03h-----
shldx,cldx=8*bxdx=0080h0u000
subdx,bxdx=7*bxdx=0070h00000
adddx,sidx=7*bx+3*axdx=0088h00001
1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。
2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。
根据最高符号位是否改变设置OF,如改变OF=1.
3.‘u’表示无定义,‘-’表示无影响。
2.20
按照下列要求,编写相应的程序段:
⑴起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
movdl,string[1]
movdh,string[6]
⑵有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。
movax,wordptrbuffer1
subax,wordptrbuffer2
先减低16位
movdx,wordptrbuffer1+2
sbbdx,wordptrbuffer2+2
后减高16位,需减低16位的借位
⑶编写一个程序段,在DX高4位全为0时,使AX=0;
否则使AX=-1。
testdx,0f000h
jznext
movax,-1
jmpdone
next:
movax,0
done:
…
⑷把DX.AX中的双字右移4位
movcx,4
again:
shrdx,1;
右移一位,移出的低位进入CF标志
rcrax,1;
将CF移进AX高位,同时实现AX右移
loopagain;
循环4次,实现4位右移
⑸有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。
movcx,100
movbx,0
again