鱼C论坛

 找回密码
 立即注册
查看: 1952|回复: 4

代码、数据、栈都为同一段内存的时候,我运行会出错

[复制链接]
发表于 2012-9-11 23:53:26 | 显示全部楼层 |阅读模式
1鱼币
代码、数据、栈都为同一段内存的时候,我运行会出错
比如我们将10000H-1001FH 安排为代码段,并在里面存储如下代码:
mvo ax,1000h
mov ss,ax
mov sp,0020h
mov ax,cs
mov ds,ax
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx
设置cs=1000H IP=0
我在运行到mov bx,[4]这里的时候就产生了错误,mov bx,[4]变成了mov bx,[c804],后续的代码更是完全变样了。
这是为什么呢,视频里说是可以的,但我的就不行

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-12 20:56:09 | 显示全部楼层
  1. assume cs:code

  2. code segment
  3.      
  4. start:mov ax,1000h
  5.       mov ss,ax
  6.       mov sp,0020h
  7.       mov ax,cs
  8.       mov ds,ax
  9.       mov ax,[0]
  10.       add ax,[2]
  11.       mov bx,[4]
  12.       add bx,[6]
  13.       push ax
  14.       push bx
  15.       pop ax
  16.       pop bx
  17.           
  18. code ends

  19. end start
复制代码
呵呵,  楼主, 你好

你只是有点小小的粗心而已,多多仔细就行了~

错误分析:
               1,  这个打错了。mvo ax,1000h  (你竟然能单步调试说明只是这里打错了)
               2,  在对内存操作时,如果后面是 立即数(idata),就要明确 段寄存器( 0 不需要),不然错误,  但是如果是后面不是立即数,那就不用, 下面列子

比如:后面是立即数,默认在ds中
          mov ax,ds:[2]   ;显示在段寄存器
          mov ax,ds:[4]
          mov ax,ds:[5]
         后面是立即数,默认在es中
          mov ax,es:[1]
          mov ax,es:[5]

         后面不是立即数,默认在ds中
            mov ax ,[bx]
            mov ax, [bx+si]
       因为内存的索引方式不是 立即数,   所以不需要显示段地址

    呵呵, 楼主,相信你很快就会明白的,  bye~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-12 21:38:45 | 显示全部楼层
还是不明白,mvo ax,1000h  我在DEBUG里面是没有打错的,书写错误是没法保存执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-10-7 13:30:41 | 显示全部楼层
应该是数据起冲突了,当你几个段使用同一内存单元的时候后面的数据会覆盖前面的数据,所以你后续代码才会出问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-20 16:27:57 | 显示全部楼层
帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-8 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表