汇编语言王爽课后答案.docx
《汇编语言王爽课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言王爽课后答案.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言王爽课后答案
汇编语言王爽课后答案
【篇一:
汇编语言课后习题答案王爽主编】
一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assumecs:
code
codesegment
start:
movax,2000h
movds,ax
movbx,0s:
movch,0movcl,[bx]jcxzok;当cx=0时,cs:
ip指向okincbx
jmpshorts
ok:
movdx,bx
movax,4c00h
int21h
codeends
endstart
检测点9.3
补全编程,利用loop指令,实现在内存2000h段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assumecs:
code
codesegment
start:
movax,2000h
movds,ax
movbx,0
s:
movcl,[bx]
movch,0inccx
incbx
loops
ok:
decbx
movdx,bx
movax,4c00h
int21h
codeends
endstart
书p101,执行loops时,首先要将(cx)减1。
“loop标号”相当于
deccx
if((cx)≠0)jmpshort标号
检测点10.1
补全程序,实现从内存1000:
0000处开始执行指令。
assumecs:
code
stacksegment
db16dup(0)
stackends
codesegment
start:
movax,stack
movss,ax
movsp,16
movax,1000h
movax,0
pushax
retf
codeends
endstart
执行reft指令时,相当于进行:
popip
popcs
根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。
检测点10.3
下面的程序执行后,ax中的数值为多少?
内存地址机器码汇编指令执行后情况
1000:
0b80000movax,0ax=0,ip指向1000:
3
1000:
39a09000010callfarptrspopcs,popip,ip指向1000:
9
1000:
840incax
1000:
958s:
popaxax=8h
addax,axax=10h
popbxbx=1000h
addax,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=fffeh
addax,[bp]ax=[6+ds:
(fffeh)]=6+5=0bh
用debug进行跟踪确认,“callax(16位reg)”是先将该指令后的第一个字节偏移地址ip入栈,再转到偏移地址为ax(16位reg)处执行指令。
检测点10.5
(1)下面的程序执行后,ax中的数值为多少?
assumecs:
code
stacksegment
dw8dup(0)
stackends
codesegment
start:
movax,stack
movss,ax
movsp,16
movds,ax
movax,0
callwordptrds:
[0eh]
incax
incax
movax,4c00h
int21h
codeends
endstart
推算:
执行callwordptrds:
[0eh]指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:
[0eh])。
(ds:
[0eh])=11h,执行incax?
?
最终ax=3
题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。
根据单步跟踪发现,执行callwordptrds:
[0eh]指令时,显示ds:
[0eh]=065d。
ds:
0000~ds:
0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。
于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完movss,ax;movsp,16这两条指令后,数据段中数据发生改变。
这是为什么呢?
中断呗~~~~
检测点10.5
(2)下面的程序执行后,ax和bx中的数值为多少?
assumecs:
codesg
stacksegment
dw8dup(0)
stackends
codesgsegment
start:
movax,stack
movss,ax
movsp,10h
movwordptrss:
[0],offsets;(ss:
[0])=1ah
movss:
[2],cs;(ss:
[2])=cs
calldwordptrss:
[0];cs入栈,ip=19h入栈,转到cs:
1ah处执行指令
;(ss:
[4])=cs,(ss:
[6])=ip
nop
s:
movax,offsets;ax=1ah
subax,ss:
[0ch];ax=1ah-(ss:
[0ch])=1ah-19h=1
movbx,cs;bx=cs=0c5bh
subbx,ss:
[0eh];bx=cs-cs=0
movax,4c00h
int21h
codesgends
endstart
c:
\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,197514
dd345980,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,17800
dw5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239dw260,304,333
tableends
datasegment
db32dup(0)
dataends
codesegment
start:
movax,data
movds,ax
movax,table
moves,ax
movbx,0
movsi,0
movdi,0
movcx,21
movdh,2
movdl,30
g:
pushcx
pushdx
movax,es:
[bx]
mov[si],ax
movax,es:
[bx].2
mov[si].2,ax;年份入ds:
si
addsi,6
movax,es:
[bx].84
movdx,es:
[bx].86
calldtoc2;收入转成十进制字符入ds:
si
addsi,10
movax,es:
[di].168
movdx,0
calldtoc2;人员数转成十进制字符入ds:
si
addsi,6
x,es:
[di].210
movdx,0
calldtoc2;人均收入转成十进制字符入ds:
si
movsi,0;设置ds:
si指向需显示字符首地址
b:
movcx,29
c:
pushcx
movcl,[si]
jcxzf;(ds:
si)=0转到f执行
d:
incsi
popcx
loopc
incsi
moval,0
mov[si],al;设置结尾符0
movsi,0;设置ds:
si指向需显示字符首地址
popdx
movcl,2
callshow_str
addbx,4;dword数据指向下一数据单元
adddi,2;word数据指向下一数据单元
adddh,1;指向显存下一行
popcx
loopg
movax,4c00h
int21h
f:
moval,20h
mov[si],al;(ds:
si)=0的数据改成空格
jmpd
;名称:
dtoc2
;功能:
将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:
(ax)=dword型数据的低16位;
;(dx)=dword型数据的高16位;
;ds:
si指向字符串首地址。
;返回:
无。
dtoc2:
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
movdi,0
d20:
movcx,10;除数为10
calldivdw
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],al
incsi;ds:
si指向下一单元
loopd23
moval,0
mov[si],al;设置结尾符0
popdi
popsi
popdx
popcx
popbx
popax
ret
【篇二:
《汇编语言》第二版习题答案(全)王爽编写】
1个cpu的寻址能力为8kb,那么它的地址总线的宽度为13位。
(2)1kb的存储器有1024个存储单元,存储单元的编号从0到1023。
(3)1kb的存储器可以存储8192(2^13)个bit,1024个byte。
(4)1gb是1073741824(2^30)个byte、1mb是1048576(2^20)个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=2^n,n=13。
(2)存储器的容量是以字节为最小单位来计算的,1kb=1024b。
(3)8bit=1byte,1024byte=1kb(1kb=1024b=1024b*8bit)。
(4)1gb=1073741824b(即2^30)1mb=1048576b(即2^20)1kb=1024b(即2^10)。
(5)一个cpu有n根地址线,则可以说这个cpu的地址总线的宽度为n。
这样的cpu最多可以寻找2的n次方个内存单元。
(一个内存单元=1byte)。
(6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
(7)8086的数据总线宽度为16根(即一次传送的数据为2b)1024b/2b=512,同理1024b/4b=256。
(8)在存储器中指令和数据没有任何区别,都是二进制信息。
检测点2.1
(1)写出每条汇编指令执行后相关寄存器中的值。
movax,62627ax=f4a3h
movah,31hax=31a3h
moval,23hax=3123h
addax,axax=6246h
movbx,826chbx=826ch
movcx,axcx=6246h
movax,bxax=826ch
addax,bxax=04d8h
moval,bhax=0482h
movah,blax=6c82h
addah,ahax=d882h
addal,6ax=d888h
addal,alax=d810h
movax,cxax=6246h
microsoft(r)windowsdos
(c)copyrightmicrosoftcorp1990-2001.
c:
\docume~1\admini~1debug
0c1c:
0100movax,f4a3
0c1c:
0103movah,31
0c1c:
0105moval,23
0c1c:
0107addax,ax
0c1c:
0109movbx,826c
0c1c:
010cmovcx,ax
0c1c:
010emovax,bx
0c1c:
0110addax,bx
0c1c:
0112moval,bh
0c1c:
0114movah,bl
0c1c:
0116addah,ah
0c1c:
0118addal,6
0c1c:
011aaddal,al
0c1c:
011cmovax,cx
0c1c:
011e
-r
ax=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=