本文主要是介绍(八)《汇编语言(王爽)》 | 检测点 6.1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1. 预备知识
- 2. 检测点 6.1
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 segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
start: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,[bx]________ ;mov cs:[bx],axadd bx,2loop smov ax,4c00hint 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 segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hdw 0,0,0,0,0
start: mov ax,__ ;mov ax,csmov ss,axmov sp,__ ;mov sp,36,即将 0:10~0:1A 部分当作栈区使用mov ax,0mov ds,axmov bx,0mov cx,8s: push [bx]________ ;pop cs:[bx]add bx,2loop smov ax,4c00hint 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. 执行完程序后,存放数据的内存单元:
这篇关于(八)《汇编语言(王爽)》 | 检测点 6.1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!