汇编中的三种“段”
来源:互联网 发布:淘宝客服聊天记录查看 编辑:程序博客网 时间:2024/06/09 21:51
代码段
CS,IP与代码段
CS:代码段寄存器
IP:指令指针寄存器
CS:IP:CPU将内存地址CS:IP指向的内容作为当前指令执行
8086PC读取和执行指令过程:
(1)从CS:IP指向的内存单元读取指令,到指令缓冲器
(2)IP=IP+所读指令长度,从而指向下一条指令
(3)执行指令,转到步骤(1),重复该过程
修改CS,IP的指令:
通过改变CS,IP的内容,可以控制CPU要执行的目标指令
方法1:
通过debug中的r命令对寄存器内容修改–rcs,rip
注意:debug是调试手段,不是程序方式
方法2:
转移指令jmp
(1)同时修改CS,IP:
jmp 段地址:偏移地址
jmp 2AE3:3 即将CS改为2AE3,IP改为0003
(2)仅修改IP的内容:
jmp 某一合法寄存器
jmp ax 即将IP内容修改为ax寄存器的内容
数据段
对于8086PC机,可以根据需要将一组内存单元定义为一个段。物理地址=段地址×16+偏移地址
将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
8086CPU内存中字的存储:
对8086CPU,16位作为一个字。
(1)16位的字存储在一个16位的寄存器中,高8位放高字节,低8位放低字节。
如对于存放在ax寄存器中的AB12H来说,ah=AB,al=12。
(2)16位的字在内存中需要2个连续字节存储, 低位字节存在低地址单元,高位字节存在高地址单元。
(3)一个字单元由两个连续的内存单元组成,存放一个字型数据。注意区分字型数据和字节型数据
字的传送:
(1)8086CPU可以一次性传送一个字(16位)
(2)CPU从内存中读取数据,通过DS:[address](段地址:偏移地址)找到该内存单元,不写DS时可使用当前默认的DS内容
如:mov ax,[2]表示将默认DS偏移0002后的内存单元的内容送到ax寄存器中
注意:8086CPU不支持将数据直接送入段寄存器,所以修改DS内容时要先将数据送入一般寄存器,再送入段寄存器
栈段
栈结构:栈是一种只能在一端进行插入或删除操作的数据结构
*8086CPU中,有两个与栈相关的寄存器:
栈段寄存器SS - 存放栈顶的段地址
栈顶指针寄存器SP - 存放栈顶的偏移地址
——任意时刻,SS:SP指向栈顶元素*
栈的两个基本的操作:
入栈:将一个新的元素放到栈顶
push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
出栈:从栈顶取出一个元素
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
注意:
(1)8086CPU不保证对栈的操作不会超界。
(2)8086CPU 只知道栈顶在何处(由SS:SP指示),不知道程序安排的栈空间有多大。我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界
- 汇编中的三种“段”
- x86汇编--(三)代码段相关 -- dw
- 温习段三:C++中的C
- 汇编 各个 段
- 汇编:段的综述
- 汇编简化段定义
- 汇编fs段
- 之三:三步法解析内核中的嵌入式汇编
- 汇编(三)
- 第十章实验(三)显示data段中的数字
- 【汇编】段中的实际数据大小与占用空间大小问题
- 汇编学习笔记-段前缀
- 汇编中定义栈段
- 16位汇编 数据段 栈段 代码段
- ADS中生成的映像文件内部共有三种输出段:RO段、RW段和ZI段
- ADS中生成的映像文件内部共有三种输出段:RO段、RW段和ZI段
- ADS中生成的映像文件内部共有三种输出段:RO段、RW段和ZI段
- 三种循环反汇编代码比较
- 好书推荐-英文原版【Understanding MySQL Internals】(附下载地址)
- C++第一次实验报告
- 一步一步实现自己的shell程序(二)---添加命令行解析和if控制流
- Mybatis的二级缓存配置
- $.ajax()方法详解
- 汇编中的三种“段”
- bind为什么会出现地址重用
- 删除或插入无头单链表的非尾结点
- 第三周
- 乐鲜生活后台管理系统--项目总结
- 三个线程交替打印A、B、C的问题
- mysql学习笔记#1
- 哈希函数BKDR的解析
- Linux Kernel input ev操作