assume 是一条伪指令,assume的作用是告诉汇编程序各个段寄存器应该与哪个逻辑段对应,但并不赋予该逻辑段的段地址。
所以必须要加上类似的指令
上面的一段是我引用的网上比较好的一段解释,不是原创。
另外再引用一段王爽老师的解释:
这条伪指令的含义是“假设”,他假设某一段寄存器和程序中的某一个用segment.......ends 定义的段相关联。通过assume说明这种关联,在需要的情况下,assume并不是一条非要深入理解的伪指令,以后我们编程时,记着将assume将有特定用途的段和相关的段寄存器相关联起来即可。 比如,在程序中,我们用 codesg segment .......codesg ends 定义了一个名为codesg的段,在这个段中存放代码,所以这个段是一个代码段。在程序的开头,用 assume cs:codesg 将用作代码段的段codesg和CPU中的段寄存器cs连接起来。
其实可以看出要么王爽老师也不想深入讨论这个问题,要么就是王爽老师对于这个问题搞的也不是特别透彻。![](static/image/smiley/lovely/20080925104600311.gif)
没有assume也行,masm5.0不知道可不可以,我用masm6.15是完全可行的,也就是说编译器换代后assume要不要问题不大了,但是编程习惯还是写上吧。
调试结果
而且我也试了很多以前写的程序,发现assume没有可以编译运行。
伪指令也就是编译器看的,没必要深入了解的。其实是想了解资料也不多。![](static/image/smiley/lovely/20080925104549676.gif)
总而言之
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
|