文章目录
1. 预备知识
- 在存放数据,以前的做法是将数据送入特定内存单元中,而更好和更安全的做法是我们指定需要存放的数据或需要的内存空间大小,让系统来为我们分配。
- dw 指令用于定义用户数据或开辟内存空间:
;使用dw定义8个字型数据,系统自动为其分配空间,此时数据存放空间的段地址由CS给出、偏移地址为0
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
;使用dw申请一段栈空间,申请空间的段地址存放在寄存器 CS 中,栈为空时SP指向最大空间的下一个地址
dw 0,0,0,0,0,0,0,0
- 在编译和连接时,编译器根据 end 指令得到有关程序入口的描述信息,在执行时直接从程序入口处开始执行:
start: xxx ;程序入口
xxx
end start ;使用end指令指明程序入口
2. 检测点 6.1
(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据。
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
start: mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: mov ax,[bx]
________ ;mov cs:[bx],ax
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
- 程序申请空间的段地址存放在段寄存器 CS 中,偏移地址为零,即起始地址为 CS:0、每次偏移地址移动两个字节大小。
- 题目要求使用 0:0~0:15 单元的内容改写程序中的数据,即使用 DS:0~ 的数据改写 CS:0~ 的内容。所以,缺失部分程序完成移动数据的功能,而 0:0~0:15 的数据已存放在寄存器 AX 中,所以缺失部分程序为 mov cs:[bx],ax。
1. 程序入口处查看 原内存单元 0:0~0:15 的内容和存放数据的内存单元:
2. 执行完程序后,存放数据的内存单元:
(2)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,数据的传送用栈进行。
assume cs:codesg
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0
start: mov ax,__ ;mov ax,cs
mov ss,ax
mov sp,__ ;mov sp,36,即将 0:10~0:1A 部分当作栈区使用
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
________ ;pop cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
- 程序使用 dw 申请一段大小为 10 字节的段空间,段地址存放在 CS 中,所以汇编指令前两句为 SS 赋值,即使用 CS 为 SS 赋值。
- 程序第 3 句确定栈顶寄存器 SP 的值,数据区的最后一个数据的存放位置是 CS:E~CS:F,为避免栈区覆盖数据区,这里将 SP 设置为 10H + A(栈区大小) = 1A 或 26。
- 循环体中第一句 push [bx] 即默认将 DS:[BX] 入栈,即题目要求的内存空间。
- 第一个 dw 申请空间的首地址为 CS:0,所以循环体中空缺部分完成功能是使用栈中的值为 CS:0 赋值,即 pop cs:[bx]。
1. 程序入口处查看 原内存单元 0:0~0:15 的内容和存放数据的内存单元:
2. 执行完程序后,存放数据的内存单元: