包含多个段的程序:在代码段中使用栈

问题:

利用栈,将程序中定义的数据逆序存放   

assume cs:codeseg

codeseg segment

    dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H

    ?

code ends

end

代码:

assume cs:codeseg

codeseg segment

        dw 0123H,0456H,0789H,0abcH,0defH,0fdeH,0cbaH,0987H
        dw 0,0,0,0,0,0,0,0      ;用dw来定义8个字型数据,在程序加载后,
                                ;将取得8个字的内存空间,存放这8个数据,在后面的
                                ;程序中,将这段空间作为栈来使用
start:  mov ax,cx
        mov ss,ax
        mov sp,32               ;设置栈顶指向cs:32
        mov bx,0
        mov cx,8
s:      push cs:[bx]
        add bx,2
        loop s                  ;以上代码将0~15单元中的数据依次压栈

        mov bx,0
        mov cx,8
s0:     pop cs:[bx]
        add bx,2
        loop s0                 ;以上代码将0~15单元中的数据依次出栈

codeseg ends

end start

代码分析:

  • 首先从内存的角度看,本程序的首地址为cs,然后后面跟着16个字型数据,逻辑地址下,cs地址为0,之后的0~31共32个内存单元存放的是这些数据,根据栈的要求,栈顶指针指向cs:32。之后的程序都是在这32个内存单元中进行的。
  • 接下来的几行代码是循环使数据入栈,由于是字型数据,所以bx每次增加2。接下来是这些数据依次出栈,注意bx要重新设为0。因为出栈的第一个元素是原来内存中的最后一个。
  • 其余说明在代码注释中有。

你可能感兴趣的:(包含多个段的程序:在代码段中使用栈)