• 第三章 寄存器 (内存访问)


    3.1 内存中字的存储

    在0地址处开始存放20000(4E20H):
    在这里插入图片描述

    • 注意:0号单元是低地址单元,1号单元是高地址单元。

    3.2 DS和[address]

    • 8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。
    • 读取10000H单元的内容
    mov bx,1000H
    mov ds,bx
    mov al,[0]
    
    • 1
    • 2
    • 3

    mov al,[0]
    已知的mov指令可完成的三种传送功能:

    1. 将数据直接送入寄存器;
    2. 将一个寄存器中的内容送入另一个寄存器中。
    3. 除此之外,mov指令还可以将一个内存单元中的内容送入一个寄存器。

    mov指令格式:
    mov 寄存器名,内存单元地址
    “[…]”表示一个内存单元,“[…]”中的0表示内存单元的偏移地址。

    • 执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。

    8086CPU不支持直接将数据送入段寄存器。

    • 如何将数据从寄存器送入内存单元?
    • 将al中的数据送入内存单元10000H?
    • 结论:
    MOV BX,1000H
    MOV DS,BX
    MOV [0],AL
    
    • 1
    • 2
    • 3

    3.3 字的传送

    • 8086CPU一次可以传送一个字
    MOV BX,1000H
    MOV DS,BX
    MOV AX,[0]
    MOV [0],CX   ;cx中的16位数据送到10000
    • 1
    • 2
    • 3
    • 4

    3.4 mov、add、sub指令

    在这里插入图片描述

    3.5数据段

    • 我们可以将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
    • 比如我们用123B0H~123B9H这段空间来存放数据:
    • 段地址:123BH
    • 长度:10字节

    3.1~3.5小节

    1. 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
    2. 用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
    3. [address]表示一个偏移地址为address的内存单元。
    4. 在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
    5. mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

    3.6 栈

    • 后进先出
    • 基本操作:入栈和出栈

    3.7 CPU提供的栈机制

    入栈:PUSH
    出栈:POP

    • 8086CPU的入栈和出栈操作都是以字为单位进行的。
    • 8086CPU中,有两个寄存器:
    • 段寄存器SS 存放栈顶的段地址
    • 寄存器SP 存放栈顶的偏移地址
    • 任意时刻,SS:SP指向栈顶元素。

    3.8 栈顶超界的问题

    • SS和SP只记录了栈顶的地址,只依靠SS和SP可以保证在入栈和出栈时找到栈顶。
    • 当栈满的时候再使用PUSH指令入栈,栈空的时候再使用POP指令出栈,都将发生栈顶超届问题。
    • 栈顶超界是危险的:because我们既然将一段空间安排为栈,那么在栈空间之外的空间很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。

    栈和内存

    • 栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊方式进行访问的空间

    3.9 push、pop指令

    • push 寄存器:将一个寄存器中的数据入栈

    • pop 寄存器:出栈,用一个寄存器接收出栈的数据

    • push 段寄存器:将一个段寄存器中的数据入栈

    • pop 段寄存器:出栈,用一个段寄存器接收出栈的数据

    • push 内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)

    • pop 内存单元:出栈,用一个内存字单元接收出栈的数据
      指令执行时,CPU要指定内存单元的地址,可以在push、pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。

    3.10 栈段

    • 我们可以将长度为N(N<=64K)的一组地址连续、起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。
    • 将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就执行push、pop等栈操作指令时就自动地将我们定义的栈段当 作栈空间来访问。
  • 相关阅读:
    【c语言中的指针常量和常量指针介绍】
    什么是行锁、间隙锁
    代码整洁之道-读书笔记之函数
    《认知觉醒:开启自我改变的原动力》
    Scala入门到放弃—03—面向对象
    Mojo 正式发布,Rust 能否与之匹敌?
    SigmaStudio定时器实验1
    警告:Provides transitive vulnerable dependency maven:org.yaml:snakeyaml:1.30
    LeetCode【30. 串联所有单词的子串】
    BUUCTF helloword 1
  • 原文地址:https://blog.csdn.net/m0_49682076/article/details/124913187