在xp的command Prompt下运行汇编程序,随意的一个代码:
assume cs:codesg,ds:datasg
datasg segment
dd 123456h
dw 789h,0h
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
mov ax,4c00h
int 21h
codesg ends
end start
用DEBUG运行,DS=15AC,ES=15AC,SS=15BC,CS=15BD,IP=0000,SP=0000...
用U命令可以看到:第一行指令是MOV AX,15BC
我用D 15AC:0000看到的是一些与程序无关的数据,
我用D 15BC:0000看到的是56 34 12 00 89 07 00 00,
用T命令执行第一行指令是MOV AX,15BC后,DS=15BC,ES=15AC,SS=15BC,CS=15BD,IP=0000,SP=0000...
我自己对程序运行情况的分析是:
1)给datasg设置15BC值是程序装入内存时系统分配的,对吗?
2)此时DS和SS值相等,IP=0000,SP=0000,我在代码里某处加了push ax的指令,执行后,发现SP=FFFE,是否意味着如果代码里没设置堆栈段而又使用堆栈,则椎栈会和数据段共用一段空间,只是方向不同,堆栈从64K空间的底部往上走,数据段从64K空间的顶部向下。
想请问我的想法对否? |