竹子小三12414 发表于 2012-1-5 18:43:39

这是为什么呢??????帮我解决下

assume cs:code,ds:data
       data segment
             dw 3,18700,65535,8
       data ends
          
           code segment
       start : mov ax,data
                 mov ds,ax
                       mov si,0
                       mov di,32
                       
                       mov cx,4
                s:   mov ax,
             mov ,ax
             add si,2
             add di,2
          loop s
            mov ax,4c00h
            int 21h
      code ends
end start          为什么只有3复制过去了,而其它的值为什么没有复制过去???????

竹子小三12414 发表于 2012-1-5 23:42:53

运行结束后
-d 1415:0
1415:000003 00 0c 49 ff ff 08 00-
1415:0010b8 15 14 8e d8 be 00 00-
1415:002003 00 83 c6 02 83 c7 04-
为什么是这样?????????????????            

竹子小三12414 发表于 2012-1-5 23:43:45

运行结束后
-d 1415:0
1415:000003 00 0c 49 ff ff 08 00-
1415:0010b8 15 14 8e d8 be 00 00-
1415:002003 00 83 c6 02 83 c7 04-为什么是这样?????????????????            

风扫地 发表于 2012-1-6 00:11:19

本帖最后由 风扫地 于 2012-1-6 00:23 编辑

跟踪发现。。。你的data段太小了。。
结果 ds:20 指到了代码段去了。
也就是就说。。要拷贝到 ds:di 的数据会改写代码段的数据。也就是会修改要执行的代码。。跟踪发现。。 你的代码在执行
设置数据段
mov   ds,ax
后。
发现ds:20和 cs:e指向是同一段内存空间。。
而ce对应出的代码就是
s:   
                                mov ax,ds:
                                mov ds:,ax
                                add si,2
                                add di,2
                                loop s

从逻辑上 这段代码执行了一遍就被重写了。代码发生了变化。。不能完成你需要他完成的工作了。。
你在执行玩第一次loop s后再ucs:e看看。。代码是不是已经发生变化了。

mov ds:,ax-------------------->add ax,


建议加长代码段。。data段修改为

   data segment
               dw 3,18700,65535,8
                           dw 8 dup(0)
                           dw 8 dup(0)
                           dw 8 dup(0)
       data ends




竹子小三12414 发表于 2012-1-6 09:14:00

谢谢了,但是我在问你下,有点看的不是很懂,我执行mov ds,ax后 ds=1415,cs=1419
---ds指向的 物理地址=1415*16+20=14170
---cs指向的 物理地址=1419*16+e=1419e
不是一样啊????????????????

竹子小三12414 发表于 2012-1-6 09:16:09

因为刚自学到这,所以连你说的数据段少也是第一次知道,谢谢了,上面那个问题麻烦你能详细点吗?????????

风扫地 发表于 2012-1-6 12:24:43

本帖最后由 风扫地 于 2012-1-6 12:27 编辑

可能我们的环境不同吧。我这里的指向是这样的。。不过这里数据段太小是问题所在,注意不要把东西写到你不知道是否是安全内存的地方去。。。
-------------------
你运行完loop s一次后再尝试看看   cs:e 处的代码。。。
在debug中 用 u cs:e   这个命令、、是看看代码是不是发生了变化。

seuer126 发表于 2012-1-6 15:43:09

风扫地 发表于 2012-1-6 00:11 static/image/common/back.gif
跟踪发现。。。你的data段太小了。。
结果 ds:20 指到了代码段去了。
也就是就说。。要拷贝到 ds:di 的数 ...

dw 8 dup(0)
dw 8 dup(0)
dw 8 dup(0)
请问一下,写上这三行就表示增加data段的大小了,是吧。小弟不懂,你能不能稍微解释一下。

竹子小三12414 发表于 2012-1-6 16:03:35

谢谢你了。。。。。。。。。。。。。。

daya48 发表于 2012-1-6 16:15:06

我觉得是对的,你看4个数依次是0003H, 94c0H, ffffH, 0008H.这不就是十进制的3,18700,65535,8吗?

daya48 发表于 2012-1-6 16:15:57

上面那个是490CH

风扫地 发表于 2012-1-6 21:04:49

seuer126 发表于 2012-1-6 15:43 static/image/common/back.gif
dw 8 dup(0)
dw 8 dup(0)
dw 8 dup(0)


后面会学到这个伪指令。。不必着急。。

竹子小三12414 发表于 2012-1-6 23:44:54

数据段太小的话,有时候就会导致数据的丢失,这个知识点在那里啊??

seuer126 发表于 2012-1-7 09:43:20

风扫地 发表于 2012-1-6 21:04 static/image/common/back.gif
后面会学到这个伪指令。。不必着急。。

谢谢啊,呵呵!

redhat0921 发表于 2012-1-7 10:24:02

其实不添加数据段也行的,你的ds:di指到代码段中了,也就是你把di调大,调到没用到的那些空的内存中,就不用添加代码段了

笑浪 发表于 2012-1-7 11:19:11

说实话 还没学到这些内容 不过帮你顶下

redhat0921 发表于 2012-1-7 11:49:15

笑浪 发表于 2012-1-7 11:19 static/image/common/back.gif
说实话 还没学到这些内容 不过帮你顶下

女的?额,第一次碰到女的学编程,而且还是汇编

小马过河 发表于 2012-1-7 13:13:15

学习了{:1_1:}:D
页: [1]
查看完整版本: 这是为什么呢??????帮我解决下