第六章 包含多个段的程序
6.1节在代码段中使用数据先看程序:
assume cs : code
code segment
dw 0110H, 0456H, 1236H, 1478H, 1236H, 2589H, 3698H, 1256H
start : mov bx, 0
mov dx, 0
mov cx, 8
s : add dx, cs :
add bx, 2
loop s
mov ax, 4c00H
int 21H
code ends
end start
其中的dw意思是:“define word”,即使用dw定义了8个字型数据,他们所占的空间大小为16个字节
此时千万不用运行程序,因为程序还没有默认CS指向的是定义数据那里开始执行,所以得到的结果也就不正确,想要正常运行就要给出入口的地方。如下代码:
assume cs : code
code segment
dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
dw 0, 0, 0, 0, 0, 0, 0, 0
start : mov ax, cs
mov ss, ax
mov sp, 32
mov bx, 0
mov cx, 8
s : push cs :
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0: pop cs :
add bx, 0
loop s0
mov ax, 4c00H
int 21H
code ends
end start
在程序开始执行的地方有个start标号,在程序结束时也有start,这中的代码表示是要执行的代码,这样程序就不会从定义数据那里开始执行,
6.2节在代码中使用栈
先看代码:
assume cs : code
code segment
dw 1236H, 1478H, 2589, 1253H, 6985H, 3258H, 1236H, 7895H
dw 0, 0, 0, 0, 0, 0, 0, 0
start : mov ax, cs
mov ss, ax
mov sp, 32
mov bx, 0
mov cx, 8
s : push cs :
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0: pop cs :
add bx, 0
loop s0
mov ax, 4c00H
int 21H
code ends
end start
这里我们将cs:10~cs:19当作内存空间的栈使用,初始状态栈为空,所以ss:sp指向栈低
上面代码可以解释为:先将ss:sp指向栈低,然后将cs:0~15的数据放在栈中,然后将栈中的数据逆序放在cs:0~15的地方
6.3节将数据、代码、栈放在不同的段中
下面的代码就是将不同的数据放在不同的段中:
assume cs : code
data segment
dw 1478H, 1258H, 3698H, 2587H, 1458H, 3698H, 1258H, 8796H
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start : mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
mov bx, 0
mov cx, 8
s : push
add bx, 2
loop s
mov bx, 0
mov cx, 8
s0: pop
add bx, 2
loop s0
mov ax, 4c00H
int 21H
code ends
end start
我们不同将全部的数据放在同一个段中,因为对于8086CPU来说一个段只能容纳64KB的空间
mov ax, data 就是将在data段的地址放在ax中
mov ax, stack 就是将stack段中的地址放在ax中
其中的data和stack是标号,表示所在段的地址。
这样也是封装的一种思想。
页:
[1]