汇编(三)段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题

简介: 段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题、汇编、汇编编程、win10怎么使用debug

**偏移地址:

偏移地址是指段内相对于段起始地址的偏移值,
例如一个存储器的大小是1KB,可以把它分为4段,第一段的地址范围就是0—255,第二段的地址范围就是256-511,依次类推。

段地址:

段地址就是每一段的首地址,第一段的段地址就是0,计算它们的物理地址只需要把段地址左移4位就可以了,再加上偏移地址就可以了

_2019_09_04_3_55_13
(H表示16进制)
_2019_09_04_9_32_40

段的概念:

错误认识:内存被划分成了一个一个的段,每个段有一个段地址
其实:
    内存并没有分段,段的划分来自于CPU,由于8086CPU用(段地址*16)+偏移地址=物理地址
    的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存
以后在编程时可以根据需要,将若干个地址联系的内存单元看做一个段,用段地址*16定位段的起始地址(基础地址)
用偏移地址定位段中的内存单元
注意:
    1.段地址*16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数
    2.偏移地址为16位,16位地址的寻址能力为64k  所以一个段的长度最大为64k

内存单元地址:

CPU访问内存单元时,必须向内存提供内存单元的物理地址
CPU可以用不同的段地址和偏移地址形成同一个物理地址
偏移地址16位,变化范围为0~FFFFH,仅用偏移地址最多可寻64k个内存单元
    比如段地址为10000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH
在8086CPU中:
    存储单元的地址用两个元素来描述,即段地址和偏移地址
    
    数据在21F60H内存单元中 对于80806PC机的两种描述:
        1.数据存在内存2000:1F60单元中
        2.数存在内存的2000段中的1F60H单元中

段寄存器:

段寄存器就是提供段地址的
CS:代码段寄存器;
DS:数据段寄存器;
SS:堆栈段寄存器;
ES:扩展段寄存器;
IP:指令指针寄存器
当CPU要访问内存时,有这四个段寄存器提供内存单元的段地址
CS和ip是CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址

CPU工作原理:

1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
2.IP=IP+所读取指令的长度, 从而指向下一条指令
3.执行指令,跳转到步骤1  重复过程
在加电或复位即CPU开始工作时 CS被设置为CS=FFFF,IP被设置为0000。
CPU从内存FFFF 0单元中读取执行指令
FFFF 0单元中的指令是开机后执行的第一条指令

CS和IP:

在任何时候 CPU将CS、IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址
到内存中读取指令码。执行

如果说内存中的段信息曾被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过

修改CS、IP的指令:

在CPU中,能够用指令读写部件只有寄存器。可以通过改变寄存器中的内容实现对CPU的控制
CPU从何处执行指令是由CS、IP中的内容决定的。可以通过改变CS、IP中的内容来控制CPU执行目标指令
如何改变:
    mov 传送指令
        如:mov ax, 123
        mov指令可以改变大部分寄存器的值,被称为传送指令
        mov指令不能设置CS、IP的值,8086提供了另外的指令来改变它们的值
    jmp 转移指令:
        同时修改CS、IP的内容:
        jmp 段地址:偏移地址
        如:
            jmp 2ae3:3
            jmp 3:0b16
        用指令中给出的段地址来修改CS, 偏移地址修改IP
仅修改IP的内容:
    jmp 某一合法寄存器
    如:
        jmp ax(类似于 mov IP,ax)
        jmp bx
    用寄存器中的值修改IP

代码段:

在编程是可以根据需要。将一组内存单元定义为一个段
可以将长度为n(n<=64kb)的一组代码 ,存在一组地址连续且起始地址为16的倍数
的内存单元中,这段内存是用来存放代码到的,从而定义了一个代码段

CPU只认 被CS:IP指向的内存单元 中的内容为指令
如何使得代码段中的指令被执行?
    将一段内存当做代码段,仅仅是我们在编程时的一种安排
    CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当做指令来执行 
    所以要将CS:IP指向所定义的代码段中的第一条指令的首地址

小结:

1.段地址在CPU的寄存器中存放,当CPU要访问内存时,由段寄存器提供内存单元的段地址
  CPU有4个段寄存器,其中CS来存放指令的段地址
2.CS存放指令的段地址,IP存放指令的偏移地址
  任意时刻,CPU将CS:IP指向的内容当做指令执行
3.CPU的工作过程:
    从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
    IP指向下一条命令
    执行指令(调整到步骤1)重复这个过程
4.CPU提供转义指令来修改CS、IP的内容

debug:

老版本windows直接cmd  输入debug就可以进入
我的是win10  需要安装DOSbox软件
安装好DOSDbox后打开会有这样的界面
同时下载一个debug.exe  可以放在任意一个盘

在dosbox窗口输入:
    mount c d:\
    d:\
    debug:
进入debug模式(这里的d盘就是你放debug.exe的地方)

debug命令:

R命令:
    查看、改变 CPU寄存器的内容
D命令:
    查看内存中的内容
E命令:
    改写内存中的内容
U命令:
    将内存中的机器指令翻译成汇编指令
T命令:
    执行一条机器指令
A命令:
    以汇编指令的格式在内存中写入一条机器指令

课后题:

_2019_09_04_8_48_11
21_53_11__09_04_2019
20190904215956
20190904220244
20190904220457
20190904221349
20190904221518

第二题:

计算2的8次方
20190904222236

_2019_09_04_10_27_26

20190904223613
20190904224148

**

相关文章
|
5月前
|
存储 程序员 存储控制器
【读书笔记】汇编语言(第四版)第二章 寄存器
【读书笔记】汇编语言(第四版)第二章 寄存器
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
38 2
|
1月前
|
存储 安全 NoSQL
driftingblues9 - 溢出ASLR(内存地址随机化机制)
driftingblues9 - 溢出ASLR(内存地址随机化机制)
37 1
|
4月前
|
监控 Python
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
paramiko 模块 ---Python脚本监控当前系统的CPU、内存、根目录、IP地址等信息
|
5月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
8086 汇编笔记(十):标志寄存器
8086 汇编笔记(十):标志寄存器
|
4月前
|
编译器
8086 汇编笔记(六):更灵活的定位内存地址的方法
8086 汇编笔记(六):更灵活的定位内存地址的方法
|
5月前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
5月前
|
存储 编译器
指针?地址?内存?
指针?地址?内存?
82 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
385 0