汇编语言-多个段的程序
代码展示
下面代码展示了多段程序,功能是将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
段及其地址
在上面代码中,定义了三个段。三个段,分别分别为data
,stack
,code
,大概框架如下:
data segment
...
...
data ends
stack segment
...
...
stack ends
code segment
...
...
code ends
这里需要说明几点:
编译连接一开始展示的代码,在debug中调试程序。发现data地址在系统分配内存的最开始,stack地址在data的后面,code段在stack的后面。
每个段的大小,最少为10H大小。段地址,最少为16的倍数。因此,虽然data段中只填入了两个字单元,但还是占用了16个字节的单元。