寄存器(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]

转载于:https://www.cnblogs.com/LoveFishC/archive/2010/11/04/3845979.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 基础概念 汇编语言是一种低级语言,它是计算机硬件指令的助记符。汇编语言直接反映了计算机的硬件结构,可以直接操作计算机的硬件资源。 汇编语言的基本单位是汇编指令,它由操作码和操作数两部分组成。操作码表示要执行的操作,操作数表示操作的对象或数据。 汇编语言的程序由若干条汇编指令组成,程序的执行顺序由程序中的指令顺序决定。 2. 寄存器 寄存器是计算机中用来暂时存储数据的高速存储器件,是汇编语言中最常用的数据存储方式。 常用的寄存器有通用寄存器、段寄存器、指针寄存器、标志寄存器等。 通用寄存器包括AXBXCX、DX等,可以用来存储数据、地址、偏移量等。 段寄存器包括CS、DS、SS、ES等,用来存储段地址。 指针寄存器包括SP、BP、SI、DI等,用来存储栈指针、基址指针、源地址指针、目的地址指针等。 标志寄存器包括CF、PF、AF、ZF、SF、OF等,用来存储运算结果的状态信息。 3. 指令集 汇编语言的指令集包括数据传送指令、算术指令、逻辑指令、比较指令、跳转指令、循环指令等。 数据传送指令用来把数据从一个地方传送到另一个地方,包括MOV、XCHG、LEA等。 算术指令用来进行加、减、乘、除等运算,包括ADD、SUB、MUL、DIV等。 逻辑指令用来进行位运算,包括AND、OR、NOT、XOR等。 比较指令用来比较两个数据的大小关系,包括CMP、TEST等。 跳转指令用来改变程序的执行顺序,包括JMP、JZ、JNZ、JE、JNE等。 循环指令用来重复执行一段程序,包括LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。 4. 程序设计 汇编语言的程序设计需要掌握一定的技巧和方法,包括程序的结构、数据的处理、流程控制等。 程序的结构包括程序的头部、数据段、代码段、堆栈段等。 数据的处理包括数据类型、数据的存储和读取、数据的转换等。 流程控制包括条件判断、循环控制、函数调用等。 5. 汇编器和调试器 汇编器是将汇编语言程序翻译成机器语言程序的工具,可以将汇编语言程序转换成目标代码或可执行文件。 调试器是用来调试程序的工具,可以帮助程序员查找程序中的错误、调试程序的执行流程等。 6. 总结 学习汇编语言需要掌握基本概念、寄存器、指令集、程序设计、汇编器和调试器等知识,需要进行大量的实践和练习,才能掌握汇编语言的编程技巧和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值