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



    前言

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


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

    1.1 汇编指令分析

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

    int main()
    {
    
        int a;
        a = 18;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    mov     DWORD PTR [rbp-4], 18
    
    • 1

    我们把关键的分解一下
    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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    关键汇编代码如下:

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

    这个DWORD PTR [rbp-4]先理解成一个寄存器,后面会讲,
    然后可以看到add这个寄存器后面加了个8,其实就是把这个寄存器里面的值+上了个8

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

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

    汇编输出分析

    在这里插入图片描述
    设原AX、BX中的值均为0000H
    我们可以通过计算器来算一算:

    首先我们可以看第一个addadd ax,1406H指令,他的结果如下:
    在这里插入图片描述
    我们接下来看第二个add指令:
    在这里插入图片描述

    二、确定物理地址的方法

    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+偏移地址

    在这里插入图片描述

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

    要解决的问题
    用两个16位的地址(段地址、偏移地址),相加得到一个20位的物理地址
    本质含义
    CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

    三、内存分段表示法

    3.1 用分段的方式管理内存

    8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址。
    内存并没有分段,段的划分来自于CPU!!!

    在这里插入图片描述

    在这里插入图片描述

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

    起始地址( 基础地址)为10000H,
    段地址为1000H,大小为100H
    在这里插入图片描述

    在这里插入图片描述
    起始地址( 基础地址 )为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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    Python编程:容器总结-字符串、列表、元组、字典、集合
    PEG化四氧化三铁纳米颗粒(氨基末端)NH2-PEG-Fe3O4
    realloc函数应用&IO泄露体验
    ssh秘钥和python 虚拟环境
    LeetCode每日一题——1619. 删除某些元素后的数组均值
    OC-归档(序列化)(了解的不多 没细看)
    Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)
    亿级异构任务调度框架设计与实践
    自注意力机制
    SpringBoot使用OpenCV开发和部署
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/134359218