冷色画 发表于 2012-11-18 22:00:13

求助,汇编语言第六章检测点6.1的一些问题

本帖最后由 冷色画 于 2012-11-18 22:47 编辑

《汇编语言》第6章的检测点6.1
我有以下几点疑问,希望各位给我帮助,谢谢!
首先,因为语文水品不好,我没理解题目的意思,把内存0:0-0:15单元中的内容改写程序。额..就不知到改写到哪里了,经过   debug调试,我知道了是改写到cs:0-cs:15的单元中
   第一个问题:我对          dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 一句代码有疑问,为什么会有这句代码?dw定义的数据存在cs:0-cs:15的地方,那要改写,为什么还要定义?   这段代码不要行不行?第二个问题:我试着把dw的代码删除,进行调试,发现最后cs:0-cs:15的内存空间,前面几个数据是对的,后面数据不对,百思不得其解希望有人解答,写的有点啰嗦,希望各位不要介意哈,谢谢!

调试的时候我发现倒数第二个循环的时候,ax的值发生了变化,最后一个循环的时候,本来是mov ax,

变成了mov ax,
纠结

ACC 发表于 2012-11-18 22:00:14

冷色画 发表于 2012-11-18 22:51 static/image/common/back.gif
这下明白了,就是循环前面的代码占了12个字节,覆盖到循环,就不能继续执行了,能不能解释一下为什么有了 ...

dw 在cs段开始先定义了一段数据,该段代码先修改定义的数据,cx=8,不会覆盖代码,若你把修改的数据数量增加,如cx改为16,同样会出现以前的问题

ACC 发表于 2012-11-18 22:23:54

是不是第8个数据开始出现错误?

ACC 发表于 2012-11-18 22:29:12

个人认为:程序汇编后,代码段也是以二进制的数据存放于内存中的,有一些指令长,有一些短,上面的例子中如果去掉定义的dw段后,写入的数据长度比执行的代码转换成二进制数据短的时候没有影响,但有一些指令(例如loop)转换成二进制的数据比word数据短,数据会覆盖以后要执行的代码
不知道这样理解对不对

冷色画 发表于 2012-11-18 22:31:25

ACC 发表于 2012-11-18 22:23 static/image/common/back.gif
是不是第8个数据开始出现错误?

是从第七个数据开始错的

ACC 发表于 2012-11-18 22:39:58

我明白了,第一次执行————上的句子,改变一次内存内容,数据覆盖第一行代码,mov ax,0
第二次执行————上的句子改变内存内容,覆盖第二行代码,mov ds,ax
知道第六次执行————上的句子,覆盖其本身,下一次不能执行_________
不再改变内存内容,数据开始出现错误

冷色画 发表于 2012-11-18 22:41:04

ACC 发表于 2012-11-18 22:29 static/image/common/back.gif
个人认为:程序汇编后,代码段也是以二进制的数据存放于内存中的,有一些指令长,有一些短,上面的例子中如 ...

也就是说,最后当数据写到后面几位的时候,把后面要执行的代码给覆盖掉了,导致后面的数据不准确。。可以这样理解吗?

ACC 发表于 2012-11-18 22:45:05

冷色画 发表于 2012-11-18 22:41 static/image/common/back.gif
也就是说,最后当数据写到后面几位的时候,把后面要执行的代码给覆盖掉了,导致后面的数据不准确。。可以 ...

嗯,代码是循环的,其实现的功能是改变内存数据,当改变了自身代码时,就不能继续执行。。。。。

冷色画 发表于 2012-11-18 22:51:11

ACC 发表于 2012-11-18 22:39 static/image/common/back.gif
我明白了,第一次执行————上的句子,改变一次内存内容,数据覆盖第一行代码,mov ax,0
第二次执行—— ...

这下明白了,就是循环前面的代码占了12个字节,覆盖到循环,就不能继续执行了,能不能解释一下为什么有了dw这段代码就可以了呢?

羊羽生 发表于 2013-11-1 19:48:08

有同样的疑问 不过我删了dw那一段以后 只能运行到一半
页: [1]
查看完整版本: 求助,汇编语言第六章检测点6.1的一些问题