《汇编语言》王爽 答案.docx

上传人:b****8 文档编号:10081721 上传时间:2023-05-23 格式:DOCX 页数:65 大小:74.74KB
下载 相关 举报
《汇编语言》王爽 答案.docx_第1页
第1页 / 共65页
《汇编语言》王爽 答案.docx_第2页
第2页 / 共65页
《汇编语言》王爽 答案.docx_第3页
第3页 / 共65页
《汇编语言》王爽 答案.docx_第4页
第4页 / 共65页
《汇编语言》王爽 答案.docx_第5页
第5页 / 共65页
《汇编语言》王爽 答案.docx_第6页
第6页 / 共65页
《汇编语言》王爽 答案.docx_第7页
第7页 / 共65页
《汇编语言》王爽 答案.docx_第8页
第8页 / 共65页
《汇编语言》王爽 答案.docx_第9页
第9页 / 共65页
《汇编语言》王爽 答案.docx_第10页
第10页 / 共65页
《汇编语言》王爽 答案.docx_第11页
第11页 / 共65页
《汇编语言》王爽 答案.docx_第12页
第12页 / 共65页
《汇编语言》王爽 答案.docx_第13页
第13页 / 共65页
《汇编语言》王爽 答案.docx_第14页
第14页 / 共65页
《汇编语言》王爽 答案.docx_第15页
第15页 / 共65页
《汇编语言》王爽 答案.docx_第16页
第16页 / 共65页
《汇编语言》王爽 答案.docx_第17页
第17页 / 共65页
《汇编语言》王爽 答案.docx_第18页
第18页 / 共65页
《汇编语言》王爽 答案.docx_第19页
第19页 / 共65页
《汇编语言》王爽 答案.docx_第20页
第20页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

《汇编语言》王爽 答案.docx

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

《汇编语言》王爽 答案.docx

《汇编语言》王爽答案

第1章基础知识

检测点1.1

(1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。

(2)1KB的存储器有1024个存储单元。

存储单元的编号从0到1023。

(3)1KB的存储器可以存储1024*8个bit,1024个Byte。

(4)1GB、1MB、1KB分别是2^30、2^20、2^10Byte。

(n^m的意思是n的m次幂)

(5)8080、8088、80286、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)在存储器中,数据和程序以二进制形式存放。

第2章寄存器答案

检测点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

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。

解:

movax,2

addax,ax

addax,ax

addax,ax

检测点2.2

(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。

(2)有一数据存放在内存20000H单元中,先给定段地址为SA,若想用偏移地址寻到此单元。

则SA应满足的条件是:

最小为1001H,最大为2000H。

检测点2.3

下面的3条指令执行后,CPU几次修改IP?

都是在什么时候?

最后IP中的值是多少?

movax,bx

subax,ax

jmpax

解:

修改4次;第一次在CPU读取“movax,bx”后,第二次在CPU读取“subax,ax”后,第三次在CPU读取“jmpax”后,第四次在CPU执行完“movax,bx”后;最后IP中的值为0。

实验1查看CPU和内存,用机器指令和汇编指令编程

1.略

2.

(1)略

(2)略

(3)查看内存中的内容。

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找出这个生产日期并试图改变它。

解:

内存FFF00H~FFFFFH为ROM区,内容可读但不可写。

(4)向内存从B8100H开始的单元中填写数据,如:

-eB810:

00000101020203030404

请读者先填写不同的数据,观察产生的现象;在改变填写的地址,观察产生的现象。

解:

8086的显存地址空间是A0000H~BFFFFH,其中B8000H~BFFFFH为80*25彩色字符模式显示缓冲区,当向这个地址空间写入数据时,这些数据会立即出现在显示器上。

第3章寄存器(内存访问)

检测点3.1

(1)在Debug中,用“d0:

01f”查看内存,结果如下。

0000:

00007080F030EF6030E2-0080801266202260

0000:

00106226E6D6CC2E3C3B-ABBA000026066688

下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器的值。

movax,1

movds,ax

movax,[0000]AX=2662H

movbx,[0001]BX=E626H

movax,bxAX=E626H

movax,[0000]AX=2662H

movbx,[0002]BX=D6E6H

addax,bxAX=FD48H

addax,[0004]AX=2C14H

movax,0AX=0000H

moval,[0002]AX=00E6H

movbx,0BX=0000H

movbl,[000C]BX=0026H

addal,blAX=000CH

(2)内存中的情况如图3.6所示

各寄存器的初始值:

CS=2000H,IP=0,DS=1000H,AX=0,BX=0;

①写出CPU执行的指令序列(用汇编指令写出)。

②写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。

③再次体会:

数据和程序有区别吗?

如何确定内存中的信息哪些是数据,哪些是程序?

解:

初始值:

CS=2000H,IP=0,DS=1000H,AX=0,BX=0

①②

movax,6622HAX=6622H其他寄存器保持不变,以下同理

jmp0ff0:

0100CS=0ff0H,IP=0100H

movax,2000HAX=2000H

movds,axDS=20000H

movax,[0008]AX=C389H

movax,[0002]AX=EA66H

③没有区别,被CS:

IP指向的信息是程序;被传送、运算等指令操作的是数据。

检测点3.2

(1)补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到200000H~2000FH中。

逆序复制的含义如图3.17所示(图中内存里的数据均为假设)。

movax,1000H

movds,ax

movax,2000H

movss,ax

movsp,10H

push[0]

push[2]

push[4]

push[6]

push[8]

push[A]

push[C]

push[E]

(2)补全下面的程序,使其可以将100000H~1000FH中的8个字,逆序复制到200000H~2000FH中。

movax,2000H

movds,ax

movax,1000H

movss,ax

movsp,0

pop[E]

pop[C]

pop[A]

pop[8]

pop[6]

pop[4]

pop[2]

pop[0]

实验2用机器指令和汇编指令编程

1.预备知识:

Debug的使用

2.实验任务

(1)使用Debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

movax,ffff

movds,ax

movax,2200

movss,ax

movsp,0100

movax,[0];ax=58EA

addax,[2];ax=5CCA

movbx,[4];bx=30F0

addbx,[6];bx=6021

pushax;sp=00FE;修改的内存单元的地址是220FE,内容为5CCA

pushbx;sp=00FC;修改的内存单元的地址是220FC,内容为6021

popax;sp=00FE;ax=6021

popbx;sp=0100;bx=5CCA

push[4];sp=00FE;修改的内存单元的地址是220FE,内容为30F0

push[6];sp=00FC;修改的内存单元的地址是220FC,内容为2F31

注:

内存中的数据会因机器、环境而异

(2)仔细观察图3.19中的实验过程,然后分析:

为什么2000:

0~2000:

f中的内容会发生改变?

解:

t命令为单步中断,CPU会保护现场,即顺序把标志寄存器、CS、IP入栈,此题是关于后面章节的中断问题。

第4章第一个程序

实验3编程、编译、连接、跟踪

(1)将下面的程序保存为t1.asm,将其生成可执行文件ti.exe。

assumecs:

codesg

codesgsegment

movax,2000h

movss,ax

movsp,0

addsp,10

popax

popbx

pushax

pushbx

popax

popbx

movax,4c00h

int21h

codesgends

end

解:

(2)用Debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。

解:

(3)PSP的头两个字节是CD20,用Debug加载ti.exe,查看PSP的内容。

解:

第5章[BX]和loop指令

实验4[bx]和loop的使用

(1)编程,向内存0:

200~0:

23F依次传送数据0~63(3FH)。

解:

assumecs:

codesg

codesgsegment

movax,0

movds,ax

movbx,200H

moval,0

movcx,64

s:

mov[bx],al

incbx

incal

loops

movax,4c00h

int21h

codesgends

end

(2)编程,向内存0:

200~0:

23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“movax,4c00h”和“int21h”。

解:

assumecs:

codesg

codesgsegment

movax,20h

movds,ax

movbx,0

movcx,64

s:

mov[bx],bl

incbx

loops

movax,4c00h

int21h

codesgends

end

(3)下面的程序的功能是将“movax,4c00h”之前的指令复制到内存0:

200处,补全程序。

上机调试,跟踪运行结果。

assumecs:

code

codesegment

movax,cs

movds,ax

movax,0020h

moves,ax

movbx,0

movcx,17h

s:

moval,[bx]

moves:

[bx],al

incbx

loops

movax,4c00h

int21h

codeends

end

第6章包含多个段的程序

检测点6.1

(1)下面的程序实现依次用内存0:

0~0:

15单元中的内容改写程序中的数据,完成程序:

assumecs:

codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start:

movax,0

movds,ax

movbx,0

movcx,8

s:

movax,[bx]

movcs:

[bx],ax

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

(2)下面的程序实现依次用内存0:

0~0:

15单元中的内容改写程序中的数据,数据的传送用栈来进行。

栈空间设置在程序内。

完成程序:

assumecs:

codesg

codesgsegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw0,0,0,0,0,0,0,0,0,0;10个字单元用栈空间

start:

movax,cs

movss,ax

movsp,36

movax,0

movds,ax

movbx,0

movcx,8

s:

push[bx]

popcs:

[bx]

addbx,2

loops

movax,4c00h

int21h

codesgends

endstart

实验5编写、调试具有多个段的程序

(1)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题

assumecs:

code,ds:

data,ss:

stack

datasegment

dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dataends

stacksegment

dw0,0,0,0,0,0,0,0

stackends

codesegment

start:

movax,stack

movss,ax

movsp,16

movax,data

movds,ax

pushds:

[0]

pushds:

[2]

popds:

[2]

popds:

[0]

movax,4c00h

int21h

codeends

endstart

①CPU执行程序,程序返回前,data段中的数据为多少?

解:

不变

②CPU执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。

(此题结果因环境而异,但相对差值不变)

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。

(2)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题

assumecs:

code,ds:

data,ss:

stack

datasegment

dw0123H,0456H

dataends

stacksegment

dw0,0

stackends

codesegment

start:

movax,stack

movss,ax

movsp,16

movax,data

movds,ax

pushds:

[0]

pushds:

[2]

popds:

[2]

popds:

[0]

movax,4c00h

int21h

codeends

endstart

①CPU执行程序,程序返回前,data段中的数据为多少?

解:

不变

②CPU执行程序,程序返回前,cs=155ch、ss=155bh、ds=155ah。

(此题结果因环境而异,但相对差值不变)

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。

④对于如下定义的段:

namesegment

nameends

如果段中的数据占N个字节,则程序加载后,这段实际占有的空间为(N/16+1)*16.(N/16为取整数部分)

(3)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题

assumecs:

code,ds:

data,ss:

stack

codesegment

start:

movax,stack

movss,ax

movsp,16

movax,data

movds,ax

pushds:

[0]

pushds:

[2]

popds:

[2]

popds:

[0]

movax,4c00h

int21h

codeends

datasegment

dw0123H,0456H

dataends

stacksegment

dw0,0

stackends

endstart

①CPU执行程序,程序返回前,data段中的数据为多少?

解:

不变

②CPU执行程序,程序返回前,cs=155ah、ss=155eh、ds=155dh。

(此题结果因环境而异,但相对差值不变)

③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。

(4)如果将

(1)、

(2)、(3)题中的最后一条伪指令“endstart”改为“end”(也就是说不指明程序的入口),则那个程序仍然可以正确执行?

请说明原因。

解:

(1)、

(2)不能正确执行(入口默认为data段的第一条指令),(3)能正确执行。

如果不指明程序的入口,编译器自动默认整个代码的第一条指令为程序的入口。

(经qingxh1指正,在此鸣谢)

(5)程序如下,编写code段中的内容,将a段和b段中的数据依次相加,将结果存到c段中。

assumecs:

code

asegment

db1,2,3,4,5,6,7,8

aends

bsegment

db1,2,3,4,5,6,7,8

bends

csegment

db0,0,0,0,0,0,0,0

cends

codesegment

start:

movax,a

movds,ax

movbx,0

movcx,8

s:

moval,ds:

[bx]

addal,ds:

[bx+16]

movds:

[bx+32],al

incbx

loops

movax,4c00h

int21h

codeends

endstart

(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

assumecs:

code

asegment

dw1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh

aends

bsegment

dw0,0,0,0,0,0,0,0

bends

codesegment

start:

movax,a

movds,ax

movbx,0

movax,b

movss,ax

movsp,16

movcx,8

s:

push[bx]

incbx

incbx

loops

movax,4c00h

int21h

codeends

endstart

第7章更灵活的定位内存地址的方法

实验6实践课程中的程序

(1)略

(2)编程,完成问题7.9中的程序。

编程,将datasg段中每个单词的前4个字母改写为大写字母。

assumecs:

codesg,ss:

stacksg,ds:

datasg

stacksgsegment

dw0,0,0,0,0,0,0,0

stacksgends

datasgsegment

db'1.display'

db'2.brows'

db'3.replace'

db'4.modify'

datasgends

codesgsegment

start:

movax,stacksg

movss,ax

movsp,16

movax,datasg

movds,ax

movbx,0

movcx,4

s0:

pushcx

movsi,0

movcx,4

s:

moval,[bx+si+3]

andal,11011111b

mov[bx+si+3],al

incsi

loops

addbx,16

popcx

loops0

movax,4c00h

int21h

codesgends

endstart

第8章数据处理的两个基本问题

实验7寻址方式在结构化数据访问中的应用

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。

解:

assumecs:

codesg,ds:

data,es:

table

datasegment

db'1975','1976','1977','1978','1979','1980','1981','1982','1983'

db'1984','1985','1986','1987','1988','1989','1990','1991','1992'

db'1993','1994','1995'

;以上是表示21年的21个字符串

dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;以上是表示21年公司总收的21个dword型数据

dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw11542,14430,45257,17800

;以上是表示21年公司雇员人数的21个word型数据

dataends

tablesegment

db21dup('yearsummne?

?

')

tableends

codesgsegment

start:

movax,data

movds,ax

movsi,0

movax,table

moves,ax

movdi,0

movcx,21

s:

movax,ds:

[si];年份转送

moves:

[di],ax

movax,ds:

[si+2]

moves:

[di+2],ax

movax,ds:

[si+84];收入转送

moves:

[di+5],ax

movdx,ds:

[si+84+2]

moves:

[di+7],dx

pushcx;保护cx

movcx,ds:

[84+84+bx];雇员数转送

moves:

[di+0ah],cx

divcx;计算人均收入

popcx

moves:

[di+0dh],ax;人均收入转送

addsi,4

addbx,2

adddi,16

loops

movax,4c00h

int21h

codesgends

endstart

第9章转移指令的原理

检测点9.1

(1)程序如下。

assumecs:

code

datasegment

db0,0,0

dataends

codesegment

start:

movax,data

movds,ax

movbx,0

jmpwordptr[bx+1]

codeends

endstart

若要使程序中的jmp指令执行后,CS:

IP指向程序的第一条指令,在data段中应该定义哪些数据?

(2)程序如下。

assumecs:

code,ds:

data

datasegment

dd12345678h

dataends

codesegment

start:

movax,data

movds,ax

movbx,0

mov[bx],bx

mov[bx+2],cs

jmpdwordptrds:

[0]

codeends

endstart

补全程序,使jmp指令执行后,CS:

IP指向程序的第一条指令。

(3)用Debug查看内存,结果如下:

2000:

1000BE0006000000......

则此

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2