[TOC]
# 在代码段中使用数据
~~~
assume cs:code ;代码段寄存器
code segment
dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H ; 定义了8个字型数据
start:
mov ax, 0
mov bx, 0
mov cx,8
s: add ax, cs:[bx]
add bx,2
loop s
mov ax,4c00H
int 21H
code ends
end start
~~~
`dw`,定义字义型数据,即define word。
使用`dw`定义了8个字型数据,他们所占的内存空间的大小为16个字节。
他们的偏移地址从0开始,所以这8个数的偏移地址为:0,、2、4、6、8、A、C、E处。
即程序运行时,他们的地址为:`CS:0`、`CS:2`、`CS:4` .....
## 调试

我们可以通过`d`命令查看使用`dw`定义的类型数据。
# 在代码段中使用栈
将程序中定义的数据逆序存放。
~~~
assume cs:code
code segment
dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H ; 定义了8个字型数据
dw 0,0,0,0,0,0,0,0 ;定义8个字型数据,程序加载后当做栈空间来使用
start:
mov ax, cs
mov ss, ax
mov sp,32 ; 设置栈顶as:sp指向cs:32(栈是空的,栈底是31,所以空栈则为32)
mov bx ,0
mov cx, 8 ; 设置循环次数
s: push cs:[bx]
add bx, 2 ; bx+=2(高地位引起的),分别对应0,2,4,8...
loop s ; 将0-16单元中的8个字符型数据以此入栈
mov bx, 0
mov cx, 0
s0: pop cs:[bx]
add bx,2
loop s0 ; 依次出栈8个字型数据到代码段0~16单元中
mov ax,4c00H
int 21H
code ends
end start
~~~
# 将数据、代码、栈放入不同的段
~~~
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H ; 定义了8个字型数据
data ends
stack segment
dw 0,0,0,0,0,0,0,0 ;定义8个字型数据,程序加载后当做栈空间来使用
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax ; ds指向data段
mov bx, 0 ; ds:bx指向data段中的第一个单元
mov cx, 8
s: push [bx]
add bx, 2
loop s ; 将0-16单元中的8个字符型数据以此入栈
mov bx, 0
mov cx, 0
s0: pop [bx]
add bx,2
loop s0 ; 依次出栈8个字型数据到代码段0~16单元中
mov ax,4c00H
int 21H
code ends
end start
~~~
> 不能直接将数据直接送入段寄存器。我们可以先将数据送入通用寄存器(ax、bx、cx、dx),然后在将数据送入段寄存器。
解释:
+ 程序中对段名的引用,如`mov ds,data`中的data,将被编译器处理为一个表示段地址的数值。
