汇编语言(第四版)实验5编写、调试具有多个段的程序解答_第1页
汇编语言(第四版)实验5编写、调试具有多个段的程序解答_第2页
汇编语言(第四版)实验5编写、调试具有多个段的程序解答_第3页
汇编语言(第四版)实验5编写、调试具有多个段的程序解答_第4页
汇编语言(第四版)实验5编写、调试具有多个段的程序解答_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语⾔(第四版)实验5编写、调试具有多个段的程序解答实验5编写、调试具有多个段的程序(1)将下⾯的程序编译、连接、⽤Debug加载、跟踪、然后回答问题assumecs:code,ds:data,ss:stackdatasegmentdw0123,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdataendsstacksegmentdw0,0,0,0,0,0,0,0stackendscodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsendstart①CPU执⾏程序,程序返回前,data段中的数据为多少?解答:我们先⽤debug加载跟踪⼀下看看结果如何在程序刚载⼊内存时,由于还没有执⾏设定数据段地址的指令(movds,data),DS段地址默认指向程序起始位置(包括PSP数据区),此时DS:0~DS:FF为PSP数据区(占256个字节),DS:100开始为数据段、栈段、代码段内容。(如上图)在执⾏了movds,data指令后,数据段被⼿⼯设定为DS:0~D:F为数据段(DS段地址已经被更改)(如下图)但在设定逻辑上的数据段前后,物理上的数据段是始终没有发⽣改变的,始终处于1299:0~1299:f部分由实验结果可知,data段中的数据为230156048907BC0AEF0DED0FBA0C8709②CPU执⾏程序,程序返回前,CS=______、SS=______、DS=______执⾏到movax,4c00h指令时,各寄存器内容如下由实验结果可知CS=129B,SS=129A,DS=1299③设程序加载后,code段的段地址为X,则data段的段地址为_____,stack段的段地址为_____。由②可知DS=CS-2,SS=CS-1。故data段地址为X-2,stack段地址为X-1(2)将下⾯的程序编译、连接,⽤Debug加载、跟踪,然后回答问题assumecs:code,ds:data,ss:stackdatasegmentdw0123,0456hdataendsstacksegmentdw0,0stackendscodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsendstart①CPU执⾏程序,程序返回前,data段中的数据为多少?由实验结果可知,data段中的数据为23015604000000000000000000000000②CPU执⾏程序,程序返回前,CS=______、SS=______、DS=______由实验结果可知CS=129B,SS=129A,DS=1299③设程序加载后,code段的段地址为X,则data段的段地址为,stack段的段地址为。这⾥与(1)⼤致相同,因为段的结构顺序和⼤⼩是⼤致相同的由②可知DS=CS-2,SS=CS-1。故data段地址为X-2,stack段地址为X-1④对于如下定义的段:nameends如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为如果N⼩于16,那么实际占⽤16个字节;如果N⼤于16,那么实际占⽤(N/16的取整数+1)*16个字节。即如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(3)将下⾯的程序编译、连接,⽤Debug加载、跟踪,然后回答问题assumecs:code,ds:data,ss:stackcodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsdatasegmentdw0123,0456hdataendsstacksegmentdw0,0stackendsendstart①CPU执⾏程序,程序返回前,data段中的数据为多少?(3)与(1)(2)所不同的是(3)将数据段和栈段放到了代码段的后⾯由实验结果可知,data段中的数据为23015604000000000000000000000000②CPU执⾏程序,程序返回前,CS=______、SS=______、DS=______由实验结果可知CS=1299,SS=129D,DS=129C③设程序加载后,code段的段地址为X,则data段的段地址为,stack段的段地址为。由②可知DS=CS+3,SS=CS=+4故data段的段地址为X+3,stack段的段地址为X+4(4)如果将(1)、(2)、(3)题中的最后⼀条伪指令“endstart”改为“end”(也就是说,不指明程序的⼊⼝),则哪个程序仍然可以正确执⾏?请说明原因。在程序设计中,我们⽤伪指令end描述了程序的结束和程序的⼊⼝。在编译链接后,由“endstart”指明的程序⼊⼝,被转化为⼀个⼊⼝地址,我们可以发现在程序中设置了start和endstart后程序执⾏时会从start位置开始,到endstart位置结束。如果不设endstart,只设置end。那么此时程序会默认从PSP数据区后开始执⾏(即使设置了start,程序也不会从start位置开始执⾏)。如果要保证程序正确执⾏,那么在PSP数据区之后必须为代码段才⾏。由(1)(2)(3)三个程序可知只有程序(3)代码段在开头,故最后⼀条伪指令“endstart”改为“end”后,程序(3)仍然可以正确执⾏,程序(1)(2)虽然也能执⾏,但它们的开头是数据段,将数据段中数据视作代码来执⾏有可能会导致混乱。因此,若代码段不在程序的开头,就应当指明⼊⼝防⽌程序执⾏时逻辑上发⽣错误(5)程序如下、编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。assumecs:codeasegmentdb1,2,3,4,5,6,7,8;按字节存放aendsbsegmentdb1,2,3,4,5,6,7,8bendscsegmentdb0,0,0,0,0,0,0,0csegmentcodesegmentstart:___________codeendsendstart这⾥⾸先要注意的是,a段、b段和c段的数据都是按字节存放的,所以在使⽤寄存器转移数据时⼀定要使⽤8位寄存器⽽不是16位寄存器!不然就有可能引起错误(虽然本题使⽤16位寄存器与使⽤8位寄存器结果⼀样,但⼀定要规范)。这⾥笔者使⽤的思想是使⽤DS存储a段地址,b段地址可以直接使⽤DS+16表⽰(a段不⾜16个字节⽤0补上后占16个字节)ES存储c段地址,每次循环将a段和b段的⼀个字节相加后存⼊c段中即可代码如下:assumecs:codeasegmentdb1,2,3,4,5,6,7,8aendsbsegmentdb1,2,3,4,5,6,7,8bendscsegmentdb0,0,0,0,0,0,0,0cendscodesegmentstart:movax,amovds,ax;ds存放a段地址movax,cmoves,ax;es存放c段地址movbx,0movcx,8;对字进⾏8次循环操作s0:moval,[bx]addal,[bx+16]//a段不⾜16个字节⽤0补上后占16个字节moves:[bx],al//a+16后即为b段地址incbxloops0movax,4c00hint21hcodeendsendstart实验结果如下:(6)程序如下,编写code段中的代码,⽤push命令将a段中的前8个字型数据,逆序存储到b段中。assumecs:codeasegmentdw1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh;按字存储aendsbsegmentdw0,0,0,0,0,0,0,0bendscodesegmentstart:__________codeendsendstart本题与上⼀题有所不同,本题是数据是按字存储的,故使⽤16位寄存器。要求使⽤push指令将前8个字型数据存储到b段中,这⾥应当a段为数据段、b段为栈段才能使⽤push指令将a段的数据压⼊b段中,循环8次即可代码如下:assumecs:codeasegmentdw1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffhaendsbsegmentdw0,0,0,0,0,0,0,0bendscodesegmentstart:movax,am

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论