【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

简介: 【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

前言


汇编语言中,mov(Move)和add(Add)指令是两个基本而重要的操作码,用于在寄存器和内存之间传递数据以及执行加法运算。这两个指令为程序员提供了对计算机底层数据处理的直接控制,是编写有效和高性能汇编代码的关键。


一、学习汇编指令——用中学


1.1 汇编指令分析

76af20b7de2b4bd1ac7091ba4baa47e4.png

我们首先看mov ax,18这条指令,他其实就是把我们的18送到ax中,或者如果你学过C/C++/Python这些高级语言,我们还可以这样表示:ax = 18

int main()
{
    int a;
    a = 18;
}


我们把上方的C代码转成汇编之后,关键代码如下:

mov     DWORD PTR [rbp-4], 18


我们把关键的分解一下

mov就是我们的指令嘛,然后DWORD PTR [rbp-4]可以理解成一个和ax差不多意思的寄存器,然后把18放入

接下来,我们的mov ah,78就和上面一样的啦,就是把78送入ah寄存器中

然后是add ax,8

他是将寄存器ax中的数值加上8

我们通过转汇编来理解,下方是我们的C程序

int main()
{
    int a;
    a = 18;
    a+=8;
}


关键汇编代码如下:

mov     DWORD PTR [rbp-4], 18
add     DWORD PTR [rbp-4], 8


这个DWORD PTR [rbp-4]先理解成一个寄存器,后面会讲,

然后可以看到add这个寄存器后面加了个8,其实就是把这个寄存器里面的值+上了个8

后面这个mov和add就是一样的了,这里不过多赘述。


注:汇编指令不区分大小写


汇编输出分析

edd5240257ac45bfbecd9cf5d9d99ff0.png

设原AX、BX中的值均为0000H

我们可以通过计算器来算一算:

首先我们可以看第一个addadd ax,1406H指令,他的结果如下:

d895f852e28b4196bd067fd3f993f09b.png

我们接下来看第二个add指令:

c25683842c9c4c25b064925efc470f85.png


二、确定物理地址的方法


2.1 什么叫做物理地址

物理地址就像是你家的具体门牌号一样,是计算机内存中每个存储单元的具体位置标识。就像你要找到一个房间一样,计算机需要知道数据存储在内存的哪个位置,这个位置就是物理地址。

想象一下,内存就是一片很大的房子,每个存储单元就像一个小房间。物理地址就是告诉计算机数据存储在这个大房子的哪个小房间里。通过物理地址,计算机能够准确地找到并访问内存中的数据,就像你通过门牌号找到家里的具体位置一样。


2.2 8086中的物理地址

CPU访问内存单元时要给出内存单元的地址。

所有的内存单元构成的存储空间是一个一维的线性空间。

每一个内存单元在这个空间中都有唯一的地址,这个唯

一的地址称为物理地址。

事实

8086有20位地址总线,可传送20位地址,寻址能力

为1M。

8086是16位结构的CPU

运算器一次最多可以处理16位的数据,寄存器

的最大宽度为16位。

在8086内部处理的、传输、暂存的地址也是16

位,寻址能力也只有64KB!

问题:8086如何处理在寻址空间上的这个矛盾?!


2.3 8086CPU给出物理地址的方法

8086CPU的解决方法

用两个16位地址(段地址、偏移地址)

合成一个20位的物理地址。

地址加法器合成物理地址的方法

物理地址=段地址×16+偏移地址

bd38d10f97d8410ba0697fab9be231a4.png


2.4 “段地址×16+偏移地址=物理地址”的本质含义

要解决的问题

用两个16位的地址(段地址、偏移地址),相加得到一个20位的物理地址

本质含义

CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。


三、内存分段表示法


3.1 用分段的方式管理内存

8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址。

内存并没有分段,段的划分来自于CPU!!!

206d7e3a2032445eb5c64ffbc7a227fb.png

6d0185f303514ce9a92ef8143743b9ec.png

3.2 同一段内存,多种分段方案

起始地址( 基础地址)为10000H,

段地址为1000H,大小为100H

8b432ee69cc74466a1bfdeec757aa493.png

025b790843c7400a8424af80f10392e3.png

起始地址( 基础地址 )为10000H和10080H,

段地址为1000H和1008H,大小均为80H

(1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;

(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。


3.3 用不同的段地址和偏移地址形成同一个物理地址

物理地址 段地址 偏移地址
21F60H 2000H 1F60H
   0F60H   2100H
   0060H   21F0H
   0000H   21F6H
   2F60H   1F00H


偏移地址16位,变化范围为0~FFFFH,用偏移地址最多寻址64KB。

例:给定段地址2000H,用偏移地址寻址的范

围是:20000H~2FFFFFH,共64K

例:数据在21F60H内存单元中,段地址是2000H,说法

(a)数据存在内存2000:1F60单元中;

(b)数据存在内存的2000H段中的1F60H单元中。

在8086PC机中存储单元地址的表示方法

段地址很重要!——用专门的寄存器存放段地址。

4个段寄存器:

CS - 代码段寄存器 DS - 数据段寄存器

SS - 栈段寄存器 ES - 附加段寄存器


总结


mov指令用于将数据从一个地方移到另一个地方,可以是寄存器之间的传递,也可以是从内存到寄存器的加载或者反之。这种直接的数据传递操作是汇编语言中基本的操作之一,为程序提供了对数据的灵活控制。


add指令则执行加法运算,允许程序员将两个操作数相加,并将结果存储在目标操作数中。这是进行算术运算的基础指令之一,为实现各种复杂的数学和逻辑运算提供了基础。


综合而言,mov和add指令在汇编语言中扮演了关键的角色,它们的合理使用能够使程序更加高效、精确地执行各种任务。通过深入理解这两个指令的功能和应用场景,程序员可以更好地利用计算机底层的处理能力,编写出性能卓越的汇编代码。

目录
打赏
0
0
1
0
60
分享
相关文章
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
335 62
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
96 6
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
1552 5
在使用 Glide 加载 Gif 动画时避免内存泄漏的方法
【10月更文挑战第20天】在使用 Glide 加载 Gif 动画时,避免内存泄漏是非常重要的。通过及时取消加载请求、正确处理生命周期、使用弱引用、清理缓存和避免重复加载等方法,可以有效地避免内存泄漏问题。同时,定期进行监控和检测,确保应用的性能和稳定性。需要在实际开发中不断积累经验,根据具体情况灵活运用这些方法,以保障应用的良好运行。
|
5月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
64 2
driftingblues9 - 溢出ASLR(内存地址随机化机制)
driftingblues9 - 溢出ASLR(内存地址随机化机制)
55 1
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
117 0
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
477 0
几组汇编指令的比较
几组汇编指令的比较
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等