汇编语言王爽课后答案.docx

上传人:b****5 文档编号:6652081 上传时间:2023-01-08 格式:DOCX 页数:17 大小:20.96KB
下载 相关 举报
汇编语言王爽课后答案.docx_第1页
第1页 / 共17页
汇编语言王爽课后答案.docx_第2页
第2页 / 共17页
汇编语言王爽课后答案.docx_第3页
第3页 / 共17页
汇编语言王爽课后答案.docx_第4页
第4页 / 共17页
汇编语言王爽课后答案.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

汇编语言王爽课后答案.docx

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

汇编语言王爽课后答案.docx

汇编语言王爽课后答案

汇编语言王爽课后答案

【篇一:

汇编语言课后习题答案王爽主编】

一个值为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=

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

当前位置:首页 > 医药卫生 > 基础医学

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

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