关于汇编语言中《栈的正确声明定义问题》
本帖最后由 没个正样 于 2012-2-17 05:08 编辑主题:关于汇编语言中《栈的正确声明定义问题》
最近,我在论坛上发现很多朋友,用debug运行程序时,经常出错;故而,引起我对此事的特别关注,今夜花了几个小时的时间,终于理出了一些头绪。之前,我在学习的过程中,遇到譬如此类浅处的小问题时,都是飞身通过的......可是快,有快的好处,也有快的坏处。兵法有曰:“智者之虑,必杂于厉害;杂于利而勿可信也,杂于害而患可解也。”所以,我们要掌握好,快慢之度。
下面我用四个例子来说明《栈的正确声明定义问题》;一,assume cs:code,ds:data,ss:stackdata segment db 01h ;23h,0456hdata endsstack segment db 0,0,0,0,0,0,0,stack endscode segmentstart: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,7 push ds: ;push ds: mov ax,4c00h int 21h
code endsend start在第一个例子中,我们发现,声明定义7个字节的栈来存储一个字节的数据,都会报错;由此,我们可以断定“在存储数据前,栈先要预留出7个字节的空间”。具体是什么原因,我也说不准,或是给系统所占用,或是在数据段中有隐藏的数据,或是编译器的内部规定。
二,assume cs:code,ds:data,ss:stackdata segment db 01h ;23h;,0456hdata endsstack segment db 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,8 push ds: ;push ds: mov ax,4c00h int 21h
code endsend start在第二个例子中,我们发现,声明定义8个字节的栈来存储一个字节的数据,就可正确地通过了!
三,assume cs:code,ds:data,ss:stackdata segment dw 0123h ;,0456hdata endsstack segment db 0,0,0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,10 push ds: ;push ds: mov ax,4c00h int 21h
code endsend start在第三个例子中,我们发现,声明定义10个字节的栈来存储一个字型的数据,也可正确地通过了!
四,assume cs:code,ds:data,ss:stackdata segment dw 0123h,0456hdata endsstack segment db 0,0,0,0,0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,12 push ds: push ds: mov ax,4c00h int 21h
code endsend start在第四个例子中,我们发现,声明定义12个字节的栈来存储二个字型的数据,还可正确地通过! 反正现在不在乎内存空间了 多定义点空间给栈不就行了!~ 反正现在不在乎内存空间了 多定义点空间给栈不就行了!~ 是啊!两位,多定义点空间就行了。
页:
[1]