zoukankan      html  css  js  c++  java
  • 汇编语言(王爽)第二章寄存器

    一个典型的CPU由运算器、控制器、寄存器等部件组成,部件之间靠内部总线连接。运算器进行信息处理,寄存器进行信息存储;控制器控制各部件进行工作,内部总线连接各部件以进行数据的传输。不同的CPU寄存器的个数和结构都是不尽相同的。

    2.1通用寄存器

    以8086为例,其内部所有寄存器都是16位的,即两个字节。其中AX、BX、CX、DX这4个通常存放一般性的数据,称为通用寄存器。AX的低8位(0~7位)构成一个8位寄存器AL,高8位(8~15位)构成一个8位寄存器AH,其他也类似。

    若:AX=8000H;对于指令add ax,8888H后ax的值是多少?

    8000H+8888H=10888H,但AX只能保存16位数,因此ax=0888H,最高位的“1”会被AX舍弃,但CPU并不舍弃这个“1”。

    若:ax=0080H,对于指令add al,88H后ax的值是多少?

    80H+88H=108H,但al只能保存8位,因此al=08H,最高位的“1”被al舍弃,也不会被ah接收,因此ax=0008H,同样CPU不舍弃这个“1”。

    上述两例中溢出产生的“1”都会被存放在一个特定位置,后面会学到。

    检测点2.1

    (1)写出每条汇编指令执行后相关寄存器的值:

    mov ax,62627   ax=f4a3H

    mov ah,31H      ax=31a3H

    mov al,23H   ax=3123H

    add ax,ax     ax=6246H

    mov bx,826cH  bx=826cH

    mov cx,ax    cx=6246H

    mov ax,bx   ax=826cH

    add ax,bx        ax=04d8H

    mov al,bh     ax=0482H

    mov ah,bl        ax=6c82H

    add ah,ah        ax=d882H

    add al,6       ax=d888H

    add al,al       ax=d810H

    mov ax,cx        ax=6246H

    (2)只能使用目前学过的汇编指令,最多用4条指令,编程计算2的4次方

    mov ax,2

    add ax,ax

    add ax,ax

    add ax,ax

    2.6  8086CPU给出物理地址的方法:8086有20根地址总线,寻址能力为1MB;而8086又是16位结构,在内部一次性处理的位数为16位,如果在其内部不进行处理,那只能发出最多16位的地址,即寻址能力只有64KB;为使其外部地址总线20根能都被用到,则须在其内部进行处理。这种处理方式就是用段地址和偏移地址组合的方式组成20位地址:段地址和偏移地址均为16位,通过加法运算器的运算,具体为段地址*16+偏移地址,得到20位地址数据后送入输入输出电路,再从8086内部通过输入输出电路将这20位地址送上地址总线。

    2.8  段的概念:对于物理上的内存而言,并没有分段的概念。只是对于CPU来说,通过段地址+偏移地址的方式进行寻址,“段”仅仅是一个逻辑上的概念,并无特定之说。对于同一个物理内存地址来说,它的段地址也并不是固定的,比如物理地址10086H,可以设其段地址为1000H,那么对应的偏移地址就是0086H;若设其段地址为1008H,那它偏移地址就是0006H。

    检测点2.2

    (1)给定段地址0001H,仅仅通过变换偏移地址寻址,CPU的寻址范围是(00010H)~(1000FH)。

    (2)有一数据存放在内存20000H中,现在给定段地址为SA,若想用偏移地址寻到此单元,则SA应满足的条件为:最小:1001H;最大:2000H。

    2.9段寄存器:8086有4个段寄存器,当CPU需要访问内存单元时,由这4个寄存器存放段地址。

    2.10CS和IP:在8086PC机中,任意时候,CPU都讲从CS:IP指向的内存单元开始读第一条指令并执行。8086CPU工作过程可以简要描述如下:

    (1)从CS:IP指向的内存单元取出指令,将指令传送到指令缓冲器;

    (2)IP更新为原IP+读取指令长度;

    (3)执行(1)指令缓冲器中的指令。转到(1)。

    2.11通过JMP指令修改CS和IP的值;如jmp 2168:8;执行后CS=2168H,IP=0008H。8086指令集中不提供通过mov来改变CS、IP的值。若仅想改变IP的值,则可通过“jmp 寄存器”指令完成,如:jmp ax;若此时ax=1008H,则指令执行后ip=1008H;

    检测点2.3

    下面的3条指令执行后,CPU几次修改IP?在何时?最后IP中的值是多少?

    mov ax,bx       

    sub ax,ax

    jmp ax

    答:指令执行前CS:IP指向第一条指令存放的内存单元首地址,第一条先读取进入指令缓冲器,IP第一次改变,同时指向第二条指令;第一条指令执行,读取第二条指令进入指令缓冲器,IP第二次改变,同时指向第三条指令;第二条指令执行,读取第三条指令进入指令缓冲器,IP第三次改变,同时指向第三条指令在内存中的后续内存单元;第三条指令执行,IP中的值变为ax中存放的值,这是IP第四次改变。

    实验1:

    1、关于DEBUG的使用和命令

    (1)r命令:可查看CPU中各寄存器的值,并显示当前CS:IP指向的指令。

    (2)"r  寄存器名称“命令:修改该寄存器的值。

    (3)d命令:"d  段地址:偏移地址“查看以该地址起始的128个内存单元的值,并在右侧显示对应ASCII的显示符。如:d 1000:0则查看从10000H到1007fH;如d 1000:2则查看从10002H到10081H。

    若要查看内存中指定几个连续单元的值,则用"d 段地址:起始偏移地址  终止偏移地址”;如d 1000:2 8查看的是10002H到10008H这7个内存单元的值。

    (4)e命令:修改某段内存单元的值。”e 段地址:偏移地址  修改值1  修改值2  。。。“;如”e 1000:2 0 1 2 3 4"则将地址10002H到10006H中的值分别修改成:0、1、2、3、4。

    (5)u命令:“u 段地址:偏移地址”查看以该地址起始的指令序列。

    (6)t命令:单步执行当前CS:IP指向的指令。

       

  • 相关阅读:
    异步nodejs代码的同步样子写法样例
    npm用法及离线安装方法
    javascript 事件相关使用总结01
    python wsgi PEP333 中文翻译
    android webview 播放 video经验总结
    javascript面向对象的写法03
    javascript面向对象的写法02
    Nginx在Windows下的基本介绍安装以及基本使用
    window7下 cmd命令行 Mysql导出表结构 + 表数据
    【一】Spark基础
  • 原文地址:https://www.cnblogs.com/tsembrace/p/3214834.html
Copyright © 2011-2022 走看看