当前位置:鱼C工作室 >汇编语言 > 查看文章

包含多个段的程序02 – 零基础入门学习汇编语言30

第六章:包含多个段的程序02

 

让编程改变世界

Change the world by program


 

在代码段中使用栈

 

完成下面的程序,利用栈,将程序中定义的数据逆序存放。

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

?

code ends

end

 

程序思路

程序的思路大致如下:

程序运行时,定义的数据存放在cs:0~cs:15单元中,共8个字单元。依次将这8个字单元中的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放。

问题是,我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。

我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。

 

程序6.3源码

assume cs:codesg
codesg segment
        dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
        dw 0,0,0,0,0,0,0,0  ;用dw定义8个字型数据,在程序加载后,将取得8个字的
                            ;内存空间,存放这8个数据。我们在后面的程序中将这段
                            ;空间当作栈来使用。
start:  mov ax,cs		
        mov ss,ax
        mov sp,32		    ;设置栈顶ss:sp指向cs:32
        mov bx,0
        mov cx,8
s:      push cs:[bx]
        add bx,2
        loop s			    ;以上将代码段0~16单元中的8个字型数据依次入栈
 
        mov bx,0
        mov cx,8
s0:     pop cs:[bx]
        add bx,2
        loop s0	            ;以上依次出栈8个字型数据到代码段0~16单元中
 
        mov ax,4c00h
        int 21h
codesg ends
 
end start			;指明程序的入口在start处

 

注意程序6.3中的指令:

mov ax,cs

mov ss,ax

mov sp,32

我们要讲 cs:16 ~ cs:31 的内存空间当作栈来用,初始状态下栈为空,所以 ss:sp要指向栈底,则设置ss:sp指向cs:32。

如果对这点还有疑惑,建议回头认真复习一下第三章。

 

比如对于:dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

我们可以说,定义了8个字型数据。

也可以说,开辟了8个字的内存空间,这段空间中每个字单元中的数据依次是:

0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。

因为它们最终的效果是一样的。

 

检测点6.1

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.