汇编语言-多个段的程序

代码展示

下面代码展示了多段程序,功能是将data中的数据,翻转保存

assume cs:code, ds:data, ss:stack

data segment
    dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends

stack segment
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends


code segment

start:  
    mov ax,stack
    mov ss,ax
    mov sp,20H

    mov ax,data
    mov ds,ax

    mov bx,0

    mov cx,8
s:  push [bx]
    add bx,2
loop s

    mov bx,0
    mov cx,8
s2: pop [bx]
    add bx,2
loop s2

    mov ax,4c00H
    int 21H
code ends

end start

功能介绍:

定义三个段,然后将stack段,作为堆栈段;将data作为数据段;将code作为代码段。通过代码段中代码,将数据段中数据保存到堆栈段中,然后在pop出来,保存在数据段中。


知识点介绍

start:

code segment

start:  mov ax,stack
    ...
    ...
    ...

    mov ax,4c00H
    int 21H
code ends

end start

start:

正如我们之前介绍的标记一样,start也是一样的,表示所在指令段的偏移地址。如同code,表示上面定义代码段的偏移地址。

end start

告诉编辑器,在代码段中代码从何处开始。


assume指令

assume cs:code是给code段中的标号找了个段寄存器,就这点作用。

具体看下面论坛:
http://bbs.csdn.net/topics/350233108


段及其地址

在上面代码中,定义了三个段。三个段,分别分别为datastackcode,大概框架如下:

data segment
    ...
    ...
data ends


stack segment
    ...
    ...
stack ends


code segment
    ...
    ...
code ends

这里需要说明几点:

  1. 编译连接一开始展示的代码,在debug中调试程序。发现data地址在系统分配内存的最开始,stack地址在data的后面,code段在stack的后面。

  2. 每个段的大小,最少为10H大小。段地址,最少为16的倍数。因此,虽然data段中只填入了两个字单元,但还是占用了16个字节的单元。

这里写图片描述

原文地址:https://www.cnblogs.com/AbeDay/p/5026853.html