程序6.4关于sp指向问题的小疑问
如果数据都定义在一个段中 无data和stack段的话sp指向30h(也就是程序6.3),但是分开成多段的话sp却指的是20h,也就是说data段中的8个字,不参与stack段sp指向栈底的工作了 这是什么原因?看了小甲鱼的030 第六章 包含多个段的程序02 中间也没有对这问题的解释 其实你的程序是合适的如果分段的话,sp指向的是20h因为因为stack段要被初始化,所以它的指针要指向栈底,你的stack段是32个字节也就是0~31指向栈底的话就是sp->32;如果不分段的话,就是30h,也就是48个字节:0~47,指针指向栈底的话就是30h了 段地址是在data段后面 总共的段空间为20H 是从 10H到30H 这段空间
要是30h 那就得设置 mov ax,datamov ss,ax mov sp,30h 其实这个程序不是这样的,这个程序的意思就是要把上面的8个字型数据逆序过来并存放,用来说明栈先进后出的特性,其实是这样的:
codesg segment
dw 0123H, 0456H, 0789H, 0abcH, 0fedH, 0cbaH, 0987H
dw 0, 0, 0, 0, 0, 0, 0, 0 ;定义8个字型数据,将存放前面的8个数
start: mov ax, cs
mov ss, ax
mov sp, 32 ; 这里的意思是:嗯....,本来嘛!先定义了8个字型数据也就是16个字节
mov bx, 0 ;后面又定义了8个字的内存空间还是16个字节这样的话,也就总共0~31个字节
mov cx, 8 ;因为cs:16~cs:31要当做栈来使用,所以要初始化栈为空,所以sp要指向
;栈底,也就是指向cs:32
s:push cs:
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0:pop cs:
add bx, 2
loop s0
mov ax, 4c00h
int 21h
codesg ends
end start
你上面的那个程序中的20,和初始化栈空间,我是真没看懂是啥意思!
你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复习! 青玄 发表于 2014-3-27 21:26 static/image/common/back.gif
其实这个程序不是这样的,这个程序的意思就是要把上面的8个字型数据逆序过来并存放,用来说明栈先进后出的特 ...
恩 我上面的那个程序确实是实现了把8个字型数据逆序存放;但是你没有看清我给的程序(你给的程序和书上的程序 6.3是一样的),我给的程序是多个段;其次 我上面给的那个程序就是《汇编语言》王爽 一书中的( 程序6.4)你可以看一下
steven20133 发表于 2014-3-27 20:41 static/image/common/back.gif
段地址是在data段后面 总共的段空间为20H 是从 10H到30H 这段空间
要是30h 那就得设置 mov ax,datamov s ...
我有一点懂了,也就是是说 :(以上面那个程序为例)一个程序包含了几个段,那么她的数据段和栈段数据之间的偏移地址还是相连的,但是互不影响如果stack dw 0,0,0,0,0,0,0,0 那么就是mov sp,10h oggplay 发表于 2014-3-27 21:31 static/image/common/back.gif
你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复 ...
恩 也就是说sp她只管这程序的stack段定义了几个。然后根据stack段数据的多少个来指定sp指向栈底的的数据 , 而data段定义了多少数据 在多段程序中 他是不管的是这个意思吗?
你看到 STACK 这个段了吗?
里面空出了32字节的 0 用来做栈段,dw定义双字,一共有16个0,又因为一个字是2个字节,2*16=32 就是这样算的。32是10进制数字,转换成16进制是 20H,所以,SS指向STACK,SP=20H
页:
[1]