沉ジ寞 发表于 2014-3-27 14:16:19

程序6.4关于sp指向问题的小疑问

如果数据都定义在一个段中 无data和stack段的话sp指向30h(也就是程序6.3),但是分开成多段的话sp却指的是20h,也就是说data段中的8个字,不参与stack段sp指向栈底的工作了 这是什么原因?看了小甲鱼的030 第六章 包含多个段的程序02 中间也没有对这问题的解释

青玄 发表于 2014-3-27 14:16:20

其实你的程序是合适的如果分段的话,sp指向的是20h因为因为stack段要被初始化,所以它的指针要指向栈底,你的stack段是32个字节也就是0~31指向栈底的话就是sp->32;
如果不分段的话,就是30h,也就是48个字节:0~47,指针指向栈底的话就是30h了

steven20133 发表于 2014-3-27 20:41:23

段地址是在data段后面 总共的段空间为20H 是从 10H到30H 这段空间
要是30h 那就得设置 mov ax,datamov ss,ax mov sp,30h

青玄 发表于 2014-3-27 21:26:43

其实这个程序不是这样的,这个程序的意思就是要把上面的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,和初始化栈空间,我是真没看懂是啥意思!

oggplay 发表于 2014-3-27 21:31:15

你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复习!

沉ジ寞 发表于 2014-3-27 21:43:23

青玄 发表于 2014-3-27 21:26 static/image/common/back.gif
其实这个程序不是这样的,这个程序的意思就是要把上面的8个字型数据逆序过来并存放,用来说明栈先进后出的特 ...

恩 我上面的那个程序确实是实现了把8个字型数据逆序存放;但是你没有看清我给的程序(你给的程序和书上的程序 6.3是一样的),我给的程序是多个段;其次 我上面给的那个程序就是《汇编语言》王爽 一书中的( 程序6.4)你可以看一下

沉ジ寞 发表于 2014-3-27 22:04:13

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

沉ジ寞 发表于 2014-3-27 22:23:32

oggplay 发表于 2014-3-27 21:31 static/image/common/back.gif
你数数stack segment 几个dw ,总共几个字节,然后换算成16进制是多少 结合栈的工作机制应该明白了 不懂?复 ...

恩 也就是说sp她只管这程序的stack段定义了几个。然后根据stack段数据的多少个来指定sp指向栈底的的数据 , 而data段定义了多少数据 在多段程序中 他是不管的是这个意思吗?

无名侠 发表于 2014-3-29 07:57:16

你看到 STACK 这个段了吗?
里面空出了32字节的 0 用来做栈段,dw定义双字,一共有16个0,又因为一个字是2个字节,2*16=32 就是这样算的。32是10进制数字,转换成16进制是 20H,所以,SS指向STACK,SP=20H
页: [1]
查看完整版本: 程序6.4关于sp指向问题的小疑问