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

  • 2020 年 11 月 22 日
  • 筆記

第二章 寄存器

一个典型的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的地址空间

 

 

 

完!