汇编部分答案文档格式.docx

上传人:b****5 文档编号:21341555 上传时间:2023-01-29 格式:DOCX 页数:32 大小:26.74KB
下载 相关 举报
汇编部分答案文档格式.docx_第1页
第1页 / 共32页
汇编部分答案文档格式.docx_第2页
第2页 / 共32页
汇编部分答案文档格式.docx_第3页
第3页 / 共32页
汇编部分答案文档格式.docx_第4页
第4页 / 共32页
汇编部分答案文档格式.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

汇编部分答案文档格式.docx

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

汇编部分答案文档格式.docx

第2题说明:

因为段的起始地址要为16的倍数。

所以当段地址小于1001H或大于2000H时CPU都无法寻到。

检测点2.3(第33页)

答:

CPU修改了4次IP的值。

情况如下:

第1次:

执行完movax,bx后

第2次:

执行完subax,ax后

第3次:

读入jmpax后

第4次:

执行完jmpax后

最后IP的值为0

实验1查看CPU和内存,用机器指令和汇编指令编程(第33页)

-----------------------------------------------------

1.预备知识:

Debug的使用

<

此部分略>

2.实验任务(第43页)

(1)

(2)

(3)

通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'

/'

的格式]存储在内存ffff:

0005~ffff:

000C(共8个字节单元中)处。

此生产日期不能被改变,因为其具有‘只读’属性。

(4)

通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。

注:

关于显存的详细讨论不在此题范围>

检测点3.1(第52页)

(1)(题目:

略)

2662H

E626H

D6E6H

FD48H

2C14H

0000H

00E6H

0026H

000CH

提示:

此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。

1.指令序列如下:

movax,6622h

jmp0ff0:

0100

movax,2000h

movds,ax

movax,[0008]

movax,[0002]

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

指令序列↓

寄存器→

CS

IP

DS

AX

BX

初始值→

2000H

0000

1000H

0003

6622H

0005

0008

C389H

000B

EA66H

 

3.再次体会:

数据和程序有区别吗?

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

(略)

检测点3.2(第66页)

movax,2000H

movss,ax

movsp,10H

movax,1000H

movsp,0H

实验2用机器指令和汇编指令编程(第70页)

---------------------------------------

2.实验任务

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

从第一空开始依次如下:

ax=5BEA

ax=5CCA

bx=30F0

bx=6029

sp=FE220FE5CCA

sp=FC220FC6029

sp=FE6029

sp=100H5CCA

sp=FE220FE30F0

sp=FC220FC2E39

说明:

此题可能因机子软、硬件环境不同而导致答案不一致!

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

为什么2000:

0~2000:

f中的内容会发生改变?

因为用T指令进行调试时,会产生中断。

而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。

关于中断的详细内容的讨论不在此题范围>

实验4[BX]和loop的使用(第113页)

-------------------------------

(1)编程,向内存0:

200~0:

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

程序如下:

assumecs:

codesg

codesgsegment

movax,0020h

movbx,0

movdl,0

movcx,40h

s:

mov[bx],dl

incdl

incbx

loops

movax,4c00h

int21h

codesgends

end

(2)编程,向内存0:

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

movds,ax

movbl,0

mov[bx],bl

incbl

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

200处,补全程序。

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

code

codesegment

movax,code;

code为所填写的数据

moves,ax

movcx,18h;

18h为所填写的数据

moval,[bx]

moves:

[bx],al

codeends

1.因为题目的要求是把代码段内的指令当作数据,复制到目的地址。

所以,源数据段ds和代码段cs相同,通过movax,code/movds,ax('

符号是指两条指令的分隔)来设置源数据段。

2.可以先假设要复制8位[1h~0ffh]数据(因为我们肉眼就可以看出此程序的长度不可能大于0ffh个字节)的字节数(如:

10h),把程序补全,以便通过编译。

这时我们以准确的第一空所填内容code与假想的第二空内容10h将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可用R命令查看CX的值,这时我们可以看到CX的值为1D,由此我们可以算出该程序的长度[1Dh-5h]=18h,之所以减5是为了满足题目的要求(因为movax,4c00h/int21h这两条指令的长度等于5)

检测点6.1(第119页)

-------------------

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

start:

movax,0

movcx,8

movax,[bx]

movcs:

[bx],ax;

此条指令为所填指令

addbx,2

endstart

dw0,0,0,0,0

movax,cs;

cs为所填第一空

movss,ax

movsp,1ah;

此条指令为所填第二空

push[bx]

popcs:

[bx];

此条指令为所填第三空

实验5编写、调试具有多个段的程序(第123页)

-----------------------------------------

1.保持不变

2.<

考虑不同机子环境不同,答案无法统一>

3.X-2,X-1

4.(N/16+1)*16[说明:

N/16只取整数部分]

3.X+3,X+4

第3个仍然可以正确执行。

因为如果把end指令后的标号start去掉后,编译器便会顺序执行程序。

换句话说:

当未给编译器预先的通知,要求其从哪开始执行程序时,编译器就自动以'

至上向下'

的顺序进行编译执行源程序。

(5)完整程序如下:

asegment

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

aends

bsegment

bends

csegment

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

cends

start:

movax,a

movax,c

s1:

movax,es:

[bx]

add[bx],ax

loops1

movax,b

s2:

loops2

endstart

(6)完整程序如下:

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

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

movsp,10h

movax,a

实验6实践课程中的程序(第147页)

-------------------------------

(2)编程:

完成问题中的程序。

问题7.9完整程序如下:

codesg,ss:

stacksg,ds:

datasg

stacksgsegment

stacksgends

datasgsegment

db'

1.display'

2.brows'

3.replace'

4.modify'

datasgends

movax,stacksg

movsp,16

movax,datasg

movcx,4

;

外循环

pushcx

movsi,3

s0:

内循环

moval,[bx+si]

andal,11011111b

mov[bx+si],al

incsi

loops0

addbx,16

popcx

loops

movax,4c00h

int21h

实验7寻址方式在结构化数据访问中的应用(第160页)

----------------------------------------------

完整程序如下:

codesg,ds:

data,es:

table

datasegment

1975'

'

1976'

1977'

1978'

1979'

1980'

1981'

1982'

1983'

1984'

1985'

1986'

1987'

1988'

1989'

1990'

1991'

1992'

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

movax,data

movax,table

movsi,0

movdi,0

movcx,21

s:

进入循环

[di],al

moval,[bx+1]

[di+1],al

moval,[bx+2]

[di+2],al

moval,[bx+3]

[di+3],al

以上8句的作用是存放年份

movax,54h[bx];

第一个'

年收入'

的段基址为54H

movdx,56h[bx]

5h[di],ax

7h[di],dx

以上4句的作用是存放公司总收入

movax,0A8h[si];

人数'

的段基址为0A8H

0Ah[di],ax

以上2句是存放公司的人数

movax,54h[bx]

divwordptrds:

0A8h[si]

0dh[di],ax

以上3句是存放人均收入

addbx,4

addsi,2

adddi,16

以上3句是为下一次循环时存放数据做准备

3个寄存器递增的速度决定了所要存取的数据的位置的偏移地址

loops;

跳到标号s处

程序说明:

此程序虽然可以达到预期效果(读者可以自行调试验证),但实现方法比较简单,读者有兴趣的话可以寻找一种更具结构化的设计方法来完成。

检测点9.1(第170页)

(1)若要使jmp指令执行后,CS:

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

code,ds:

data

db0,0,0

jmpwordptr[bx+1];

段内间接转移

;

解题理由:

为了使IP的值经跳转后变为0,则需保证ds:

[bx+1]处的字型单元数据为0000H,

所以定义3个字节型数据0就符合“应该”的要求

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

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

dd12345678h

mov[bx],bx;

源操作数bx为所填内容

mov[bx+2],cs;

源操作数cs为所填内容

jmpdwordptrds:

[0]

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

2000:

1000BE0006000000......

则此时,CPU执行指令:

moves,ax

jmpdwordptres:

[1000H]

后,(CS)=?

(IP)=?

为了使本机环境[2000:

1000至2000:

1005]中的数据与题目中所给出的数据一致,可以通过编写程序来完成,完整程序如下:

movax,2000h

movbx,1000h

movwordptr[bx].0,0BEH

movwordptr[bx].2,6h

movwordptr[bx].4,0

运行完上6句则使2000:

1000--2000:

1005中的数据依次为:

BE,00,06,00,00,00

以上6句则按题目中的数据进行初始化,以便使运行环境符合题目要求

jmpdwordptres:

[1000h]

经上机调试得出:

CS=0006H,IP=00BEH

检测点9.2(第172页)

从标号s处开始所要填写的四条指令依次如下:

第一条指令:

movcl,[bx]

第二条指令:

movch,0

第三条指令:

jcxzok

第四条指令:

incbx

检测点9.3(第173页)

补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中。

movcl,[bx]

movch,0

inccx;

此条指令为题目要求补全的指令

ok:

decbx

movdx,bx

解答提醒:

此题可用假设法来完成(比如设2000:

0000至2000:

0003的内容依次为:

1E06000A)。

此题要注意loop指令的使用规则,同时要注意区别[内存单元]与[内存单元中的数据(或内容)]的不同。

实验8分析一个奇怪的程序(第174页)

---------------------------------

分析下面的程序,在运行前思考:

这个程序可以正确返回吗?

运行后再思考:

为什么是这种结果?

通过这个程序加深对相关内容的理解。

nop

movdi,offsets

movsi,offsets2

movax,cs:

[si]

[di],ax

s0:

jmpshorts

s1:

s2:

jmpshorts1

程序可以正常返回。

详细分析:

在此题中较为深入地考察了‘段内直接短转移’[形如:

jmpshort标号]的概念。

我们知道程序中:

movdi,offsets

movsi,offsets2

movax,cs:

movcs:

四条指令的作用是将标号s2处的一条指令复制到标号s处。

这时我们应该关心所复制的语句"

jmpshorts1"

对程序的影响:

我们知道在段内直接短转移指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移量(如对此概念还不太熟悉,请查看书中第167页的内容)。

也就是说,在源程序的编译过程中,编译器遇到‘段内直接短转移’[形如:

jmpshort标号]时就会自动算出其要跳转的位移量,以便程序在执行‘段内直接短转移’的指令时就根据位移量进行(向前或向后)跳转。

通过调试中的U命令我们可以看

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

当前位置:首页 > 工程科技 > 城乡园林规划

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

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