NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[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` ..... ## 调试 ![](https://box.kancloud.cn/5cba170bc167d7b430d2f9385fe4e0c4_648x215.png) 我们可以通过`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,将被编译器处理为一个表示段地址的数值。