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