8086汇编初学者问题FAQ
Posted 独饮月色的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8086汇编初学者问题FAQ相关的知识,希望对你有一定的参考价值。
自己做个问题记录,问题来源不限,尽自己学的回答吧。。有错误恳请指出。。作为初学者,万分感谢!
网上看到的问题,这个论坛似乎没人回答,而且回复有限制。。糟糕的站长啊!
mov ss,ax 设置ss值指定栈空间时,这一段被指定的栈空间我试了下是会改变值的!也就是说,你把cs:[0]至cs:[3]当作栈空间后,初值1,2,0,0会发生变化(变化的规律真不知道,感觉有点随机,这个变化我先称作栈的初始化?),所以影响了后面的push,pop操作没有得到预期结果。
http://bbs.csdn.net/topics/390219081
相同的问题,其实自己做个实验试一试就好了。。栈的初始化在cs段上所以导致cs段的数据被改了一下。。
具体回答我就粘贴我比较认可的了:
首先举个例子
例如0000:0010到0000:0000首先设置为0
你设置ss为0000
而sp为0010
则0000:0010h到0000:0000之间由于设置了sp会导致0000:0010之前的某些数据(10h前8个字节)会被修改(可以在DEBUG用d命令来查看,在d 0000:0000 - 0000:0010 会被设置成其他数据,我也不知道为啥^^..不过应该是计算机内的一种机制吧^^)
然后在看看代码段
前面设置了8 * 2 * 2 byte = 36 byte // .......我觉得是32 =w=
设置了ss为cs
sp为32h = 3 * 16 + 2 = 48 + 2 = 50
又因为设置sp的前八个数据会被修改
因此50 - 8 = 42(也就是说第四十二个字节开始的数据会被修改)
由于前36个字节是用来存储数据的
mov ax,cs
mov ss,ax
mov sp,32h
占了3 * 2 = 6 byte的数据
36 + 6 = 42
mov bx,0这条指令就是在42之后开始的
而由于修改了指令
因此这条指令也被修改成了mov bx,29E6
后面的数据也就乱了
也因此后面的调试步骤乱了
比我观察的更仔细一点,mov ss,ax和mov sp,xxxxh时 sp前8个字节会被改成其他数值。
关于王爽的汇编语言 p128程序6.3:
书上面对于16字节的数据开辟了32字节的栈空间来push,pop,我试了下开辟16字节也是可以的(初学者有点怪,见谅。。)。。顺便记一下,debug 程序名.exe,注意加后缀名,不然会有extened error 2,之前浪费了不少时间。而masm和link命令可以省略后缀。。。和写debug的肯定不是一个程序员!
想一想,作者可能考虑栈空间设置大一点更安全吧。
--------------------11/02记录,未完
以上是关于8086汇编初学者问题FAQ的主要内容,如果未能解决你的问题,请参考以下文章
8086汇编语言学习 8086汇编开发环境搭建和Debug模式介绍