deepin04 发表于 2015-10-10 22:19:02

是不是真是CPU错了?请指教

写了下面代码
assume cs:code,ss:stack,ds:data
        data segment
                dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        data ends
        stack segment
                dw 0,0,0,0,0,0,0,0
        stack ends
        code segment
                start:          mov ax,stack
                                mov ss,ax
                                mov sp,20h
                                mov ax,data
                                mov ds,ax
                              mov bx,0
                                mov cx,8
                        s:        push
                                add bx,2
                                loop s
                                mov bx,0
                                mov cx,8
                        s1:        pop
                                add bx,2
                                loop s1
                                mov ax,4c00h
                                int 21h
                code ends
        end start
编译后调试跟踪如下:
G:\bbyt>debug p131.exe
-u cs:0 2f                                                       #第一次用U命令查看编译后的指令#
0B93:0000 B8920B      MOV   AX,0B92
0B93:0003 8ED0          MOV   SS,AX
0B93:0005 BC2000      MOV   SP,0020
0B93:0008 B8910B      MOV   AX,0B91 #第一次用U命令查看编译后的指令,此时0B93:0008处指令为mov ax,0B91与程序相符#
0B93:000B 8ED8          MOV   DS,AX
0B93:000D BB0000      MOV   BX,0000
0B93:0010 B90800      MOV   CX,0008
0B93:0013 FF37          PUSH   
0B93:0015 83C302      ADD   BX,+02
0B93:0018 E2F9          LOOP    0013
0B93:001A BB0000      MOV   BX,0000
0B93:001D B90800      MOV   CX,0008
0B93:0020 8F07          POP   
0B93:0022 83C302      ADD   BX,+02
0B93:0025 E2F9          LOOP    0020
0B93:0027 B8004C      MOV   AX,4C00
0B93:002A CD21          INT   21
0B93:002C 43            INC   BX
0B93:002D 43            INC   BX
0B93:002E 2C80          SUB   AL,80
-r
AX=0000BX=0000CX=004CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B81ES=0B81SS=0B91CS=0B93IP=0000   NV UP EI PL NZ NA PO NC
0B93:0000 B8920B      MOV   AX,0B92
-t
AX=0B92BX=0000CX=004CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B81ES=0B81SS=0B91CS=0B93IP=0003   NV UP EI PL NZ NA PO NC
0B93:0003 8ED0          MOV   SS,AX
-u cs:0 2f    #执行第一条指令后,用U命令查看#
0B93:0000 B8920B      MOV   AX,0B92
0B93:0003 8ED0          MOV   SS,AX
0B93:0005 BC2000      MOV   SP,0020
0B93:0008 B8910B      MOV   AX,0B91   #执行第一条指令后,用U命令查看,指令无变化#
0B93:000B 8ED8          MOV   DS,AX
0B93:000D BB0000      MOV   BX,0000
0B93:0010 B90800      MOV   CX,0008
0B93:0013 FF37          PUSH   
0B93:0015 83C302      ADD   BX,+02
0B93:0018 E2F9          LOOP    0013
0B93:001A BB0000      MOV   BX,0000
0B93:001D B90800      MOV   CX,0008
0B93:0020 8F07          POP   
0B93:0022 83C302      ADD   BX,+02
0B93:0025 E2F9          LOOP    0020
0B93:0027 B8004C      MOV   AX,4C00
0B93:002A CD21          INT   21
0B93:002C 43            INC   BX
0B93:002D 43            INC   BX
0B93:002E 2C80          SUB   AL,80
-r
AX=0B92BX=0000CX=004CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B81ES=0B81SS=0B91CS=0B93IP=0003   NV UP EI PL NZ NA PO NC
0B93:0003 8ED0          MOV   SS,AX
-t
AX=0B92BX=0000CX=004CDX=0000SP=0020BP=0000SI=0000DI=0000
DS=0B81ES=0B81SS=0B92CS=0B93IP=0008   NV UP EI PL NZ NA PO NC
0B93:0008 0000          ADD   ,AL                  DS:0000=CD#执行第二条指令后,此时发现下一个指令有变化,与程序不符#
--u cs:0 2f#执行第二条指令后,用U再次查看,此时发现00,与程序不符#
0B93:0000 B8920B      MOV   AX,0B92
0B93:0003 8ED0          MOV   SS,AX
0B93:0005 BC920B      MOV   SP,0B92
0B93:0008 0000          ADD   ,AL   #执行第二条指令后,用U再次查看,此时发现此地址处指令与第一次查看的不符,那么问题来了,为什么?为什么变了,什么原因导致的?#
0B93:000A 0800          OR      ,AL
0B93:000C 93            XCHG    BX,AX
0B93:000D 0B8C05B9      OR      CX,
0B93:0011 0800          OR      ,AL
0B93:0013 FF37          PUSH   
0B93:0015 83C302      ADD   BX,+02
0B93:0018 E2F9          LOOP    0013
0B93:001A BB0000      MOV   BX,0000
0B93:001D B90800      MOV   CX,0008
0B93:0020 8F07          POP   
0B93:0022 83C302      ADD   BX,+02
0B93:0025 E2F9          LOOP    0020
0B93:0027 B8004C      MOV   AX,4C00
0B93:002A CD21          INT   21
0B93:002C 43            INC   BX
0B93:002D 43            INC   BX
0B93:002E 2C80          SUB   AL,80
-
问题:
为什么编译完成后查看内存指令0B93:0008地址处为 MOV   AX,0B91,执行完0B93:0000 MOV   AX,0B92,0B93:0003 MOV   SS,AX,0B93:0005MOV   SP,0020这三个地址处的指令后,再用u命令查看,0B93:0008 处的指令由MOV   AX,0B91变为ADD   ,AL。而且此后很多命令和第一次查看的都不一样了,为什么?为什么会变,什么原因导致的?此问题百思不得其解,请指教。

forAsm 发表于 2015-10-11 00:02:55

本帖最后由 forAsm 于 2015-10-11 00:04 编辑

没有仔细看。

但是你看这里:
                start:          mov ax,stack
                              mov ss,ax
                              mov sp,20h
注意这个mov sp,20h
然而你的栈只有10h:
      stack segment
                dw 0,0,0,0,0,0,0,0
      stack ends
注意sp的意义,你这么做在之后的push会覆盖代码段。

deepin04 发表于 2015-10-11 03:18:48

多谢指点,问题解决了。
页: [1]
查看完整版本: 是不是真是CPU错了?请指教