通用寄存器

汇编基础知识

故事扮演 提交于 2019-11-27 23:45:51
最近感觉自己学的到了一个瓶颈,学的不知道有多少是记住的,总是感觉自己要学的东西有那么多,时间又太少。专业课也越来越多,花在编程上的时间就少了,但是这毕竟是我的兴趣爱好,所以我不想放弃。昨晚突然有个想法,以后写博客的频率加快,尽管这样博客的质量也就下降了很多,但是我还是觉得博客就是来记录我成长的地方,我该把我的学到的,哪怕是点点滴滴都记录下来,呵呵,不知道能坚持多久。 不久前看拿起了王爽老师的汇编语言看了看,觉得确实写的不错,当时因为都是基本的语法,我就看看就过去了。不过这些天发现突然很多都忘记了,所以写点东西来记录下。。。 首先是硬件的一些基础知识,cpu要对物理内存操作总得最起码要知道1,所操作的地址2.操作的数据3.操作的指令。所以cpu有地址总线(传地址的),有数据总线(传数据的),有控制总线(传命令的)。先是地址总线,一个cpu有N根地址线,寻址范围就是2^N次。数据总线也是一样的道理,传输数据都 是最大是2^N。8086cpu有20位地址总线,寻址能力是0~1M,但是数据总线是16位,就是只能传输数据0~64K,为了可持续发展,所以就想出了,两个16位地址通过一个特殊的加法器来算出一个20的地址,这就是所谓的段+偏移。具体算法:物理地址 = (段地址 * 16 + 偏移量)。16 = 0x10,其实就相当于是把段地址变成了20位和偏移量相加得出20位的物理地址。段

汇编语言1:基础知识

☆樱花仙子☆ 提交于 2019-11-27 23:45:39
  这个假期开始系统学习汇编语言,采用跟随视频教程的方式,所用教程是网易云课堂中的《汇编语言从0开始》,讲者是workWork。该课程一共有167个课时,每个课时从几分钟到十几分钟不等,时间不长,短小精悍,反馈及时,让人有动力一直看下去。这门课程很适合零基础的同学,因为在正式编程前,讲者用了大量时间讲述基础性的知识,包括二进制十进制十六进制、CPU执行指令的过程、寄存器的讲解、栈的使用等等。我个人认为,即使你已经不算零基础了,认真地看完这些课程,巩固一下基础知识也是必要的。我之前看过一本基于Linux的教材,因为Linux采用的是AT&T风格,与DOS/Windows的Intel风格有很大差异,所以即使也写过几个汇编小程序,但始终觉得对于寄存器、指令/数据长度以及栈的概念懵懵懂懂,基础并没有打好。我建议大家如果是初学者,还是先从DOS/Windows平台的汇编开始学习比较好,尤其是要使用Windows XP中的debug程序反复练习,这样可以在编程之前打好坚实的基础。   下面对编程之前的基础知识做一个小小的总结。 一、十进制、二进制和十六进制 二进制之所以重要,是因为整个计算机体系就是建立在二进制的基础上的,实际上所有的指令和数据在计算机中存储和运算的形式就是二进制。十六进制之所以重要,是因为查看内存中的指令和数据时,是以十六进制显示的。一个十六进制数字

FreeRTOS 任务栈大小确定及其溢出检测

帅比萌擦擦* 提交于 2019-11-27 10:19:11
以下转载自 https://www.cnblogs.com/yangguang-it/p/7123727.html FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式。如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用。 FreeRTOS 的系统栈设置 上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方 都是在这里配置的栈空间: 在 RTOS 下, 上面两个截图中设置的栈大小有了一个新的名字叫系统栈空间 ,而任务栈是不使用这里的空间的。 任务栈不使用这里的栈空间,哪里使用这里的栈空间呢?答案就在中断函数和中断嵌套。  由于 Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP 任务堆栈指针也是可以的。在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中

汇编语言基础

微笑、不失礼 提交于 2019-11-26 10:25:21
寄存器 寄存器是处理器内部的高速缓冲区,用于暂时存放数据。 寄存器的分类: 透明寄存器:这类寄存器不需要程序员进行操作。 可编程的寄存器:这是我们程序员需要学习的这类寄存器又分为通用寄存器和专用寄存器 32位通用寄存器:eax ebx ecx edx edi esi ebp esp 16位通用寄存器:ax bx cx dx di si bp sp 8位通用寄存器:al ah bl bh cl ch dl dh 专用寄存器的种类 标志寄存器:eflags 指令指针寄存器:eip 段寄存器:cs ds ss es gs fs 我们可以看到通用寄存器有8位16位和32位的,这是发展的结果,比如在一个32的系统中eax寄存器包含32个位,其中al是eax的最后8位,ax是eax的最后16位,因此ax也是包含al和ah的。 下面是一个图来表示各种寄存器关系 16246589-db1a04ca767f426d.png 寄存器.png 16246589-d394f64dbdd73b94.png 寄存器结构.png 下面是我们通常使用的通用寄存器名称 16246589-87d5e26a527d0dac.png 通用寄存器.png 计算机存储器的分级 按照读取速度进行分等级 硬盘->内存->缓存->寄存器 这个顺序表示存取速度依次递增的顺序进行排序的并且存储器的大小是依次递减的但是价格是依次递增的

X86架构模式

别等时光非礼了梦想. 提交于 2019-11-26 05:26:44
计算机的工作模式 对于计算机来说,CPU(central processing Unit,中央处理器)肯定是最核心的,程序执行全都要依赖于它。 CPU和其他设备连接,要靠一种叫总线(bus)的东西,其实就是主板上密密麻麻的集成电路,这些东西组成了CPU和其他设备的高速通道。 在这些设备中,最重要的是内存(memory),因为单靠CPU是没法完成计算任务的,很多复杂的计算任务需要把中间结果保存下来,然后基于中间结果进行进一步计算,CPU本身是没有办法保存这些结果的,这就需要依赖内存了。 当然总线上也会有一些其他设备,例如显卡会连接显示器,磁盘控制器会连接硬盘,USB控制器会连接鼠标和键盘等等。 CPU和内存是完成计算任务的核心组件,CPU其实也不是单独一块,它包括三个部分,运算单元 ,数据单元和控制单元。 运算单元只管算,例如做加法,做位移等等。但是它不知道应该算哪些数据,运算结果应该放在哪里。运算单元计算的数据如果每次都要经过总线,到内存中去现拿,这样就太慢了, 所以有了数据单元。数据单元包括CPU内部的缓存和寄存器组,空间很小,但是速度飞快,可以暂时存放数据和运算结果。 有了放数据的地方,也有了算的地方,还需要有个指挥到底做什么运算的地方,这就是控制单元。控制单元是一个统一的指挥中心,它可以获得下一条指令,然后执行这条指令,这个指令会指定运算单元取出数据单元的某几个数据

芯片翻译之ICM20602(二)

与世无争的帅哥 提交于 2019-11-26 00:13:08
5 可编程中断 ICM-20602有一个可编程中断系统,该系统可以在INT和DRDY引脚上产生中断信号。状态标志表示中断的来源。中断源可以单独启用和禁用。 中断名称 模块 运动检测 运动 FIFO溢出 FIFO FIFO Watermark FIFO 数据准备就绪 传感器寄存器 注: 有关中断启用/禁用寄存器和标志寄存器的信息,请参阅本文件第11节和第12节。下面解释一些中断源。 5.1 唤醒运动中断 ICM-20602提供运动检测功能。限定运动样本是从任何轴的高通过样本具有超过用户可编程阈值的绝对值的一个样本。以下步骤说明如何配置唤醒运动中断。 步骤1:确保加速计正在运行 在PWR_MGMT_1寄存器(0x6B)中,设置CYCLE = 0, SLEEP = 0, GYRO_STANDBY = 0 在PWR_MGMT_2寄存器(0x6C)中,设置SSTBY_XA = STBY_YA = STBY_ZA = 0, STBY_XG = STBY_YG = STBY_ZG = 1 步骤2:加速计配置 在ACCEL_CONFIG2寄存器(0x1D)中,设置ACCEL_FCHOICE_B = 1, A_DLPF_CFG[2:0] = 1 (b001) 步骤3:启用运动中断 在INT_ENABLE寄存器(0x38)中设置WOM_X_INT_EN = WOM_Y_INT_EN = WOM_Z