CPU Instruction Pointer

CPU Instruction Pointer

eryar@163.com

1.Introduction

CPU对存储器的读写通过总线Bus来完成,总线又分为地址总线(Address Bus)、数据总线(Data Bus)、控制总线(Control Bus)。地址总线AB决定了CPU的寻址能力,即可以访问的存储空间的大小。数据总线DB决定了CPU的一次操作中可以处理的数据的大小,16位CPU一次可以加载两个字节,32位CPU一次可以加载4个字节。当然CPU的主频越大,那么在相同的时间内,处理的次数会更多。

2.16bit CPU 

由于8086CPU有20位地址总线,所以寻址能力为1MB。但是8086所有的寄存器都是16位的,如果由寄存器直接处理地址,那么一个16位的寄存器可以访问的最大地址为64KB。如何通过16位的寄存器来访问这1MB的空间呢?8086CPU折腾出一个地址加法器,通过加法器来根据两个16位地址来合成一个20位的地址,即物理地址=段地址X16+偏移地址。对应到CPU中就是CS和IP这两个寄存器。

8086CPU中的CS和IP的内容提供了CPU要执行指令的地址。在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS和IP中的内容决定的,程序员可以通过改变CS和IP中的内容来控制CPU执行目标指令。

若想同时修改CS和IP的内容,可以用形如jmp 段地址:偏移地址的指令完成。如下图所示:

3.32bit CPU

因为80386的CPU寻址能力是4GB,所以它的寻址模式是平坦模式,不需要用段地址+偏移地址来折腾。所以32位CPU的EIP寄存器对应了16位CPU中的CS和IP两个寄存器。修改了EIP寄存器就可以改变CPU要执行的指令。如下面一段简单代码:

#include <stdio.h> 

int main(int argc, char* argv[]) 

    mark: printf("hi\n"); 

    goto mark; 

    return 0; 
}

使用了goto,在Debug时可以在Visual Studio中看到CPU中相关寄存器中的信息如下图所示:

由上图可知,goto对应的汇编命令就是一个修改EIP寄存器的jmp指令。

时间: 2024-09-11 11:55:48

CPU Instruction Pointer的相关文章

调试-Debug Current Instruction Pointer

问题描述 Debug Current Instruction Pointer 断点并没有设在当前位置,但是只要走debug就会停在这儿,已经反复删除所有断点好几次了,eclipse也重启过,求大神指导 解决方案 Debug Current Instruction Pointer表示调试总是从这里开始.解决方案如下:清空断点,然后重启tomcat.至于如何清空断点方法如下:Window->Open Perspective->Debug 切换到breakpoint界面,在右上角,把其中的点点圈圈全

cpu工作原理简析

在了解CPU工作原理之前,我们先简单谈谈CPU是如何生产出来的.CPU是在特别纯净的硅材料上制造的.一个CPU芯片包含上百万个精巧的晶体管.人们在一块指甲盖大小的硅片上,用化学的方法蚀刻或光刻出晶体管.因此,从这个意义上说,CPU正是由晶体管组合而成的.简单而言,晶体管就是微型电子开关,它们是构建CPU的基石,你可以把一个晶体管当作一个电灯开关,它们有个操作位,分别代表两种状态:ON(开)和OFF(关).这一开一关就相当于晶体管的连通与断开,而这两种状态正好与二进制中的基础状态"0"和

CPU Segments

CPU Segments eryar@163.com 1.Introduction 8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址.段地址在8086CPU的段寄存器中存放,8086CPU有4个段寄存器:CS,DS,SS,ES. CS为Code Segment,代码段寄存器,结合指令指针寄存器IP(Instruction Pointer)来确定要执行的下一条指令的内存地址: DS为Data Segment,数据段寄存器: SS为Stack Segm

转一篇难得的好文章-CPU流水线的探秘之旅

英文原文:A Journey Through the CPU Pipeline 编译:@deuso_ICT  作为程序员,CPU 在我们的工作中扮演了核心角色,因此了解处理器内部的工作方式对程序员来说不无裨益. CPU 是如何工作的呢?一条指令执行需要多长时间?当我们讨论某个新款处理器拥有 12 级流水线还是 18 级流水线,甚至是更深的 31 级流水线时,这到些都意味着什么呢? 应用程序通常会将 CPU 看作是黑盒子.程序中的指令按照顺序依次进入 CPU,执行完之后再按顺序依次从 CPU 中出

汇编语言学习指南(一)

汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)============================x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx. 在汇编语言中,寄存器用名字来访

Linux下用来获取各种系统信息的C++类

下面是头文件内容,代码是mooon的一部分,对应的CPP文件请直接浏览:http://code.google.com/p/mooon/source/browse/trunk/common_library/src/sys/info.cpp #include <vector> #include "sys/config.h" SYS_NAMESPACE_BEGIN /*** * 用来获取系统.内核和进程的各类实时信息,如CPU和内存数据 */ class CInfo { publ

Linux系统性能指标

Linux内核提供的/proc/目录所提供的信息能够基本满足我们对当前主机性能指标的获取需求.现有网络上流传很多版本的对/proc/下文件各字段解释的blog,存在很多错误.本文结合最权威linux内核官方文档Linux Programer's Manual解释/proc/stat各字段的含义,原文档请参考:http://man7.org/linux/man-pages/man5/proc.5.html. 1.linux性能数据来源 1.1.cpu实时性能数据 /proc/stat 通过/pro

系统栈的工作原理(转)

  1.开篇 本篇文章着重写的是系统中栈的工作原理,以及函数调用过程中栈帧的产生与释放的过程,有可能名字过大,如果不合适我可以换一个名字,希望大家能够指正,小丁虚心求教!如果有哪里写的不清楚的或者错误的地方请及时更正,小丁再次谢过了.文章里面有错别字,也可能会有好友说寄存器的32.16位的区别其实我感觉这里主要讲的还是些原理性的东西,后续会将文章图片错别字进行调整.(图片里面的posh改为push) 2.内存的不同用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样

中断子系统7_中断出口处理

// 中断公共入口 1.1 common_interrupt: //所有可屏蔽中断函数的公共入口 SAVE_ALL //寄存器入栈 movl %esp,%eax // eax保存栈顶指针 call do_IRQ //中断处理函数 jmp ret_from_intr //从中断返回 // 从中断返回 // 函数主要任务: // 1.确定中断发生前的运行模式 // 1.1 恢复内核执行路径 // 1.1.1 检查是否内核抢占,执行内核抢占 // 1.1.2 恢复硬件上下文 // 1.1.3.iret