|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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 : [bx]
- 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 : [bx]
- add bx, 2
-
- loop s
-
- mov bx, 0
- mov cx, 8
- s0: pop cs : [bx]
- 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 : [bx]
- add bx, 2
-
- loop s
-
- mov bx, 0
- mov cx, 8
- s0: pop cs : [bx]
- 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 [bx]
- add bx, 2
-
- loop s
-
- mov bx, 0
- mov cx, 8
- s0: pop [bx]
- 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是标号,表示所在段的地址。
这样也是封装的一种思想。
|
|