|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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。而且此后很多命令和第一次查看的都不一样了,为什么?为什么会变,什么原因导致的?此问题百思不得其解,请指教。
本帖最后由 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会覆盖代码段。
|
|