• 汇编语言(第三版)第二章 寄存器 笔记


    8086CPU的14个寄存器

    AX,BX,CX,DX
    SI,DI
    SS, SP, BP
    IP,CS
    DS
    ES
    PSW

    2.1 通用寄存器

    AX,BX,CX,DX
    8086CPU所有寄存器都是16 bit 。
    为兼容上一代CPU的8bit寄存器,这四个寄存器可以拆开为8个8bit的寄存器。

    • AX-> AH AL
    • BX->BH BL
    • CX->CH CL
    • DX->DH DL

    例如:
    图2.4 16位寄存器及所分成的两个8位寄存器的数据存储情况

    2.2 字在寄存器中的存储

    8086CPU的两种尺寸:

    1. 字节:8bit 为一个字节 也就是1 Byte.可以存放在8位寄存器中。
    2. 字:两个字节是一个字2 Byte,可以存放在一个16位寄存器中。AH为AX字的高字节,AL为AX字的低字节。

    2.3 几条汇编指令

    汇编指令控制CPU的操作
    mov ax, 18将18赋值给ax
    mov ah, 78将78赋值给ah
    add ax,8将 8加到ax上
    mov ax,bx将bx赋值给ax
    add ax,bx将bx的值加到ax上

    汇编指令或者一个寄存器的名称并不区分大小写。

    问题2.1

    add ax, bx ;ax=8226h bx=8226h
    因为 ax = ax+bx = (8226 + 8226)h = (1044c )h
    又因为 ax为一个字,2个字节,16位。
    将第17位去掉,变为 044c h。
    所以 add ax,bx 后 ax为044c h。

    问题2.2

    add al,93h ;ax = 00c5h
    因为 al = c5 h, al = (c5 + 93)h = 158 h
    又因为 al是8bit,将第9bit舍弃,得到 al = 58h
    所以 add al,93h 后 ax = 0058 h。

    应当注意的是指令的两个操作对象应保持位数一致
    符合条件的:
    mov ax,bx
    mov ax,18h
    mov ax,200000 ; ax最大可以到2^16-1
    不符合条件的:
    mov ax,bl
    mov bh,ax
    mov al,20000 ;因为2^8-1 = 255 < 20000
    add al, 100h ; al最大为255,100h = 256

    检测点2.1在这里插入图片描述

    在这里插入图片描述
    ax = f4a3 h
    ax = 31a3 h
    ax = 3123 h
    ax = 6246 h
    bx = 826c h
    cx = 6246 h
    ax = 826c h
    ax = 04d8 h
    ax = 0482 h
    ax = 6c82 h
    ax = d882 h

    ax = d888 h
    ax = d810 h
    ax = 6246 h

    2.4 物理地址

    所有的内存单元构成的存储空间是一个一维的线性空间,每一个存储单元在这个空间里都有唯一的地址,我们将这个唯一的地址称呼为物理地址

    2.5 16位结构的CPU

    什么是16位结构?
    准确的说是

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

    所以应该是16位数据线,地址线应该也是至少16位的,毕竟地址位置也是数据

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

    8086 有 20位地址总线。有1MB的寻址能力。但一次传入的地址又只能是16位的,因为数据线是16位。
    所以 8086CPU采用两个16位地址合并位一个20位的物理地址。
    图2.6 8086CPU相关部件的逻辑结构
    操作步骤:

    1. CPU中的相关部件提供两个16位地址。段地址偏移地址
    2. 段地址和偏移地址通过地址加法器成为20位地址
    3. 地址加法器通过内部总线 将20位地址送入输入输出控制电路
    4. 输入输出电路将20位地址送上地址总线。
    5. 20位地址被地址总线传送到地址寄存器中

    地址加法器的操作:
    物理地址 = 段地址 * 16 + 偏移地址
    物理地址 = 段地址 << 4 + 偏移地址

    例如:
    图27 地址加法器的工作原理

    2.7 “段地址X16+偏移地址=物理地址” 的本质含义

    用一个基础地址(段地址左移4位)和一个相对于基础地址的偏移地址相加。
    基础地址+偏移地址 = 物理地址

    2.8 段的概念

    由于段地址需要左移4位,所以一定是16的倍数。
    偏移地址是16位,也就是64KB。所以一个段的长度最大为64KB

    检测点2.2

    监测点2.2

    1. 00010 h 1000f h
    2. 1001 h 2000 h ;段地址最小,偏移地址最大,段地址最大,偏移地址最小

    2.9 段寄存器

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

    2.10 CS 和 IP

    CS为代码段寄存器
    IP为指令指针寄存器

    8086CPU将会从CS:IP开始读取一条指令并执行
    图2.11 到 图2.26 可以加深CS:IP的理解

    2.11 修改CS, IP的指令

    mov传送指令
    jmp转移指令

    修改方法1:
    jmp 2AE3:3 就可以将CS=2AE3 h, IP = 0003 h了
    如果仅仅改变IP
    jmp ax 或是 jmp bx.就是将ax 或 bx赋值给IP。

    问题 2.3

    图2.27 内存中存放的机器码和对应的汇编指令
    mov ax,6622h
    jmp 1000:3
    ;jmp bx跳到这里
    mov ax,0123h
    mov ax,0000
    mov bx,ax
    jmp bx

    2.12 代码段

    代码段是人为设置的,但要作为指令,需要将CS:IP指向该起点地址。
    (3)8086的工作过程

    1. 从CS:IP指向的内存单元中读取指令,读取的指令进入指令寄存器中。
    2. IP指令指向下一个指令。
    3. 执行指令。(跳到第一个步骤)。

    检测点 2.3

    检测点2.3
    读取 mov ax,bx后 IP指向下一条指令
    读取 sub ax,ax后 IP指向下一条指令
    读取 jmp ax后 IP修改为ax,指向修改后的地址
    所以一共是三次

    实验1 查看CPU和内存,用机器指令和汇编指令编程

    1. Debug

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


    使用DOSBox来进行DOS系统模拟

    使用R

    DOSBox系统模拟
    此时的CS=073Fh ,IP=0100h
    改变AX的值
    通过R更改了AX
    更改了IP和CS
    更改了IP和CS

    使用D查看内存中的内容

    使用D查看内存中的内容
    一共显示128个内存单元内容。

    查看1000:9处的内容
    查看1000:9处的内容
    同样是显示128个内存单元的内容。

    默认的d 显示的数据就是CS:IP的地址起的数据
    默认的d显示的是CS:IP的数据
    也可以指定D指令查看指定的范围
    比方看 1000:0 到 1000:9之间的内容,使用 1000:0 9
    使用D指令查看指定的范围
    还可以查看单个数据
    查看单个数据

    使用E命令改写内存中的内容

    比方:将1000:0~1000:9中的数据改为 0 1 2 3 4 5 6 7 8 9
    将1000:0~1000:9中的数据改为 0 1 2 3 4 5 6 7 8 9

    一个一个改写,最后回车结束
    一个一个改写

    用E写入字符

    用E写入字符

    用E写入字符串

    用E写入字符串

    通过U查看内存中原有机器码对应的汇编指令

    通过U查看内存中原有机器码对应的汇编指令

    通过T命令执行我们写入的指令

    通过T命令执行我们写入的指令
    执行后我们发现AX = 0001h,正是执行了B80100.
    继续执行命令

    使用A命令以汇编指令的形式在内存中写入机器指令

    使用A命令以汇编指令的形式在内存中写入机器指令

    实验任务:

    3. 查找生产日期:

    查找生产日期

  • 相关阅读:
    单商户商城系统功能拆解23—用户标签
    LeetCode75——Day17
    【python海洋专题S2】找范围的语句进阶版本V2
    server win搭建apache网站服务器+php网站+MY SQL数据库调用电子阅览室
    不想引入mq?试试debezium
    JFinal学习
    【Spring MVC】@RequestMapping注解属性
    Linux速成命令
    ROS2自定义接口Python实现机器人移动
    喜报 | 思码逸 DevInsight 通过DaoCloud兼容性互认证
  • 原文地址:https://blog.csdn.net/orange1710/article/details/125601041