liuming1978 发表于 2024-1-6 23:16:51

一个奇怪的问题

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

FishC 发表于 2024-1-6 23:17:04

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-1-7 13:03:50

start:      mov ax,data               
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,40h
                mov ax,0b800h      
. . . . . .
                mov ax,0       ; 楼主眼睛没有花吧?只要这一句还没有被执行,eax 的值它就必须得是 0B800 啊

liuming1978 发表于 2024-1-7 14:55:33

jackz007 发表于 2024-1-7 13:03


可能是我说的不够准确,是DEBUG到这一句时,后面的立即数,就是是B800,,

liuming1978 发表于 2024-1-7 14:56:35

jackz007 发表于 2024-1-7 13:03


在DEBUG中,不是是mov ax,0,,,,而是mov ax,b800

jackz007 发表于 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

         是啊,你代码的有这一句啊:
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   <--- 在DEBUG 中你所看到的应该是这里。
                mov es,ax
                mov bx,03c0h
                mov ax,0          <--- 你却认为自己看到的是这里

liuming1978 发表于 2024-1-7 18:34:44

jackz007 发表于 2024-1-7 16:47
是啊,你代码的有这一句啊:

mov ax,0          <--- 你却认为自己看到的是这里
我在DEBUG中按t执行到这里时,,,,这句就变成了mov ax,b800,,不然怎么说奇怪呢

jackz007 发表于 2024-1-7 18:46:20

本帖最后由 jackz007 于 2024-1-7 18:57 编辑

liuming1978 发表于 2024-1-7 18:34
mov ax,0

       在计算机面前,根本就没有所谓“奇怪”的现象,所有看起来 “奇怪” 的现象都是因为人在主观意识上的错误所导致的。
       再仔细查一下,在你认为“奇怪”现象出现前,被你用 t 命令跟踪执行的上一条指令究竟是什么?

liuming1978 发表于 2024-1-7 23:13:27

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

mov bx,03c0h

jackz007 发表于 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,以便与堆栈初始化的代码相匹配。
stack segment
      dw 20h dup(0)
stackends

liuming1978 发表于 2024-1-8 21:42:50

jackz007 发表于 2024-1-7 23:49
如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的 ...

我试试去

liuming1978 发表于 2024-1-8 21:46:00

jackz007 发表于 2024-1-7 23:49
如果说问题,最有可能是在堆栈,你定义的容量只有 20H 字节,却为 SP 赋值 40 H,这样,堆栈的 ...

你是对的,,,谢谢
页: [1]
查看完整版本: 一个奇怪的问题