鱼C论坛

 找回密码
 立即注册
查看: 2669|回复: 2

[已解决]是不是真是CPU错了?请指教

[复制链接]
发表于 2015-10-10 22:19:02 | 显示全部楼层 |阅读模式

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

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

x
写了下面代码
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 [bx]
                                add bx,2
                                loop s
                                mov bx,0
                                mov cx,8
                        s1:        pop [bx]
                                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    [BX]
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     [BX]
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=0000  BX=0000  CX=004C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B81  ES=0B81  SS=0B91  CS=0B93  IP=0000   NV UP EI PL NZ NA PO NC
0B93:0000 B8920B        MOV     AX,0B92  
-t
AX=0B92  BX=0000  CX=004C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B81  ES=0B81  SS=0B91  CS=0B93  IP=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    [BX]
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     [BX]
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=0B92  BX=0000  CX=004C  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B81  ES=0B81  SS=0B91  CS=0B93  IP=0003   NV UP EI PL NZ NA PO NC
0B93:0003 8ED0          MOV     SS,AX
-t
AX=0B92  BX=0000  CX=004C  DX=0000  SP=0020  BP=0000  SI=0000  DI=0000
DS=0B81  ES=0B81  SS=0B92  CS=0B93  IP=0008   NV UP EI PL NZ NA PO NC
0B93:0008 0000          ADD     [BX+SI],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     [BX+SI],AL     #执行第二条指令后,用U再次查看,此时发现此地址处指令与第一次查看的不符,那么问题来了,为什么?为什么变了,什么原因导致的?#
0B93:000A 0800          OR      [BX+SI],AL
0B93:000C 93            XCHG    BX,AX
0B93:000D 0B8C05B9      OR      CX,[SI+B905]
0B93:0011 0800          OR      [BX+SI],AL
0B93:0013 FF37          PUSH    [BX]
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     [BX]
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:0005  MOV     SP,0020这三个地址处的指令后,再用u命令查看,0B93:0008 处的指令由MOV     AX,0B91变为ADD     [BX+SI],AL。而且此后很多命令和第一次查看的都不一样了,为什么?为什么会变,什么原因导致的?此问题百思不得其解,请指教。
最佳答案
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会覆盖代码段。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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会覆盖代码段。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-11 03:18:48 From FishC Mobile | 显示全部楼层
多谢指点,问题解决了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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