汇编语言学习

零散记录:

2.9 段寄存器

段寄存器就是提供段地址的。

8086有4个段寄存器:CS、 DS、 SS、 ES

当8086CPU要访问内存时,由着4个段寄存器提供内存单元的段地址。

  8086CPU寄存器都为16位的,可存放两个字节;AX、BX、CX、DX这4个寄存器是通常用来存放一般性的数据,被称为通用寄存器。
  AX:

2.10 CS和IP

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器

图片 1

   
 1.初始状态(CS:2000H,IP:0000H,CPU将从内存2000Hx16+0000H处读取指令执行)

   
 2.CS、IP中的内容送入地址加法器(地址加法器完成:物理地址=段地址x16+偏移地址)

     3. 地址加法器将物理地址送入输入输出控制电路

     4. 输入输出控制电路将物理地址20000H送上地址总线

     5. 从内存20000H单元开始存放的机器指令B8 23 01
通过数据总线被送入CPU中

这里我有一个困惑,为什么它知道要读取B8 23
01呢?它是怎么确定这是一个完整的指令?CPU如何判断指令长度这里给出了比较清楚的答案。

     6. 输入输出控制电路将机器指令B8 23 01
送入指令缓冲器(读取这一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。因当前读入的指令B82301长度为3个字节,所以IP中的值加3,此时CS:IP指向内存单元2000::0003)

     7.执行控制器执行指令 B8 23 01 (即mov ax 0123H)

   
 8.指令被执行后AX中的内容为0123H(此时,CPU将从2000::0003处读取指令)

     9. 重复以上的动作。

总结如下:

(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲区

(2) IP=IP+所读取的指令的长度,从而指向下一条指令

(3) 执行指令、转到步骤(1),重复这个过程。

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

问题:CPU根据什么奖内存中的信息看作指令?

CPU将CS:IP指向的内存单元中的内容看作指令。

图片 2

2.11 修改CS、IP的指令

若想同时修改CS、IP的内容,可用形如“jmp 段地址:偏移地址”的指令完成

,如

jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,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(并不是真的有这样的指令)

问题:内存中存放的机器码和对应的汇编指令情况如图,设CPU初始状态:CS=2000H,IP=0000H,请写出指令执行序列。思考后分析

图片 3

(1)mov ax,6622H

(2)jmp 1000:3

(3)mov ax,0000

(4)mov bx,ax

(5)jmp bx

(6)mov ax 0123H

(7)执行第三步

 

2.12 代码段

我们可以根据需要将一组内存单元定义为一个段。我们可以将长度为N(N<=64KB)(代码段也是段啊,所以不能超过64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元中,我们可以认为定义了一个代码段:

mov ax,0000 (B8 00 00)

add ax,0123H(05 23 01)

mov bx,ax(8B D8)

jmp bx (FF E3)

这段长度为10个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。

CPU并不会自动的将我们定义的代码段中的指令当做指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。所以要让CPU执行,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。本例中,我们可设CS=123BH,IP=0000H。

  以8086CPU而言,这四个寄存器都可分为两个可独立使用的8位寄存器使用,以-H和-L表示左右八位;
图片 4

 

    指令mov,add: 左操作数 = 左操作数与右操作数运算结果。

  8086CPU中给出物理地址方法: 两个16位地址合成一个20位物理地址:
    段地址×16+偏移地址 = 物理地址;
  ’段地址×16′
可视为基础地址;内存也以此分段的方式管理内存;段寄存器:CS 和
IP,二者指示了CPU当前要读取的指令的地址,CS为代码段寄存器,IP为指令指针寄存器;若CS中为M,IP中为N, 8086CPU将从内存M×16+N单元开始读取一条指令并执行。

  CS和IP不能通过mov改变,可用 ‘jmp’命令,形如“jmp
段地址:偏移地址”,这是修改了两者的内容,若仅想修改IP的内容,可用“jmp
某一合法寄存器”,如 jmp ax 或 jmp bx。
  最后要注意CPU的工作过程:
    ①从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲区;
    ②IP指向下一条指令;
    ③执行命令。(转到①重复步骤)。

DOS中Debug的使用:
/*关于win10中debug用不了
  1.一个方法是可以通过开机时为出现开机界面时按 f8
进入模式选择命令行模式…

  2.图形界面中:
    假如有debug最好,没有的话win+R输入command;再不行的话看下去;
    我的windows10家庭版没有了debug程序也无法运行command,只能自己想办法了,比如说度娘;emmm,分享一下。
    下载一个DOSBox,再直接打开搜狗搜索下载一个debug.exe;
    安装DOSBox,最好选择安装C盘(系统盘)外的盘,避免出问题,之后打开安装的文件夹的DOSBox
0.74 Options.bat文件,拉到最底部,添加如下代码:

  图片 5

  也可以将代码在DOSBox中输入,但这样做避免每次打开都要输一次。
  命令中D为作为虚拟盘的真实磁盘,:DOSBOX_SELF为自定义的文件夹,之后加入没有自带的debug.exe,将下载的debug.exe放入该文件夹,打开DOSBox输入debug即可使用。

 

  正常使用:

图片 6

*/
  -R:查看、改变CPU寄存器内容;
  查看CS和IP值,比如:

图片 7

  其中CS为073F,IP为0102;就是说CPU当前要读取CS:IP即0x74F2处的指令,而且在debug中还显示出了该内存单元中存放的机器码,为呃。。0000,后面则为翻译的汇编指令。

  用r指令改变寄存器中的值,如:

图片 8

  -D:命令查看内容,形如 d 1000:0,为”-d 段地址 :
偏移地址”形式,会显示接下来的128个单元的内容, 右边为ascii码值;

发表评论

电子邮件地址不会被公开。 必填项已用*标注