若余相思 发表于 2017-9-8 22:32:56

第六章 包含多个段的程序

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]
查看完整版本: 第六章 包含多个段的程序