汇编课后答案.docx

上传人:b****6 文档编号:3822108 上传时间:2022-11-25 格式:DOCX 页数:77 大小:184.24KB
下载 相关 举报
汇编课后答案.docx_第1页
第1页 / 共77页
汇编课后答案.docx_第2页
第2页 / 共77页
汇编课后答案.docx_第3页
第3页 / 共77页
汇编课后答案.docx_第4页
第4页 / 共77页
汇编课后答案.docx_第5页
第5页 / 共77页
点击查看更多>>
下载资源
资源描述

汇编课后答案.docx

《汇编课后答案.docx》由会员分享,可在线阅读,更多相关《汇编课后答案.docx(77页珍藏版)》请在冰豆网上搜索。

汇编课后答案.docx

汇编课后答案

1、什么是堆栈他的工作原则是什么它的基本操作有哪两个对应哪两种指令

堆栈是一种按“先进后出”原则存取数据的存储区域。

堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

第2章8086的指令系统

〔习题〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后AX寄存器的内容。

(1)movax,1200h

(2)movax,bx

(3)movax,[1200h]

(4)movax,[bx]

(5)movax,[bx+1100h]

(6)movax,[bx+si]

(7)movax,[bx][si+1100h]

〔解答〕

(1)AX=1200H

(2)AX=0100H

(3)AX=4C2AH;偏移地址=bx=0100h

(4)AX=3412H;偏移地址=bx=0100h

(5)AX=4C2AH;偏移地址=bx+1100h=1200h

(6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h

(7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h

〔习题〕指出下列指令的错误

(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)目的操作数应为[SI]

(7)源操作数应为[BX+DI]

(8)立即数不能作目的操作数

〔习题〕已知数字0~9对应的格雷码依次为:

18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。

请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。

leabx,table

moval,8

xlat

〔解答〕

leabx,table;获取table的首地址,BX=200H

moval,8;传送欲转换的数字,AL=8

xlat;转换为格雷码,AL=12HP35

〔习题〕什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令

〔解答〕

堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

〔习题〕已知SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化

movax,8057h

pushax

movax,0f79h

pushax

popbx

pop[bx]

〔解答〕

movax,8057h

pushax

movax,0f79h

pushax

popbx;bx=0f79h

pop[bx];DS:

[0f79h]=8057h

〔习题〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:

moval,89h

addal,al

addal,9dh

cmpal,0bch

subal,al

decal

incal

〔解答〕

moval,89h;AL=89hCFZFSFOFPF

addal,al;AL=12h10011

;10001001

+10001001

100010010

addal,9dh;AL=0afh00101

;00010010

+10011101

10101111

cmpal,0bch;AL=0afh10101

;10101111

-10111100

*01000011

subal,al;AL=00h01001

decal;AL=0ffh00101

;00000000

-00000001

*11111111

incal;AL=00h01001

;11111111

+00000001

*11111111

 

〔习题〕设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。

阅读如下程序段,给出运算公式。

movax,X

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

〔习题〕请分别用一条汇编语言指令完成如下功能:

(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

〔习题〕设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。

movax,X;ax=X

imulY;=X*Y

movcx,ax;cx=X*Y的低16位

moxbx,dx;bx=X*Y的高16位

movax,Z;ax=Z

cwd

addcx,ax;cx=Z的低16位+X*Y的低16位

adcbx,dx;bx=Z的高16位+X*Y的高16位+低位进位

subcx,540;cx=Z的低16位+X*Y的低16位-540

sbbbx,0;bx=Z的高16位+X*Y的高16位+低位进位-低位借位

movax,V;ax=V

cwd

subax,cx;ax=V的低16位-(Z的低16位+X*Y的低16位-540)

sbbdx,bx;dx=V的高16位-(Z的高16位+X*Y的高16位+低位进位-低位借位)-低位借位

idivX;/X

〔解答〕

[V-(X*Y+Z-540)]/X

AX存商,DX存余数

〔习题〕指出下列指令的错误:

(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为源操作数

〔习题〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。

movax,1470h

andax,ax

orax,ax

xorax,ax

notax

testax,0f0f0h

〔解答〕

movax,1470h;AX=1470HCFZFSFOFPF

andax,ax;AX=1470H00000

;0001010001110000

orax,ax;AX=1470H00000

xorax,ax;AX=0000H01001

notax;AX=FFFFH01001

testax,0f0f0h;AX=FFFFH00101

注意:

MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。

〔习题〕假设例题的程序段中,AX=08H,BX=10H,请说明每条指令执行后的结果和各个标志位的状态。

〔解答〕

指令;执行结果CFOFSFZFPF

movsi,ax;SI=AX=0008H-----

shlsi,1;SI=2*AX=0010H00000

addsi,ax;SI=3*AX=0018H00001

movdx,bx;DX=BX=0010H00001

movcl,03h;CL=03H00001

shldx,cl;DX=8*BX=0080H0u000

subdx,bx;DX=7*BX=0070H00000

adddx,si;DX=7*BX+3*AX=0088H00001

注意:

逻辑左移N次相当于无符号整数乘以2的N次方,逻辑右移N次相当于无符号整数除以2的N次方。

移位指令根据移位的数据设置CF,根据移位后的结果影响SF,ZF,PF。

在进行一位移位时,根据最高符号位是否改变设置OF,如改变则OF=1。

另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。

〔习题〕编写程序段完成如下要求:

(1)用位操作指令实现AL(无符号数)乘以10

(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换

(3)把中的双字右移4位

〔解答〕

(1);不考虑进位

movbl,al

movcl,3

shlal,cl;*8

addal,bl;shlbl,1

addal,bl

;考虑进位

xorah,ah

movbx,ax

movcl,3

shlax,cl

addax,bx;shlbx,1

addax,bx

(2)数字0~9的ASCII码是:

30h~39h

非压缩BCD码的0~9是:

00h~09h

方法一:

andal,0fh;实现ASCII到非压缩BCD码的转换

oral,30h;实现非压缩BCD码到ASCII的转换

方法二:

xoral,30h;求反D5D4位,其他不变

;即高4位为3,则变为0;高4位为0,则变为3

(3)movcl,4

again:

shrdx,1;实现逻辑右移

;采用“sardx,1”,则实现算术右移

rcrax,1

deccl

jnzagain

〔习题〕已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么

〔解答〕

(1)用sar编写

moval,0f7h;-9送AL11111001

saral,1;结果:

AL=11111100B=0FBH即-5

(2)用idiv编写

moval,0f7h;-9送al

cbw;字节符号扩展位字

movbl,2;注意除数不可为立即数

idivbl;结果:

商为al=fch(-4)

;余数:

ah=ffh(-1)

结论:

符号数的除法用idiv准确。

〔习题〕已知数据段500h~600h处存放了一个字符串,说明下列程序段执行后的结果:

movsi,600h

movdi,601h

movax,ds

moves,ax

movcx,256

std

repmovsb

〔解答〕

〔习题〕说明下列程序段的功能

cld

movax,0fefh

movcx,5

movbx,3000h

moves,bx

movdi,2000h

repstosw

〔解答〕

将es:

di(即3000:

2000h或32000h)开始的5个单元的内容置为0fefh。

〔习题〕指令指针IP是通用寄存器还是专用寄存器有指令能够直接它赋值吗哪类指令的执行会改变它的值

〔解答〕

指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。

有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。

〔习题〕控制转移类指令中有哪三种寻址方式

〔解答〕

控制转移类指令的寻址方式:

相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。

〔习题〕什么是短转移shortjump、近转移nearjump和远转移farjump什么是段内转移和段间转移8086有哪些指令可以实现段间转移

〔解答〕

短转移:

指段内-128~127之间的转移,位移量用一个字节表示

近转移:

指段内±32K之间的转移,位移量用一个字表示

远转移:

指段间1MB范围的转移

段内转移:

指在同一个代码段内的转移,可以是短转移或者近转移

段间转移:

指转移到另外一个代码段,就是远转移

8086/8088CPU的JMP、CALL和INTn指令可以实现段间转移

〔习题〕8086的条件转移指令的转移范围有多大实际编程时,你如何处理超出范围的条件转移

〔解答〕

8086的条件转移的转移范围:

在当前指令地址的+127~-128之内。

如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。

〔习题〕假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么

(1)JMPBX

(2)JMPTABLE[BX]

(3)JMP[BX][SI]

〔解答〕

(1)转移的有效地址EA=BX=1256H

(2)转移的有效地址EA=[DS:

20A1H+1256H]=[232F7]=3280H

(3)转移的有效地址EA=[DS:

1256H+528FH]=264E5H=2450H

〔习题〕判断下列程序段跳转的条件

(1)xorax,1e1eh

jeequal

(2)testal,b

jnzthere

(3)cmpcx,64h

jbthere

〔解答〕

(1)AX=1e1eh(异或后为0)

(2)AL的D0或D7至少有一位为1

(3)CX(无符号数)<64h

〔习题〕设置CX=0,则LOOP指令将循环多少次例如:

movcx,0

delay:

loopdelay

〔解答〕

216次。

〔习题〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:

(1)若DX>DI,转到above执行;

(2)若AX>SI,转到greater执行;

(3)若CX=0,转到zero执行;

(4)若AX-SI产生溢出,转到overflow执行;

(5)若SI≤AX,转到less_eq执行;

(6)若DI≤DX,转到below_eq执行。

〔解答〕

(1)若DX>DI,转到above执行

cmpdx,di

jaabove;=jnbeabove

(2)若AX>SI,转到greater执行

cmpax,si

jggreater;=jnlegreater

(3)若CX=0,转到zero执行

cmpcx,0

jzzero;=jcxzzero

(4)若AX-SI产生溢出,转到overflow执行;

cmpax,si

jooverflow

(5)若SI≤AX,转到less_eq执行;

cmpsi,ax;cmpax,si

jleless_eq;jgeless_eq

(6)若DI≤DX,转到below_eq执行。

cmpdi,dx;cmpdx,di

jbebelow_eq;jaebelow_eq

〔习题〕有一个首地址为array的20个字的数组,说明下列程序段的功能。

movcx,20

movax,0

movsi,ax

sum_loop:

addax,array[si]

addsi,2

loopsum_loop

movtotal,ax

〔解答〕

将首地址为array得20个字的数组求和,并将结果存入total单元中。

〔习题〕按照下列要求,编写相应的程序段:

(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。

(2)从主存buffer开始的4个字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将它们合并到DX中。

(3)编写一个程序段,在DX高4位全为0时,使AX=0;否则使AX=-1。

(4)有两个64位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成buffer1-buffer2功能。

(5)假设从B800h:

0开始存放有100个16位无符号数,编程求它们的和,并把32位的和保存在中。

(6)已知字符串string包含有32KB内容,将其中的’$’符号替换成空格。

(7)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。

(8)统计以’$’结尾的字符串srting的字符个数。

〔解答〕

(1)解答:

movsi,0

movdl,string[si];第1个字符送dl寄存器:

movdl,stirng[0]

movsi,5

movdh,string[si];第6个字符送dh寄存器:

movdl,stirng[5]

(2)解答:

xorsi,si;si清零

moval,buffer[si];第一字节

incsi

movah,buffer[si];第二字节

movcl,4

shlah,cl;BCD码移到高半字节

oral,ah;组合成压缩BCD码

movdl,al;存入dl寄..

incsi

moval,buffer[si];第三字节

incsi

movah,buffer[si];第四字节

movcl,4

shlah,cl;BCD码移到高半字节

oral,ah;组合成压缩BCD码

movdh,al;存入dh寄..

(3)解答:

testdx,0f000h;testdh,0f0h

jznext;jnznext

movax,-1;movax,0

jmpagain

next:

movax,0;movax,0ffffh

again:

...

(4)解答:

movax,wordptrbuffer1

subax,wordptrbuffer2;先减低16位

movdx,wordptrbuffer1+2

sbbdx,wordptrbuffer2+2;后减高16位,需减低16位的借位

(5)解答:

movax,0b800h

movds,ax;段地址

xorsi,si;地址偏移量si=0

xordx,dx;和的高字dx=0

movcx,99;加的次数

movax,[si];第一个数

again:

incsi;指向下一个字单元

incsi

addax,[si];加下一个数

jncnoc;无进位转

incdx;有进位dx=dx+1

noc:

deccx;次数-1

jnzcx,again;非0继续加

(6)解答1:

不使用串操作指令(更好)

movsi,offsetstring

movcx,8000h;32k=2^15=8000h

again:

cmpbyteptr[si],‘$’;‘$’=24h

jnznext;不要采用jz进行分支

movbyteptr[si],‘’;‘’=20h

next:

incsi

loopagain;deccx

;jnzagain

(6)解答2:

使用串操作指令

movdi,offsetstring

moval,’$’

movcx,8000h

cld

again:

scasb

jnznext

movbyteptres:

[di-1],‘’

next:

loopagain

(7)解答1:

movsi,offsetarray

movcx,100

again:

decbyteptr[si]

incsi

loopagain

(7)解答2:

xorsi,si;si<--0

movcx,100;循环次数

again:

decarray[si]

incsi

loopagain

(7)解答3:

movsi,offsetarray

movdi,si

movax,ds

moves,ax

movcx,100

cld

again:

lodsb

decal

stosb

loopagain

(8)解答:

xorsi,si;si<--0

coun:

cmpstring[si],'$'

jedone

incsi

jmpcoun

done:

...

〔习题〕对下面要求,分别给出3种方法,每种方法只用一条指令。

(1)使CF=0

(2)使AX=0(3)同时使AX=0和CF=0

〔解答〕

(1)解答:

clc

andax,ax

orax,ax

(2)解答:

xorax,ax

andax,0

movax,0

(3)解答:

andax,0

xorax,ax

subax,ax

〔习题〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。

其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。

〔解答〕

主程序转子suba时段内调用:

断点1为2000h:

0400h+3,

转子是只将IP压栈。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1