zoukankan      html  css  js  c++  java
  • 寄存器(CPU工作原理)05 零基础入门学习汇编语言10

    第二章:寄存器(CPU工作原理)10

     

    让编程改变世界

    Change the world by program


     

    段寄存器

    段寄存器就是提供段地址的。 8086CPU有4个段寄存器:CS、DS、SS、ES 当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。  

    CS和IP

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

    CS为代码段寄存器;

    IP为指令指针寄存器。

      8086PC读取和执行指令相关部件 [caption id="attachment_268" align="aligncenter" width="300"] 8086PC读取和执行指令相关部件[/caption]   8086PC读取和执行指令演示 [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/2_8086CPU读取和执行指令的过程.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]  

    8086PC工作过程的简要描述

    从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

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

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

      在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。 FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。 在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。 如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。  

    修改CS、IP的指令

      在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。 CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。   我们如何改变CS、IP的值呢? 8086CPU必须提供相应的指令   先回想我们如何修改AX中的值? mov 指令 如:mov ax,123 mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。   能够通过mov 指令改变CS、IP的值吗? mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。 8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令   同时修改CS、IP的内容:

    jmp 段地址:偏移地址

    jmp 2AE3:3

    jmp 3:0B16

    功能:用指令中给出的段地址修改CS,偏移地址修改IP。   仅修改IP的内容:

    jmp 某一合法寄存器

    jmp ax (类似于 mov IP,ax)

    jmp bx

    功能:用寄存器中的值修改IP。  

    问题分析:CPU运行的流程

    内存中存放的机器码和对应汇编指令情况: (初始:CS=2000H,IP=0000H) [caption id="attachment_270" align="aligncenter" width="300"] CPU运行的流程[/caption]   问题分析结果 (1)mov ax,6622 (2)jmp 1000:3 (3)mov ax,0000 (4)mov bx,ax (5)jmp bx (6)mov ax,0123H (7)转到第(3)步执行  

    代码段

      对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。 可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。 [caption id="attachment_271" align="aligncenter" width="260"] 代码段[/caption] 这段长度为 10 字节的字节的指令,存在从123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存单元是用来存放代码的 ,是一个代码段 ,它的段地址为123BH,长度为10字节。   如何使得代码段中的指令被执行呢? 将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。 CPU 只认被 CS:IP 指向的内存单元中的内容为指令。 所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。 如刚才的 CS = 123BH,IP = 0000H。  

    小结

    1、段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。 2、CS存放指令的段地址,IP存放指令的偏移地址。8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。 3、8086CPU的工作过程:

    从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

    IP指向下一条指令;

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

    4、8086CPU提供转移指令修改CS、IP的内容。   检测点2.3 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LNXZRVOWJVHL']视频下载[/Downlink]
  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3845979.html
Copyright © 2011-2022 走看看