没个正样 发表于 2012-2-17 04:43:20

关于汇编语言中《栈的正确声明定义问题》

本帖最后由 没个正样 于 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个字节的栈来存储二个字型的数据,还可正确地通过!

莫名其妙 发表于 2012-2-17 14:57:12

反正现在不在乎内存空间了 多定义点空间给栈不就行了!~

xiaofengli2008 发表于 2012-2-17 17:32:04

反正现在不在乎内存空间了 多定义点空间给栈不就行了!~

没个正样 发表于 2012-2-19 05:34:59

是啊!两位,多定义点空间就行了。
页: [1]
查看完整版本: 关于汇编语言中《栈的正确声明定义问题》