zoukankan      html  css  js  c++  java
  • 8086汇编--1--通用寄存器和简单汇编指令

    By:wangyz
    1,通用寄存器
    8086CPU所有的寄存器都是16位
    数据寄存器:ax  bx  cx  dx 
    指针及变址寄存器:bp  sp  di  si
    段寄存器:CS  DS  SS  ES
    控制寄存器:IP
     
     
    数据寄存器
    也称为通用寄存器,均为16位,包括AX,BX,CX和DX
     
    16位寄存器的逻辑结构
     
     
    4个16位寄存器又可分割成8个独立的8位寄存器
     
     
    AX 累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作;
    BX称为基地址寄存器(Base Register),可作通用寄存器用,在计算存储器地址时,常用作基址存储器;
    CX称为计数寄存器(Count Register),常用作循环计数器;在位操作中,要用CL来指明移位的位数;
    DX称为数据寄存器(Data Register)。在进行双字的乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
     
     
    字在存储器中的存储
    字:word,一个字由2个字节组成
    一个字节可以存放在8位寄存器中
    一个字可以存放在一个16位寄存器中,高位字节放于高8位寄存器中,低位字节放于低8位寄存器中。
    如十进制数字20000存放到AX中,二进制表示为0100-1110-0010-0000,十六进制表示为4E20h
    AX的高8位AH中为4Eh,AX的低8位AL中为20h
     
     
    简单汇编指令
    mov指令:数据传送指令, 2地址指令
    add指令:算术指令,2地址指令
    注意:在进行数据传送或算术运算时,指令的两个操作对象的位数应当一致!
     
    mov ax,18
    将18送入寄存器AX中,AX=18
    mov ah,78
    将78送入寄存器AH中,AH=78
    add ax,8
    将寄存器AX中的数值加8,AX=AX+8
    mov ax,bx
    将寄存器BX中的数据送入AX,AX=BX
    add ax,bx
    将AX和BX中的数值相加,存入AX中,AX=AX+BX
     
     
    示例:
    AX和BX的初始值都为0000H
     
    mov ax,001AH  ax=001AH bx=0000H
    mov bx,0026H  ax=001AH bx=0026H
    add al,bl  al=al+bl=1AH+26H=40H  ax=0040H bx=0026H
    add ah,bl ah=ah+bl=00H+26H=26H ax=2640H bx=0026H
    add bh,al bh=bh+al=00H+40H=40H ax=2640H bx=4026H
    mov ah,0 ax=0040H bx=4026H
    add al,85H al=al+85H=40H+85H=C5H ax=00C5H bx=4026H
    add al,93H al=al+93H=C5H+93H=158H (al为8位寄存器,最高位1丢失)
    ax=0058H bx=4026H
     
     
    物理地址(了解即可)
    8086CPU有20位的地址总线,可以传送20位的地址,达到1M的寻址能力。
    8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位。
    从8086内部结构来看,表现的寻址能力只有64KB
    8086采用一种在内部用两个16位地址合成的方法来形成20位的物理地址。
    1.cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
    2.段地址和偏移地址通过内部总线送入一个叫做地址加法器的部件。
    3.地址加法器将两个16位地址合并为一个20位的物理地址。
    4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路
    5.输入输出控制电路将20位物理地址送上地址总线。
    6.20位物理地址被地址总线送入存储器
     
    地址加法器采用 物理地址=段地址*16+偏移地址 的方法将段地址和偏移地址合成物理地址
    例如:cpu要访问地址为123C8H的内存单元
     
     
     
    段的概念
    段地址名称中的段的概念,可能会让人误以为内存被划分成了一个一个的段,每个段又一个段地址。
    内存并没有分段,段的划分来自于CPU。由于8086CPU用段地址*16+偏移地址=物理地址的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存,
    地址10000H-100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。
    也可以认为地址10000H-1007FH,10080H-100FFH的内存单元组成两个段,他们的原始地址基础地址为:10000H和10080H,段地址为:1000H和1008H,大小都为80H
     
    偏移地址16位,变化范围0000H-FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元
    比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为10000H-1FFFFH,也是64KB,段有16个即16*64=1024KB=1M
     
     
     
    段寄存器(了解,后面有详细的解释)
    8086CPU有4个段寄存器:CS,DS,SS,ES
    CS:代码段code
    DS:数据段data
    IP:指令指针寄存器,指向下一条要执行的命令
     
    CS和IP
    CS和IP指示了CPU当前要读取的指令的地址,
    CS是代码段寄存器,IP是指令指针寄存器
    在8086机器中,任意时刻,设CS中的内容为M,IP为N,CPU将从内存M*16+N单元开始读取一条指令并执行
    也可以这样表述,任意时刻,CPU将CS:IP指向的内容当作指令执行。 
     
    修改CS:IP指令
    在CPU中。能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
    CPU从何处执行指令由CS:IP决定的,程序员可以通过修改CS,IP的值来控制CPU执行目标指令。
    jmp指令:
    同时修改CS:IP的值,可用"jmp 段地址:偏移地址"的指令完成
    jmp 2AE3:3 执行后:CS=2AE3H IP=00003H,CPU 将从2AE33H处读取指令
    jmp 3:0B16 执行后:CS=0003H IP=0B16H,CPU将从00B46H处读取指令
    若仅想修改IP的值,"jmp 某一个合法寄存器"
    jmp ax,指令执行前:ax=1000H cs=2000H ip=0003H
    指令执行后 ax=1000H cs=2000H ip=1000H
    jmp ax 在含义上近似 mov ip,ax
    修改cs,mov cs,ax
  • 相关阅读:
    网络爬虫基础练习
    中文词频统计
    综合练习:英文词频统计
    字符串、组合数据类型练习
    MVC Controller进行单元测试
    mvc、webapi杂记
    C#异步执行
    cross-domain-ajax-request-jquery
    JS将/Date(1446704778000)/转换成string
    SQL并发数查询
  • 原文地址:https://www.cnblogs.com/sgtb/p/3682297.html
Copyright © 2011-2022 走看看