汇编入门

存储单元:

              存储器被划分为若干个存储单元,一个存储单元有一个字节也就是八个bit,也就是八位。可以存储八个二进制位。

CPU

              CPU通过总线将电子信息传递到存储器。因为CPU要对存储器进行读写的话,就要传递要读写的数据的地址,数据内容,以及要对数据进行什么操作。所以总线包括:数据线,地址线,控制线。如:CPU要对某一个存储单元进行操作,它首先通过地址线把那个存储单元的地址传给存储器,然后再通过控制线把命令(读或者写)发过去,然后再通过数据线把数据读入或者写出。

地址总线:

              地址总线的寻址能力由地址总线的宽度决定,宽度用多少根线来表示,比如有十根地址总线,那么宽度就是十。假设宽度是N,那么这台电脑能寻找2的N次方个存储单元。

             内存地址空间:一个CPU的地址总线关系到构成这CPU的内存地址空间,地址总线宽度为N,那么这个CPU只能寻到2的N次方的内存地址空间,这可寻到的2的N次方的内存单元就是这CPU的内存地址空间。 因为一个内存单元为一字节,所以地址总线的寻址能力通常也可以用KB,MB,GB来表示。如宽度为十,2的10次方。寻址能力就是1KB,都是表示1024个内存单元。

             逻辑存储器(内存地址空间):一个假想的存储器,CPU将系统中各类存储器看成一个逻辑存储器,就是现在对CPU来说,只有一个存储器,就是这个逻辑存储器,而各类存储器相当于这个逻辑存储器里面的不同段的地址空间。

数据总线:

             数据总线的宽度决定了CPU与外界传输数据的速度。宽度为8,那么一次就能传输8位二进制数,为16就能传输16位二进制数,一次一根线传输一位二进制数。

控制总线:

             控制总线是由许多根有不同控制功能的线组成,每根线的控制能力都不一样,所以CPU控制总线的宽度决定了CPU对外部器件的控制能力。

寄存器:

           一个CPU由寄存器,运算器,控制器组成,寄存器负责存储数据。通用寄存器:AX,BX,CX,DX。8086CPU的寄存器都是16位的,能存放两个字节。一个寄存器又能分为两个部分,一个高位字节如AH,还有一个地位字节如AL。这两个部分可以单独看成一个八位寄存器来用。当寄存器当整体来看时,它可以进行16位的二进制运算,当分成高位地位来看时,只能算八位的。就比如当mov AL,N。当N化成二进制大于8位时,存在AL中的数据只有N的后八位,第一位要舍去。而当看成整体计算时,就会进一位,不会舍去。

物理地址:

               每个内存单元都有一个唯一的物理地址。CPU要对存储单元进行操作就要传输存储单元的地址等信息,而当一个存储单元的物理地址超过了16位时,该怎么办。这里举例8086CPU给出物理地址的方法。8086CPU采用段地址的方法,就是用两个16位地址来合成,用段地址乘16再加上偏移地址,得到最终的地址。因为地址都用16进制来表示,所以乘16就是往左移了一位。

具体操作见下图:

汇编入门

 

 段的概念:

                把地址分成段,就像把地址分成一块一块的,每个块的第一位就是段地址,然后偏移地址就是每个块里面更详细的,直接指出了存储单元在哪。

段寄存器CS储存段地址,寄存器IP储存偏移地址。

汇编入门

CS和IP把段地址和偏移地址送入地址加法器,然后地址加法器把加好的地址送入输入输出电路,然后输入输出电路再把地址传入内存,内存后面再把数据传到输入输出电路,它再传给指令缓冲器,这时IP指向下一个命令的地址,然后指令缓冲器将数据传给执行控制器,执行命令。CPU将CS,IP指向的地方都当成命令来处理。

 汇编指令:

                mov 指令可以改变大多数寄存器中的内容,但是不能改变CS,IP中的内容。可以用 jmp 来改变CS,IP中的内容。

Debug:

             因为win7后电脑上就没有自带Debug,所以要自己在网上下一个。要先下一个DOSBox,然后再下一个debug文件。下载完DOSBox后解压,然后会有一个安装包

汇编入门

点击安装,安装后会多出一个文件汇编入门

 这个文件待会有用。我们点开DOSBox,会出现一个这样的框框:

汇编入门

其实是两个框框。我们可以在那个小框框里输入debug指令,但是每次都要像上面那样进入虚拟环境,为了避免这种麻烦,我们就要用到上面说的那个文件 ,我们点进那个文件,然后找到一个叫DOSBox  options的文件,点进去再最下面这样操作:

汇编入门

最下面三行是我们要加上去的,然后每次就不用再像那样先输那些东西了。

我们目前要用的几条debug指令:

  • R指令,用于查看或者修改寄存器中的内容。用法后面发图。
  • D指令,用于查看内存中的内容。
  • E指令,用于修改内存中的内容。
  • U指令,将内存中的机器指令翻译成汇编指令。
  • T指令,执行一条指令。
  • A指令,用汇编形式在内存中写入一条机器指令。

汇编入门

输入r,显示各个寄存器的值。

汇编入门

这样修改CS,IP中的内容。

输入d查看内存中的内容

汇编入门

还可以查看指定地址的内容

汇编入门

冒号前面的是段地址,后面的是偏移地址,当没给出范围时,它会给出你指定的那个地址开始往后128个存储单位的内容,都是十六进制。每一行给出16个,有八行。最前面是这一行内存地址的段地址以及这一行第一个的偏移地址,因为段地址只能是16的倍数,所以要像图中那样显示。也可以指定范围:

汇编入门

数据的中间有根杠,是为了更方便查看。

用E命令修改内存中的内容有两种方式,一种是一个一个地修改,先输入起始位置,然后后面再输入要修改的内容:

汇编入门

还有一种是给出起始位置后摁下ENTER键,然后它会显示出你指定的那个起始地址的内存的内容,然后你直接输入要修改的内容,再摁下空格,它会自动跳到下一个地址,然后再用同样的方式修改就可以了。

汇编入门

 U命令也可以指定起始位置和范围。

汇编入门

汇编入门 

T指令:只用输入T,CPU就会执行这时CS,IP所指向的内存中的机器码所对应的指令。

汇编入门

我们可以先用r指令看到,AX寄存器中的值为0,BX中的为0010,然后我们再用R指令修改CS,IP中的值是它指向10000,然后再用R指令看一下,发现下面的命令变成了 mov ax,bx 这就是此时CS,IP指向的内存中的机器码表示的指令,这时我们输入t,CPU就会执行这个指令,然后CS,IP就会指向下一个内存地址。我们可以看到此时AX中的值变成了BX中的值。

用A指令也可以指定地址起始位置和范围。

汇编入门

这样这些地址中的机器码代表的就是我们输入的这些指令了,然后我们可以用 r 指令令CS,IP指向这些内存,然后用T指令就可以执行我们输入的这些指令了。