哮月苍狼 发表于 2011-7-26 08:41:25

第六章开始就晕了

本帖最后由 哮月苍狼 于 2011-7-28 11:24 编辑

书上第128页,程序6.3 assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;(0~f)
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;(10-2f)
start:mov ax,cs
mov ss,ax
mov sp,30h ;这里的SP是因为把10~2f的内存空间当作栈使用,初始栈为空,所以SP=2e+2=30H,我这么分析没问题吧?

令我不解的是书上130页,程序6.4,内存空间同样都是(10-2f)这段空间当成栈空间使用,为什么程序6.3,SP=30H,而下面的程序6.4,sp=20H????
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;(0~f)
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;(10-2f)
stack ends
start:mov ax,stack
mov ss,ax
mov sp,20h

tmlnsc 发表于 2011-7-26 11:21:32

呵呵,我给说一说:6。3程序中数据段和栈段还有代码段是在同一段,三者起始地址相同,起如地址都是:codesg.所以偏移地址也就是sp=30H。而6.4程序中栈是单独定义的,是在数据段结束之后,才是栈的起始地址。stack segment
       dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0                                                                     ;(10-2f)
stack ends
这几行代码可以看出整个栈有16个字,即32个字节。那空栈的sp当然是指向32,即20H了。

死亡请帖 发表于 2011-7-27 16:32:34

sp=20H是因为stack段的底部漂移是。。。16字=32B=20h
页: [1]
查看完整版本: 第六章开始就晕了