是不是真是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: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会覆盖代码段。 多谢指点,问题解决了。
页:
[1]