鱼C论坛

 找回密码
 立即注册
查看: 324|回复: 11

[已解决]一个奇怪的问题

[复制链接]
发表于 2024-1-6 23:16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data,ss:stack
data segment
                        ;0123456789ABCDEF
                db        'welcome to masm!'       
                db        42h                               
data ends

stack segment
                dw        16 dup(0)
stack ends
code segment
start:        mov ax,data               
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,40h
                mov ax,0b800h       
                mov es,ax
                mov bx,03c0h
                mov ax,0  为什么这个语句在DEBUG的时候,会变成mov ax,b800   ??????,,在DEBUG中按U查看时也是正常,就是在T执行的时候,会变,这是为什么???
               
                mov di,040h               
                mov si,0
                mov cx,3

最佳答案
2024-1-7 23:49:10
本帖最后由 jackz007 于 2024-1-7 23:56 编辑
liuming1978 发表于 2024-1-7 23:13
mov bx,03c0h


        如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的上部 20 H 字节的空间实际上使用的是 CODE 段,也就是说,堆栈活动会直接破坏代码段开头的 20H 字节,而且,越靠近栈顶越危险。为了避免这个问题,可以考虑把堆栈扩大为 40 H,以便与堆栈初始化的代码相匹配。
  1. stack segment
  2.         dw 20h dup(0)
  3. stack  ends
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-6 23:17:04 | 显示全部楼层
这个问题出现的原因是在DEBUG模式下,动态调试器(例如: Turbo Debugger)对于某些指令的呈现方式可能会有所调整。在这种情况下,调试器以其认为更容易理解的方式来显示命令。

在你提供的代码中,`mov ax,0b800h`实际上是正确的写法,它将0B800H赋值给AX寄存器。但是,在DEBUG模式下,调试器可能选择以十六进制的表示形式显示,将其显示为`mov ax,b800h`,将字母B放在前面。

请注意,这只是调试器在显示时所做的一种选择,并不会影响程序的实际执行。所以,只需关注以正确的方式编写代码即可。这段代码在T执行时并不会改变。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-7 13:03:50 | 显示全部楼层
  1. start:        mov ax,data               
  2.                 mov ds,ax
  3.                 mov ax,stack
  4.                 mov ss,ax
  5.                 mov sp,40h
  6.                 mov ax,0b800h      
  7. . . . . . .
  8.                 mov ax,0       ; 楼主眼睛没有花吧?只要这一句还没有被执行,eax 的值它就必须得是 0B800 啊
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-7 14:55:33 | 显示全部楼层

可能是我说的不够准确,是DEBUG到这一句时,后面的立即数,就是是B800,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-7 14:56:35 | 显示全部楼层

在DEBUG中,不是是mov ax,0,,,,而是mov ax,b800
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-7 16:47:38 | 显示全部楼层
本帖最后由 jackz007 于 2024-1-7 17:28 编辑
liuming1978 发表于 2024-1-7 14:56
在DEBUG中,不是是mov ax,0,,,,而是mov ax,b800


         是啊,你代码的有这一句啊:
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.                         ;0123456789ABCDEF
  4.                 db        'welcome to masm!'      
  5.                 db        42h                              
  6. data ends

  7. stack segment
  8.                 dw        16 dup(0)
  9. stack ends
  10. code segment
  11. start:        mov ax,data               
  12.                 mov ds,ax
  13.                 mov ax,stack
  14.                 mov ss,ax
  15.                 mov sp,40h
  16.                 mov ax,0b800h     <--- 在DEBUG 中你所看到的应该是这里。
  17.                 mov es,ax
  18.                 mov bx,03c0h
  19.                 mov ax,0          <--- 你却认为自己看到的是这里
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-7 18:34:44 | 显示全部楼层
jackz007 发表于 2024-1-7 16:47
是啊,你代码的有这一句啊:

mov ax,0          <--- 你却认为自己看到的是这里
我在DEBUG中按t执行到这里时,,,,这句就变成了mov ax,b800,,不然怎么说奇怪呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-7 18:46:20 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2024-1-7 18:57 编辑
liuming1978 发表于 2024-1-7 18:34
mov ax,0


       在计算机面前,根本就没有所谓“奇怪”的现象,所有看起来 “奇怪” 的现象都是因为人在主观意识上的错误所导致的。
       再仔细查一下,在你认为“奇怪”现象出现前,被你用 t 命令跟踪执行的上一条指令究竟是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-7 23:13:27 | 显示全部楼层
jackz007 发表于 2024-1-7 18:46
在计算机面前,根本就没有所谓“奇怪”的现象,所有看起来 “奇怪” 的现象都是因为人在主观意 ...

mov bx,03c0h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-7 23:49:10 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-1-7 23:56 编辑
liuming1978 发表于 2024-1-7 23:13
mov bx,03c0h


        如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的上部 20 H 字节的空间实际上使用的是 CODE 段,也就是说,堆栈活动会直接破坏代码段开头的 20H 字节,而且,越靠近栈顶越危险。为了避免这个问题,可以考虑把堆栈扩大为 40 H,以便与堆栈初始化的代码相匹配。
  1. stack segment
  2.         dw 20h dup(0)
  3. stack  ends
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 21:42:50 | 显示全部楼层
jackz007 发表于 2024-1-7 23:49
如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的 ...

我试试去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-8 21:46:00 | 显示全部楼层
jackz007 发表于 2024-1-7 23:49
如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的 ...

你是对的,,,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 08:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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