zoukankan      html  css  js  c++  java
  • [汇编语言学习笔记][第二章寄存器]

    第二章 寄存器

    8086有14个寄存器,分别为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。

    2.1 通用寄存器

    8086CPU的所有寄存器都是16位,可以存放两个字节。 AX , BX , CX , DX 这四个寄存器通常用来存放一般性数据,被称为通用寄存器

    为了兼容之前的8位通用寄存器,将这4个寄存器拆开为8个8位寄存器分别为

    H的含义High,高位,L的含义Low,低位

    • AX=AH+AL
    • BX=BH+BL
    • CX=CH+CL
    • DX=DH+DL

    2.2 字在寄存器的存储

    因为..x8086架构的原因,未来的字长都指的的是16位(8086机器的一个寄存器大小)

    2.3 几条汇编指令

    mov ax,18
    mov ah,78
    add ax,8
    mov ax,bx
    add ax,bx
    

    寄存器的名称不区分大小写

    • 若AX=00C5H,执行add al,93H 后等于多少呢

      我原来以为可以变成0158H,看答案才知道因为只是al相见,所以进位必须舍去

      答案为0058H

    2.5 16位结构CPU

    为什么叫16位呢?

    • 运算器一次最多处理16位的数据
    • 寄存器的最大宽度为16位
    • 寄存器和运算器之间的通路为16为

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

    问题:8086有20位数据总线(1MB寻址能力),但是它是16位CPU内部总线(64K),只能送出16位地址,如何解决?

    解决:通过内部用两个16位地址合成的方法来形成一个20位的物理地址

    物理地址=段地址*16+偏移地址
    本质不过就是扩大了4位而已,变成了20位。
    为什么只用20位呢?因为地址总线只有20位。
    
    
    内存并没有分段,但是CPU给内存分了段。分段方式管理内存
    所以实际可能描述内存地址,用这样的方式 2000:1F60单元
    代表内存的2000段中的1F60单元
    
    • (基础地址=段地址*16)
    • (物理地址=基础地址+偏移地址)

    2.7 段寄存器

    8086有4个段寄存器: CS , DS , SS , ES

    2.8 CS和IP

    • 基本定义

      CSIP 是8086CPU中最关键的两个寄存器,他们指示了CPU当前要读取指令的地址

      CS位代码段寄存器,IP为指令指针寄存器,**任意时刻**CPU将CS:IP所指向的内容当做指令执行

    • 执行过程

      1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
      2. IP=IP+所读取指令的长度,从而指向下一条指令
      3. 执行指令,转到步骤(1),重复这个过程

    在8086CPU加电启动或复位后 (即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。即在8086PC刚启动,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元的指令是8086PC机开机执行后的第一条指令

    2.11 修改CS,IP的指令

    • 不能用mov指令

      jmp 段地址:偏移地址
      jmp 2AE3:3 //执行后 CPU将从2AE33H处读取指令
      
      jmp 某一合法寄存器(用寄存器给IP复制)
      jmp ax//执行前 ax=1000H,CS=2000H,IP=0003H
            //执行后 ax=1000H, CS=2000H,IP=1000H
  • 相关阅读:
    LInux设备驱动分析—— kmalloc和kzalloc函数
    g++使用总结
    Redis那些事(一) — Redis简介
    C++后台知识点总结(一)
    秋招复习-C++(三)
    C++之类成员的访问权限详解(一)
    c++内联函数解析(inline)
    论文图片
    markdown Typora学习随笔
    ROS 导航设计随笔
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480525.html
Copyright © 2011-2022 走看看