完成下面的程序,利用栈,将程序中定义的数据逆序存放。
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。因为它们最终的效果是一样的。