• 汇编语言(王爽)学习记录_第二章


    第二章 寄存器

    一个典型的CPU由运算器,控制器 ,寄存器等器件构成。

    在CPU中:

        运算器进行信息处理;

        寄存器进行信息存储;

        控制器控制各种器件进行工作;

        内部总线连接各种器件,在它们之间进行数据的传送。

    程序员通过改变各种寄存器中的内容来实现对CPU的控制。

    2.1 通用寄存器

    8086CPU的寄存器都是16位的,通用寄存器:AX,BX,CX,DX

    为了兼容上一代CPU:

              AX可分为AH和AL

              BX可分为BH和BL

              CX可分为CH和CL

              DX可分为DH和DL

     2.2 字在寄存器中的存储

    字节:byte,一个字节由8bit组成。

    字:word,一个字由两个字节组成,高字节和低字节。例如20000存储在AX中就可以看成AH为78,AL为32

     2.3 几条汇编指令

     在编写时,不区分大小写,例:mov ax,18 和MoV AX,18含义相同。

    问题2.1中:最后add ax,bx 执行后 ax应该为8226H+8226H(H为16进制)等于1044CH。但是AX为16位寄存器所以多出了一位不能保存,最后AX为044CH。

     问题2.2中 :最后add al,93H 执行后al=C5H+93H=158H ,al作为独立的8位寄存器所以也要丢失高位1,最终ax为0085H。

     两个题总结就是:注意寄存器进行的是16位运算还是8位运算。

    检测点2.1   (一定要做检测点,加深记忆,说不定做题中就学到新知识了。)

        

    mov ax,62627 ax = F4A3
    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 = 04DBH
    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.5 16位结构的CPU

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

    8086CPU有20位地址总线,可以传送20位地址,达到1M寻址能力。在内部一次处理、传送、暂时存储的地址为16位。

    地址加法器采用  物理地址 = 段地址 + 偏移地址   

    例如1230 与 00C8  加法器做1230H*16(10进制)=12300H(这里乘法看不懂的可以推广到10进制的乘10上去验证)      12300H+00C8H=123C8H

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

    本质含义:CPU在访存时,用一个基础地址(段地址*16和一个相对于基础地址的偏移地址相加。书上给了两个例子理解,我的理解就是在限制条件下(4位16进制)下更好的增加寻址能力(有误,且喷)。

    2.8 段的概念

    书上写了两页,为了说明段的概念,我感觉其实就是逻辑上地址上的一个区分而已(有误,且喷)。

    2.9 段寄存器

    8086CPU段寄存器:CS,DS,SS,ES。提供内存访问时的段地址

    2.10 CS和IP

    CS段寄存器,IP指令寄指针存器 CS和IP可以指向读取指令的起始位置,因为计算机存储的都是二进制0和1,就是为了计算机能自己区分哪里是数据哪里是指令。

    比如CS设置为2000H,IP设置为0000H,那么计算机就从内存20000H开始把二进制01当作指令执行。执行后IP加上上一个指令的大小。继续执行下一条指令。

    2.11 修改CS、IP的指令

    程序员可以通过修改CS、IP控制执行目标指令。mov指令(称为传送指令)可以修改大部分寄存器的值(ax,bx,,cx,dx)但是不能设置CS和IP的值(8086CPU搞得鬼)。但是8086CPU提供了转移指令:jmp。用法:”jmp 段地址:偏移地址“ 作用:修改CS 和IP。“jmp 某一合法寄存器 ” 作用:用寄存器的值修改IP。

    问题2.3  挺简单的就不写了 最后死循环。

    2.12 代码段

    检测点2.3   第一次ip指向mov指令,第二次指向sub指令,第三次指向jmp,第四次指向ax=0.

    实验一

    首先需要在win10安装dsbug,自行百度搜索win10安装debug。

    debug命令:

          R:查看、修改CPU寄存器的内容

          D:查看内存的内容

          E:修改内存内容(可以是数据、指令)

          U:将内存的内容解释为机器指令和对应的汇编指令

          T:执行CS:IP指向的指令

          A:以汇编指令的形式向内存写入指令

    用R指令查看:

     用R指令修改:

    用D命令查看内存(d 段地址:偏移地址)也可以在后面添加范围(d 段地址:偏移地址1 偏移地址2) :

     用E命令修改内存内容 (e 起始地址 数据 数据 数据......)数字,字符都可以:

              也可以e 起始地址  回车后 写一个 按空格 再写一个

     用E命令写机器码:

    例如:   

        

    b80100 mov ax,0001
    b90200  mov cx,0002
    01c8    add ax,c x

     为了执行上面的指令首先得修改CS IP指向1000:0

     然后用t执行观察ip ax cx:

     用A指令写汇编指令(写完后两次回车):

     实验二

    1.用E命令写(这写的要命啊生怕出错):

     2.用A命令写(也好不到哪去哈哈,还是高级语言写着快):

     (2)2的8次放(我做的时候在8+8的时候为啥没出来16想半天,才记起是16进制  害!)

    (3)查看pc上rom的生产日期,修改不了因为是rom。

    (4)修改不了,1.15写了:地址0~7FFFH的32KB为主随机存储器的地址空间

                 地址8000H~9FFFH为显存地址空间

                  地址A000H~FFFFH为各个ROM的地址空间

     

    完!

  • 相关阅读:
    Mysql日志管理
    Mysql 安全和DCL语句
    Mysql DDL语句之视图
    Mysql增删改查(DML、DQL)
    Mysql操作之部分DDL语句
    如何做事情
    temp
    asp.net入门
    希望尽快回忆起来
    需求?
  • 原文地址:https://www.cnblogs.com/Te-mgl/p/14012473.html
Copyright © 2020-2023  润新知