汇编语言王爽课后答案.docx
《汇编语言王爽课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言王爽课后答案.docx(11页珍藏版)》请在冰豆网上搜索。
汇编语言王爽课后答案
汇编语言王爽课后答案
【篇一:
汇编语言课后习题答案王爽主编】
一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assumecs:
codecodesegmentstart:
movax,2000hmovds,ax
movbx,0s:
movch,0movcl,[bx]jcxzok;当cx=0时,cs:
ip指向okincbxjmpshortsok:
movdx,bxmovax,4c00hint21hcodeendsendstart检测点9.3
补全编程,利用loop指令,实现在内存2000h段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assumecs:
codecodesegmentstart:
movax,2000hmovds,axmovbx,0s:
movcl,[bx]movch,0inccxincbxloopsok:
decbxmovdx,bxmovax,4c00hint21hcodeendsendstart书p101,执行loops时,首先要将(cx)减1。
“loop标号”相当于deccx
if((cx)工0)jmpshort标号
检测点10.1补全程序,实现从内存1000:
0000处开始执行指令。
assumecs:
codestacksegmentdb16dup(0)stackendscodesegmentstart:
movax,stackmovss,axmovsp,16movax,1000hmovax,0pushaxretfcodeendsendstart执行reft指令时,相当于进行:
popippopcs根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。
检测点10.3下面的程序执行后,ax中的数值为多少?
内存地址机器码汇编指令执行后情况1000:
0b80000movax,0ax=0,ip指向1000:
31000:
39a09000010callfarptrspopcs,popip,ip指向1000:
9
1000:
840incax
1000:
958s:
popaxax=8haddax,axax=10hpopbxbx=1000haddax,bxax=1010h用debug进行跟踪确认,“callfarptrs是先”将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。
出栈时,根据栈先进后出的原则,先出的为ip=8h,后出的为cs=
1000h
检测点10.4
下面的程序执行后,ax中的数值为多少?
内存地址机器码汇编指令执行后情况1000:
0b80600movax,6ax=6,ip指向1000:
3
1000:
3ffd0callaxpopip,ip指向1000:
6
1000:
540incax
1000:
658movbp,spbp=sp=fffehaddax,[bp]ax=[6+ds:
(fffeh)]=6+5=0bh用debug进行跟踪确认,“callax(16位reg)”是先将该指令后的第一个字节偏移地址ip入栈,再转到偏移地址为ax(16位reg)处执行指令。
检测点10.5
(1)下面的程序执行后,assumecs:
codestacksegmentdw8dup(0)stackendscodesegmentstart:
movax,stackmovss,axmovsp,16movds,axmovax,0callwordptrds:
[0eh]incaxincaxmovax,4c00hint21hcodeendsendstart推算:
执行callwordptrds:
[0eh]最后ip转移到(ds:
[0eh])ax=3
ax中的数值为多少?
指令时,先cs入栈,再ip=11入栈,(ds:
[0eh])=11h,执行incax?
?
最终
题中特别关照别用debug不住去试试,看是什么结果。
根据单步跟踪发现,执行callwordptrds:
[0eh]指令时,显示ds:
[0eh]=065d。
跟踪,跟踪结果不一定正确,但还是忍
ds:
0000~ds:
0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。
于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完movss,ax;movsp,16这两条指令后,数据段中数据发生改变。
这是为什么呢?
中断呗~~~~
检测点10.5
(2)下面的程序执行后,ax和bx中的数值为多少?
assumecs:
codesg
stacksegmentdw8dup(0)stackendscodesgsegmentstart:
movax,stackmovss,axmovsp,10hmovwordptrss:
[0],offsets;(ss:
[0])=1ahmovss:
[2],cs;(ss:
[2])=cs
calldwordptrss:
[0];cs入栈,ip=19h入栈,转到cs:
1ah处执行指令
;(ss:
[4])=cs,(ss:
[6])=ipnop
s:
movax,offsets;ax=1ahsubax,ss:
[0ch];ax=1ah-(ss:
[0ch])=1ah-19h=1
movbx,cs;bx=cs=0c5bh
subbx,ss:
[0eh];bx=cs-cs=0movax,4c00h
int21hcodesgendsendstartc:
\docume~1\admini~1debugjc10-5.exe-u
0c5b:
0000b85a0cmovax,0c5a
0c5b:
00038ed0movss,ax
0c5b:
0005bc1000movsp,0010
0c5b:
000836ss:
0c5b:
0009c70600001a00movwordptr[0000],001a
0c5b:
000f36ss:
0c5b:
00108c0e0200mov[0002],cs
0c5b:
001436ss:
0c5b:
0015ff1e0000callfar[0000]
0c5b:
001990nop
0c5b:
001ab81a00movax,001a
0c5b:
001d36ss:
0c5b:
001e2b060c00subax,[000c]-u
0c5b:
00228ccbmovbx,cs
0c5b:
002436ss:
0c5b:
00252b1e0e00subbx,[000e]0c5b:
0029b8004cmovax,4c00课程设计一
将实验7中的poweridea公司的数据按照图所示的格式在屏幕上显示现来tablesegment
db1975,1976,1977,1978,1979,1980,1981,1982,1983db1984,1985,1986,1987,1988,1989,1990,1991,1992db1993,1994,1995
dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw11542,14430,15257,17800dw5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239dw260,304,333tableendsdatasegmentdb32dup(0)dataendscodesegmentstart:
movax,datamovds,axmovax,tablemoves,axmovbx,0movsi,0
movdi,0movcx,21movdh,2movdl,30g:
pushcxpushdxmovax,es:
[bx]mov[si],axmovax,es:
[bx].2mov[si].2,ax;年份入ds:
siaddsi,6movax,es:
[bx].84movdx,es:
[bx].86calldtoc2;收入转成十进制字符入ds:
siaddsi,10movax,es:
[di].168movdx,0calldtoc2;人员数转成十进制字符入ds:
siaddsi,6x,es:
[di].210movdx,0
calldtoc2;人均收入转成十进制字符入ds:
simovsi,0;设置ds:
si指向需显示字符首地址b:
movcx,29c:
pushcxmovcl,[si]
jcxzf;(ds:
si)=0转到f执行d:
incsipopcxloopcincsimoval,0
mov[si],al;设置结尾符0
movsi,0;设置ds:
si指向需显示字符首地址popdxmovcl,2callshow_str
addbx,4;dword数据指向下一数据单元adddi,2;word数据指向下一数据单元
adddh,1;指向显存下一行
popcxloopgmovax,4c00hint21hf:
moval,20hmov[si],al;(ds:
si)=0的数据改成空格jmpd
;名称:
dtoc2
;功能:
将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:
(ax)=dword型数据的低16位;;(dx)=dword型数据的高16位;
;ds:
si指向字符串首地址。
;返回:
无。
dtoc2:
pushax
pushbx
pushcx
pushdxpushsipushdimovdi,0d20:
movcx,10;除数为10calldivdw
addcx,30h;余数+30h,转为字符
pushcx;字符入栈
incdi;记录字符个数movcx,ax
jcxzd21;低位商=0时,转到d21检测高位商
jmpd20
d21:
movcx,dx
jcxzd22;高低位商全=0时,转到d22执行
jmpd20
d22:
movcx,di
d23:
popax;字符出栈mov[si],alincsi;ds:
si指向下一单元loopd23
moval,0
mov[si],al;设置结尾符0
popdipopsipopdxpopcxpopbxpopaxret【篇二:
《汇编语言》第二版习题答案(全)王爽编写】
1个cpu的寻址能力为8kb,那么它的地址总线的宽度为13位。
(2)1kb的存储器有1024个存储单元,存储单元的编号从0到1023。
(3)1kb的存储器可以存储8192(2八13)个bit,1024个byte
(4)1gb是1073741824(2A30)个byte、1mb是1048576
(2A20)个byte、1kb是1024(2八10)个byte。
(5)8080、8088、80296、80386的地址总线宽度分别为16根、
20根、24根、32根,则它们的寻址能力分别为:
64(kb)、1
(mb)、16(mb)、4(gb)。
(6)8080、8088、8086、80286、80386的数据总线宽度分别为
8根、8根、16根、16根、32根。
则它们一次可以传送的数据为:
1(b)、1(b)、2(b)、2(b)、4(b)。
(7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。
(8)在存储器中,数据和程序以二进制形式存放。
解题过程:
(1)1kb=1024b,8kb=1024b*8=2An,n=13。
(2)存储器的容量是以字节为最小单位来计算的,1kb=1024b。
(3)8bit=1byte,1024byte=1kb(1kb=1024b=1024b*8bit)。
(4)1gb=1073741824b(即2A30)1mb=1048576b(即2A20)1kb=1024b(即2A10)。
(5)一个cpu有n根地址线,则可以说这个cpu的地址总线的宽度为n。
这样的cpu最多可以寻找2的n次方个内存单元。
(一个内存单元=1byte)。
(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
2b)
(7)8086的数据总线宽度为16根(即一次传送的数据为1024b/2b=512,同理1024b/4b=256。
(8)在存储器中指令和数据没有任何区别,都是二进制信息。
检测点2.1
(1)写出每条汇编指令执行后相关寄存器中的值。
movax,62627ax=f4a3hmovah,31hax=31a3hmoval,23hax=3123haddax,axax=6246hmovbx,826chbx=826chmovcx,axcx=6246hmovax,bxax=826chaddax,bxax=04d8hmoval,bhax=0482hmovah,blax=6c82haddah,ahax=d882haddal,6ax=d888haddal,alax=d810hmovax,cxax=6246hmicrosoft(r)windowsdos(c)copyrightmicrosoftcorp1990-2001.c:
\docume~1\admini~1debug0c1c:
0100movax,f4a30c1c:
0103movah,310c1c:
0105moval,230c1c:
0107addax,ax0c1c:
0109movbx,826c0c1c:
010cmovcx,ax0c1c:
010emovax,bx0c1c:
0110addax,bx0c1c:
0112moval,bh0c1c:
0114movah,bl0c1c:
0116addah,ah0c1c:
0118addal,60c1c:
011aaddal,al0c1c:
011cmovax,cx0c1c:
011e-rax=0000bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0100nvupeiplnznaponc
0c1c:
0100b8a3f4movax,f4a3
-t
ax=f4a3bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0103nvupeiplnznaponc
0c1c:
0103b431movah,31
-t
ax=31a3bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0105nvupeiplnznaponc
0c1c:
0105b023moval,23
-t
ax=3123bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0107nvupeiplnznaponc
0c1c:
010701c0addax,ax
-t
ax=6246bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0109nvupeiplnznaponc
0c1c:
0109bb6c82movbx,826c
-t
ax=6246bx=826ccx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=010cnvupeiplnznaponc
0c1c:
010c89c1movcx,ax
-t
ax=6246bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=010envupeiplnznaponc
0c1c:
010e89d8movax,bx
ax=826cbx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0110nvupeiplnznaponc
0c1c:
011001d8addax,bx
-t
ax=04d8bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0112ovupeiplnzacpecy
0c1c:
011288f8moval,bh
-t
ax=0482bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0114ovupeiplnzacpecy
0c1c:
011488dcmovah,bl
-t
ax=6c82bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0116ovupeiplnzacpecy
0c1c:
011600e4addah,ah
-t
ax=d882bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0118ovupeingnzacpenc
0c1c:
01180406addal,06
-t
ax=d888bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=011anvupeingnznapenc
0c1c:
011a00c0addal,al
-t
ax=d810bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=011covupeiplnzacpocy
0c1c:
011c89c8movax,cx
-t
ax=6246bx=826ccx=6246dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=011eovupeiplnzacpocy
0c1c:
011e0b0corcx,[si]ds:
0000=20cd
-q
检测点2.1
(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
movax,2ax=2
addax,axax=4
addax,axax=8
addax,axax=16
microsoft(r)windowsdos
(c)copyrightmicrosoftcorp1990-2001.c:
\docume~1\admini~1debug
-a
0c1c:
0100movax,2
0c1c:
0103addax,ax
0c1c:
0105addax,ax
0c1c:
0107addax,ax
0c1c:
0109
-r
ax=0000bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0100nvupeiplnznaponc
0c1c:
0100b80200movax,0002
-t
ax=0002bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0103nvupeiplnznaponc
0c1c:
010301c0addax,ax
-t
ax=0004bx=0000cx=0000dx=0000sp=ffeebp=0000si=0000di=0000
ds=0c1ces=0c1css=0c1ccs=0c1cip=0105nvupeiplnznaponc
0c1c:
010501c0addax,ax
-t
ax=000