肥马时代 发表于 2012-8-8 17:19:30

assume的问题

assume cs:code,ss:stack,ds:data
这样写会把 code 段的地址赋给 cs
但是如果使用ss,还必须这样
movax,stack
movss,ax
movsp,16
那么我的问题是,ss:stack究竟干什么用,是不是可以不写

lukelqz 发表于 2012-8-8 17:19:31

assume 是一条伪指令, assume的作用是告诉汇编程序各个段寄存器应该与哪个逻辑段对应,但并不赋予该逻辑段的段地址。
所以必须要加上类似
mov ax,data
mov ds,ax的指令

上面的一段是我引用的网上比较好的一段解释,不是原创。
另外再引用一段王爽老师的解释:
这条伪指令的含义是“假设”,他假设某一段寄存器和程序中的某一个用segment.......ends 定义的段相关联。通过assume说明这种关联,在需要的情况下,assume并不是一条非要深入理解的伪指令,以后我们编程时,记着将assume将有特定用途的段和相关的段寄存器相关联起来即可。   比如,在程序中,我们用 codesg segment .......codesg ends 定义了一个名为codesg的段,在这个段中存放代码,所以这个段是一个代码段。在程序的开头,用 assume cs:codesg 将用作代码段的段codesg和CPU中的段寄存器cs连接起来。
其实可以看出要么王爽老师也不想深入讨论这个问题,要么就是王爽老师对于这个问题搞的也不是特别透彻。{:5_97:}


没有assume也行,masm5.0不知道可不可以,我用masm6.15是完全可行的,也就是说编译器换代后assume要不要问题不大了,但是编程习惯还是写上吧。
调试结果

而且我也试了很多以前写的程序,发现assume没有可以编译运行。

伪指令也就是编译器看的,没必要深入了解的。其实是想了解资料也不多。{:5_91:}

总而言之

mov ax,stack
mov ss,ax
mov sp,16

上面这种把逻辑段的段地址给段寄存器的步骤必须要,assume随意啦。

另外附上我找的一些资料,你可以探究探究
http://hi.baidu.com/undeadnightelf/item/d7548e5d0736bc3194eb05f3
http://topic.csdn.net/t/20040721/09/3194712.html
http://jpkc.zzu.edu.cn/hbyycai/faqs/list.asp?id=91

lukelqz 发表于 2012-8-8 18:54:04

movax,stack
movss,ax
movsp,16
这个的作用是告诉cpu我定义的一个段,段名是stack,我现在把它作为栈段来用,以后cpu执行push pop之类的栈操作,就把stack做栈段。
当然你如果 movax,stack
movds,ax
就是告诉cpu我定义的stack段是用作数据段,以后我操作数据段的指令,如默认的段地址就在stack段了

肥马时代 发表于 2012-8-9 14:10:59

本帖最后由 肥马时代 于 2012-8-9 14:13 编辑

谢谢lukelqz老师,我明白了,其实assume可以不要,但是至少必须要assume cs:code,这样理解对吧。
可能这个assume 更多是给看代码的人看的类似注释,因为assume ss:stack确实什么都没做

lukelqz 发表于 2012-8-9 15:37:03

肥马时代 发表于 2012-8-9 14:10 static/image/common/back.gif
谢谢lukelqz老师,我明白了,其实assume可以不要,但是至少必须要assume cs:code,这样理解对吧。
可能 ...

:$ 不谢。我也是学生哈。就像你说的,至少加上assume cs:code 比较好。
页: [1]
查看完整版本: assume的问题