汇编语言多个段的程序在代码段中使用栈

assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,Odefh,Ofedh,Ocbah,0987h
?
codesg ends
end

程序的思路大致如下。
程序运行时,定义的数据存放在cs:0}cs: F单元中,共8个字单元。依次将这8个字单元中的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放。
问题是,我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。程序如下。

assume cs:codesg
codesg segment
        dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
        dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                        ;用dw定义16个字型数据,在程序加载后,将取得16个字的
                        ;内存空间,存放这16个数据。在后面的程序中将这段
                        ;空间当作栈来使用


 start: mov ax,cs
        mov ss,ax
        mov sp,30h     ;将设置栈顶SS:Sp指向CS:

        mov bx,0
        mov cx,8
     s: push cs:[bx]
        add bx,2
        loop s         ;以上将代码段。}15单元中的8个字型数据依次入栈

        mov bx,0
        mov cx,8
    s0: pop cs:[bx]
        add bx,2
        loop s0       ;以上依次出栈8个字型数据到代码段0-15单元中

        mov ax,4c00h  ;指明程序的入口在star处
        int 21h
codesg ends
end start

注意程序中的指令:

mov ax, cs
mov ss,ax
mov sp,30h

我们要将cs: l0-cs:2F的内存空间当作栈来用,初始状态下栈为空,所以ssap要指向栈底,则设置ssap指向cs:30。
在代码段中定义了16个字型数据,它们的数值都是0。这16个字型数据的值是多少,对程序来说没有意义。我们用dw定义16个数据,即在程序中写入了16个字型数据,而程序在加载后,将用32个字节的内存空间来存放它们。这段内存空间是我们所需要的,程序将它用作栈空间。可见,我们定义这些数据的最终目的是,通过它们取得一定容量的内存空间。所以我们在描述dw的作用时,可以说用它定义数据,也可以说用它开辟内存空间。比如对于:

dw 0123h,0456h,0789h,0abch,Odefh,Ofedh,Ocbah,0987h

可以说,定义了8个字型数据,也可以说,开辟了8个字的内存空间,这段空间中每个字单元中的数据依次是:0123h , 0456h , 0789h , Oabch , Odefh , Ofedh , Ocbah ,0987h。因为它们最终的效果是一样的。


发布日期:

所属分类: 易语言 标签: