精华内容
下载资源
问答
  • 关于寄存器操作的清0和置1
    千次阅读
    2020-02-28 03:41:03

    1.概述

    • 对于玩过单片机的人来说,寄存器多多少少都是有接触过的,只是有的开发板有现成的函数库可以用,所以很多人对寄存器的了解还是比较少的。其实,库函数最终还是对寄存器进行操作。 我要说的重点来了——>对于一个特定功能模块的实现,我们开发的过程大致如下:
      了解这个功能模块的相关知识并根据要求将模块化大为小;
      在开发过程中,我想 很重要的一份资料就是芯片手册;
      在所有功能完善之后,就需要整体连接进行测试,寻找bug,改bug;
      再接下里就是进行代码优化

    2.寄存器操作

    • 对于寄存器的某些位清零,我们要用到 &
     LCDIF->CTRL &= ~(7<<13);  //对LCDIF 的 CTRL寄存器的 bit15~13 进行清零
    
    • 对于寄存器的某些位置1,我们要用到 |
    LCDIF->CTRL |= (5<<13);  //对LCDIF 的 CTRL寄存器的 bit15~13 设置为 101
    

    这些都是基本的操作,对一个寄存器的多个连续位进行配置,几乎基本上都是先清零,然后再进行或操作。
    但是有些寄存器一定要注意复位的状态下某些位是有置1的,如果没有清零,将会很难发现错误。
    例如在这里插入图片描述
    寄存器CCM_ANALOG->PLL_VIDEO复位值为0x0001_100C,第12位为1,
    其bit12 是关闭PLL在这里插入图片描述
    由于没有这bit12 清0,造成功能时好时不好,调试了好几个小时,才发现这个问题。

    3.总结

    • 对寄存器操作时,可先全部清零,然后根据芯片手册对对应位进行配置。
    更多相关内容
  • 文章目录一、通用寄存器(GPR)二、EFLAGS寄存器(标志寄存器)三、指令指针寄存器(EIP)四、段寄存器(Segment Register) 通用寄存器(General Purpose Registers,32位,8个) 段寄存器(Segment Registers,16...

    通用寄存器(General Purpose Registers,32位,8个)
    段寄存器(Segment Registers,16位,6个)
    程序状态与控制寄存器(Program Status and Control Register,32位,1个)
    指令指针寄存器(Instruction Pointer,32位,1个)

    一、通用寄存器(GPR)

    IA-32体系结构拥有8个32位通用寄存器(General Purpose Register, GPR),其名称与基本功能如下表所示。
    在这里插入图片描述
    在这8个通用寄存器中,一些通用寄存器可进一步切分为16位或8位寄存器,以保证向后兼容性,具体如下图所示。

    例如,寄存器AX引用寄存器EAX的低位字,而AH和AL标识符则分别引用寄存器AX的高字节和低字节。

    对于栈指针寄存器和变址寄存器,也可使用对应的16位版本(BP、SP、SI、 DI)来引用32位寄存器的低16位。

    通用寄存器切分及命名示意图【注:高(H: High)、低(L: Low)】:
    在这里插入图片描述

    二、EFLAGS寄存器(标志寄存器)

    EFLAGS: Flag Register,标志寄存器

    IA-32中标志寄存器的名称为EFLAGS,其大小为4个字节(32位),由原来的16位FLAGS寄存器扩展而来。
    EFLAGS寄存器的每位都有意义,每位的值或为1或为0,代表On/Off或True/False。
    其中有些位由系统直接设定,有些位则根据程序命令的执行结果设置。

    32位的EFLAGS寄存器用于存储算数操作符状态或其他执行状态。该寄存器中的各个位表示不同的标识,包括一组状态标识、一个控制标识和一组系统标识。EFLAGS寄存器中的标识主要用于实现条件分支。
    其中,与程序调试相关的状态标识包括:零标识(ZF),溢出标识(OF),进位标识(CF)和符号标识(SF)。各标识的具体含义如下:

    (1)零标识(ZF)。若算数或逻辑运算结果为0,则ZF值为1,否则ZF值为0。

    (2)溢出标识(OF)。有符号整数溢出时,OF置为1;最高有效位(MSB)改变时,OF置为1。

    (3)进位标识(CF)。无符号整数溢出时,CF置为1。

    (4)符号标识(SF)。等于运算结果的最高位(即有符号整数的符号位);0表示正数, 1表示负数。

    (5)方向标识(DF)。另一个需要注意的标识是控制标识(DF),该标识位为方向标识,用于控制串处理指令处理信息的方向。当DF为1时,每次操作后使变址寄存器ESI和EDI减小,这样就使串处理从高地址向低地址方向处理;当DF为0时,处理方向相反。DF标识由STD指令置位,由CLD指令清除。

    (6)陷阱标识(TF)和中断允许标识(IF)。它们是与中断和异常相关的标识位。如果TF标识位置为1,CPU将在执行完每条指令后产生单步中断,调试器使用该特性在调试程序时进行单步执行,该标识位还可用于检查调试器是否正常运行如果IF位置位,则CPU在收到中断请求后,应该对中断请求进行响应处理。

    EFLAGS寄存器中的标识位及其功能:
    在这里插入图片描述
    -r用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC
    这些符号代表的就是标志寄存器里常用标志位的值。

    这个是符号值对应表:

    溢出标志OF(Over flow flag) 		OV(1) NV(0)
    方向标志DF(Direction flag) 		DN(1) UP(0)
    中断标志IF(Interrupt flag) 		EI(1) DI(0)
    符号标志SF(Sign flag) 			NG(1) PL(0)
    零标志ZF(Zero flag) 			ZR(1) NZ(0)
    辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
    奇偶标志PF(Parity flag) 		    PE(1) PO(0)
    进位标志CF(Carry flag) 			CY(1) NC(0)
    

    EFLAGS寄存器(标志寄存器)的OD演示

    三、指令指针寄存器(EIP)

    32位指令指针寄存器(EIP)存放指令指针,即当前代码段中将被执行的下一条指令的线性地址偏移。

    程序运行时,CPU根据CS段寄存器和EIP寄存器中的地址偏移读取下一条指令,将指令传送到指令缓冲区,并将EIP寄存器的值自增,增大的大小即被读取指令的字节数。

    EIP寄存器的值一般不能直接修改,EIP寄存器的更改有两种途径:一是通过特殊的跳转和调用/返回指令JMP、Jcc、CALL、RET等;二是通过中断或异常进行修改。

    四、段寄存器(Segment Register)

    在IA-32体系结构中,存在6个16位的段寄存器: CS、SS、DS、ES、FS和GS。分别用于存储保护模式下逻辑地址中的段选择器。

    (1)代码段寄存器(CS,Code Segment):存放应用程序代码所在的段的段描述符索引(该段描述符中包含代码段的线性基址)。易知,CPU在获取将要执行的下一条指令时,使用CS寄存器找到代码段的线性基址,再与EIP中的线性地址偏移量相加,从而得到下一条指令的线性地址。

    (2)栈段寄存器(SS,Stack Segment):存放栈段的段描述符索引(该段描述符中包含栈段的线性基址)。

    (3)数据段寄存器(DS(Data Segment)、ES、FS、 GS):存放数据段的段描述符索引(这些描述符中均包含数据段的线性基址)。其中,DS数据段含有程序使用的大部分数据,ES、FS和GS分别对应IA-32中引入的附加数据段。ES数据段可以为某些串指令存放目的数据,FS数据段寄存器可用于计算结构化异常处理(Structured Exception Handler, SEH)、线程环境块(Thread Environment Block, TEB)、进程环境块(Process Environment Block, PEB)等地址。

    展开全文
  • 汇编基础--寄存器与常用指令(二)

    千次阅读 2022-03-04 17:18:49
    汇编基础--寄存器与常用指令(二) 堆栈的使用方式: X86下栈是由高地址向低地址分配的,有专门的汇编指令push与pop完成入栈与出栈操作。 初始状态,左上黑色的位置是下一条将要执行的指令push 1,右下黑色的位置...

    堆栈的使用方式:

    X86下栈是由高地址向低地址分配的,有专门的汇编指令push与pop完成入栈与出栈操作。

    初始状态,左上黑色的位置是下一条将要执行的指令push 1,右下黑色的位置是当前栈指针指向的位置(这是一个动态分析)。

    执行完成之后push指令将当前栈指针向低地址移动8个字节(64位CPU,32位则是移动4个字节),并且存入数字1。

    执行完pop rax之后,栈指针向高地址移动8个字节(同push一致),并且将移动之前地址中存放的1,放入了rax寄存器(类似于变量的概念)

    同时也可以看到寄存器rsp随着push指令与pop指令在上下浮动。实际上rsp就是当前栈指针。它指向的地址将会作为push与pop指令的依据。

    同时也可以通过访问内存的方式去访问它们。

      

    跳转指令:

     跳转指令实际上像是提供一个对eip/rip的写入操作,跳转指令可以使得程序从另一个地方继续执行。

    如图,执行完jmp指令后会从7ffbbbf84b0e开始执行,rip将会被设置成7ffbbbf84b0e。(rip指向将要执行的指令,并不是已经执行完的指令)

    在汇编代码开发中由于无法得知编译后运行后,要跳转的地址如何表示,所以一般用标签标志。与C中的goto 极其相似:

    jmp next

    ....

    next:

    ...

    同时可以发现指令码是EB 0C,其中0C是将要跳转的指令距离jmp的下一条指令的距离 B0E-B02 = 0C。如此,修改二进制为EB FE是跳转到B02+FE? 并不是,FE被解析成有符号的一字节数字。B0E+(-2)才是要跳转的地址。答案是跳转自身,是个死循环。

    除了直接的跳转指令外还有条件跳转,它类似于C中的if语句。其判断依据是rflags/eflags寄存器。

    Flags寄存器提供许多标识状态:

    ZF:  Zero Flag 当上次运算结果为0是被置位。

    PF:  Parity Flag 运算结果最地一位的二进制1加起来个数是偶数时被设置位。

    AF:  Auxiliary Carry Flag 运算在最低的一个十六进制字母进位或借位时置位。如0xf + 0x1。

    OF:  Overflow Flag 运算结果产生溢出时被置位(包括有符号运算)(结果大于最大存储数字或小于最小存储数字)

    SF:  Sign Flag 运算结果为负数时被置位。

    DF:  Direction Flag 用于字符串操作指令,控制指令使用递增或递减遍历内存,0增加,1减少。

    CF:  Carry Flag 运算结果产生进位时(最高位)被置位。

    TF:  Trace Flag 用于设置单步执行,当置一时执行下一条指令后立马触发单步异常。

    IF:  Interrupt Flag 表示当前是否可以响应可屏蔽中断,置零时屏蔽中断。(应用层无法设置它)

    可设置这些寄存器值包括但不限于基本的运算指令、字符串操作指令、popfq(从栈中直接弹出到flags寄存器)、sti/std/stc/cli/cld/clc直接操作标识指令,等。

    此外有些指令只设置flags位不保存计算结果。常用在if,while等包含分支的语句中:

    cmp:  与sub指令运算一致,但它不保存运算结果,只设置rflags/eflags寄存器。

    test:  与and指令运算一致,但它不保存运算结果,只设置rflags/eflags寄存器。

    条件跳转指令:

    条件跳转指令依照RFlags/EFlags中的标识位进行有选择性的跳转。当条件不满足时条件跳转指令与nop指令一致,不做任何事。

    对于不同的flags位可使用的跳转指令有:

    JNE  ;不等于则跳转

    JZ   ;为 0 则跳转

    JNZ  ;不为 0 则跳转

    JS   ;不为负则跳转

    JNS  ;为负则跳转

    JC   ;进位则跳转

    JNC  ;不进位则跳转

    JO   ;溢出则跳转

    JNO  ;不溢出则跳转

    JA   ;无符号大于则跳转

    JNA  ;无符号不大于则跳转

    JAE  ;无符号大于等于则跳转

    JNAE ;无符号不大于等于则跳转

    JG   ;有符号大于则跳转

    JNG  ;有符号不大于则跳转

    JGE  ;有符号大于等于则跳转

    JNGE ;有符号不大于等于则跳转

    JB   ;无符号小于则跳转

    JNB  ;无符号不小于则跳转

    JBE  ;无符号小于等于则跳转

    JNBE ;无符号不小于等于则跳转

    JL   ;有符号小于则跳转

    JNL  ;有符号不小于则跳转

    JLE  ;有符号小于等于则跳转

    JNLE ;有符号不小于等于则跳转

    JP   ;奇偶位置位则跳转

    JNP  ;奇偶位清除则跳转

    JPE  ;奇偶位相等则跳转

    JPO  ;奇偶位不等则跳转

    这是一个简单的if .. else .. :

    ebp-8是一个当前函数栈空间的地址,标识着一个局部变量,ebp-14h也是。

    可以看到这里使用cmp指令来判断两个数值减法后的结果标识,并设置RFlags。以及紧跟其后的jne指令,jne是不等于则跳转。

    可以解析为 1-0 != 0时跳转,跳转的位置正是c语言中else的第一行代码,而不跳转则直接进入if内部。在if内部也有个jmp无条件跳转指令,是为了执行完if内的代码后跳过else的代码。

    展开全文
  • 寄存器(32位): 通用寄存器(8个):EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 其中 ECX 为计数寄存器 其中 ESP 为栈顶指针寄存器 其中 EBP 栈底指针寄存器 ...堆栈:是程序所申请使用的内存空间,指令...

    寄存器(32位):
        通用寄存器(8个):EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
        其中 ECX 为计数寄存器
        其中 ESP 为栈顶指针寄存器
        其中 EBP 栈底指针寄存器
        其中 ESI、EDI用于movs  (把A复制到B)
            ESI 存放所复制数据的堆栈地址 A的地址  
            EDI 存放所复制数据的目的堆栈地址 B的地址
        CPU下一次执行地址寄存器 EIP


        
    堆栈:是程序所申请使用的内存空间,指令中要使用堆栈中的数据需要用特定的格式调用
    汇编指令:
        mov 复制数据(把立即数存到通用寄存器或堆栈、通用寄存器中的值存到其他通用寄存器中、通用寄存器中的值存到堆栈中、把堆栈中的值存到通用寄存器中)
        movs  把堆栈中某一地址的数据复制其他的堆栈地址中(执行以后 ESI、EDI中的地址会加所复制的字节数(如复制两个字节就加2))
        stos 把AL/AX/EAX的值存到EDI指定的内存(堆栈)单元中,EDI中的地址值会加或减相应的字节数(如movs)
        REP + 指令 重复执行某条指令,按照计数寄存器ECX中指定的次数重复执行字符串指令,每执行一次ECX中的值就减一

        PUSH 向堆栈中压入数据,并修改栈顶指针ESP寄存器
        POP +寄存器 把栈顶指针的数据拿出放到某个寄存器,然后栈顶指针减4(32位)(16位的减2)
        jmp + 立即数/通用寄存器/堆栈地址  修改EIP寄存器的值
        call 格式同上  修改EIP中的值,并将call指令下一行的地址压入堆栈中
        RETU 将栈顶中的数据放到EIP寄存器中,并将栈顶指针寄存器加4(32位)
        
     
        ADD  加指令
        SUB  减指令
        位运算(计算机只会进行位运算,四则运算都是位运算组合而成):
        and  与指令(二进制对应的位数的值都为1时 才为1)

                物理实现:

                 
        or   或指令(二进制对应的位数的值有一个为1时,就是1)

                物理实现:

                 

        xor  异或运算 (二进制中对应位数的值不一样时,结果为1)

                物理实现:

                 

        not  非运算  (0就是1,1就是0)
        shl  左移 C语言中(<<)各二进制全部左移若干位,高位丢弃,低位补0
        shr  右移 C语言中(>>) 各二进制全部右移若干位,低位丢弃,高位补0
        sar  右移 C语言中(>>) 各二进制全部右移若干位,低位丢弃,高位补符号位

     

    标志寄存器(运算影响此寄存器):

    CF位 如果算数操作产生的结果在最高位发生进位或借位,则将置1,反之清零。通常用来指示无符号整数运算的溢出状态
    OF位 用于反映有符号数加减运算所得结果是否溢出
    PF位 奇偶校验位 最低有效字节(数的最后一个字节)包含偶数个1 则该位置1,否则清零。通常用于奇偶校验
    AF位 如果算数操作在结果的第三位发生进位或者借位则将该标志置1,否则清零。 通常在BCD算数运算中被使用
    ZF位 结果为零将置1 反之清零 ,经常与CMP TEST等指令一起使用
    SF位 该标志被设置成有符号整型的最高有效位,通常用于判断结果是正还是负
    DF位 方向标示位 控制字符串指令(影响MOVS,CMPS,SCAS,LODS,STOS)设置DF标志为1使串指令自动递减(高地址向低地址处理字符串)清除该标志使串指令自动递增
         使用STD、CLD指令分别用于设置为1以及清除DF位为0

    展开全文
  • 相关题目与解析将CX寄存器低四位清零其它位不变的正确指令是()A.ANDCX,OFOHB....A.ANDAL,0FHB.ANDAL,F0HC.ORAL,0FHD将R1寄存器中的指定位bit0和bit3清零,以下ARM汇编指令正确的是()。A.ANDR1,R1,0xFFFFFFF6B.BIC...
  • 引脚及其功能二、SPI指令寄存器地址1.SPI指令2.寄存器地址3.定义数据发送和接收宽度三、基本的用户自定义函数四、硬件部分1.原理图2.模块引脚定义总结 前言 NRF24L01是一款工作在2.4~2.5Ghz世界通用ISM频段的单元...
  • 汇编指令寄存器

    千次阅读 2019-06-03 11:37:52
    寄存器名字 各种类型的寄存器 1.通用寄存器——AX BX CX DX 传送指令:move 算术运算指令:add,sub 2.CS,IP——代码段 最简单的转移指令——jmp 3.DS——数据段 4.SS,SP——栈空间(高地址往低地址增长)...
  • [小知识]总结CSRs寄存器的读写指令

    千次阅读 2019-07-11 11:26:39
    在之前的文章中介绍scr1时,对CPU IPIC register操作指令是有限制的,只能用csrrw/csrrwi。那这堆指令到底什么区别呢 https://blog.csdn.net/kuankuan02/article/details/91489378 针对CSRs操作指令,我们来重新...
  • ARM寄存器与汇编指令详解

    万次阅读 2016-01-06 14:51:13
    介绍ARM寄存器之前,先来介绍一下ARM处理的模式: 用户模式(User):ARM处理器正常的程序执行状态 快速中断模式(FIQ):用于高速数据传输或通道处理 外部中断模式(IRQ):用于通用的中断处理 管理模式(Svc):操作系统...
  • PowerPC寄存器指令

    千次阅读 2018-07-02 14:18:16
    处理器有一个称为程序计数器的寄存器,容纳要执行的下一条指令的地址。获取-执行的工作方式如下:l 读程序计数器,从其中列出的地址处读取指令。一条指令4字节长。l 更新程序计数器,使之指向下一条指令。l 解码...
  • 8086汇编寄存器指令汇总

    万次阅读 多人点赞 2018-04-30 23:28:34
    1 寄存器的分类 通用寄存器: ...指令寄存器: ip 标志寄存器: FR 段寄存器: cs,ds,ss,es 2 ax,bx,cx,dx 这四个寄存器存放一般数据,你可以在里面存放任何数据,但是其用途会有不同。 AX
  • RISC-V特权级寄存器指令文档

    千次阅读 2021-05-05 11:19:19
    RISC-V特权级寄存器指令文档 M态寄存器 1. ISA寄存器 misa(read-write) base域: 1.编码了内部支持的ISA宽度. 2.当重置时,总是设置为支持的最宽ISA extensions域: 功能: 1.编码了现有的标准扩展。依照每个...
  • 80x86 16bit架构中用了14个寄存器: ┏ 指令指针寄存器 AX BX CX DX SI DI SP BP IP CS SS DS ES PSW/FLAG ┗━━━━━━━━━━━━━━━━━━━┛ ┗━━━━━┛ ┗━━━━━━━┛ ┗━...
  • sub al,al mov al,1 sub al,al 这条汇编指令会将ZF和PF置1 而mov指令不改变标识寄存器,那标识寄存器是保留第一条汇编指令执行时的值呢还是会自动清0
  • 文章目录算术运算(ADD/SUB)影响标志位ADD指令SUB指令NEG指令INC/DEC指令影响标志位INC指令DEC指令布尔指令影响标志位AND指令OR指令NOT指令XOR指令TEST指令移位指令影响标志位逻辑移位(SHL/SHR)算术移位(SAL/SAR...
  • 【操作系统】CPU寄存器详解

    千次阅读 2022-04-14 17:44:34
    指令寄存器 四 段寄存器 五 控制寄存器 六 调试寄存器 七 描述符寄存器 八 任务寄存器 九 MSR寄存器 一 通用寄存器 最常用的,也是最基础的有8个通用寄存器(注意一般看到的EAX、ECX也是指的这类寄存器...
  • 一、汇编程序的基本格式:1、基本格式与解析:assume cs:codeseg //assume假设CS寄存器与codeseg段有关联,codeseg段本就是代码段codeseg segment //段开始,codeseg为段名,可随意命名只要不和伪指令指令等冲突...
  • TLB、程序计数器PC和指令指针寄存器IP TLB TLB( Translation Look- aside buffer)专门用于缓存内存中的页表项,一般在MMU单元内部,页表一般存储在屋里内存中。当处理器要访问一个虚拟地址时,首先会在TLB中查询。...
  • 寄存器,寄存器是什么意思

    千次阅读 2021-07-28 06:43:33
    寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。...
  • 寄存器W被清零说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。2.看门狗定时器清零指令。实例:CLRWDT;看门狗定时器清零(若已赋值,同时预...
  • mips指令寄存器详解

    万次阅读 多人点赞 2015-03-28 21:21:36
    MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下: 下表描述32个通用寄存器的别名和用途 REGISTER NAME USAGE $0 $zero 常量0...
  • 标志寄存器操作

    2021-06-02 16:10:58
    文章目录0x01 常见操作指令0x02 标志寄存器一、ZF标志二、PF标志三、SF标志四、CF标志五、OF标志六、DF标志位和串传送指令 0x01 常见操作指令 ​ 在 CISC 中对于标志寄存器存在一些指令对标志寄存器操作,常见的有...
  • ARM基础学习-寄存器寻址方式和指令

    千次阅读 2017-04-30 17:13:02
    寻址方式数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。arm指令
  • 最近在做kernel从ARM到一款PPC处理器的移植,需要学下下PPC的通用寄存器,找到的文档整理如下: Register Classification Notes r0 local commonly used to hold the old link register ...
  • MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。 MSR指令: 对状态寄存器CPSR和SPSR进行写...
  • MIPS 通用寄存器 + 指令

    万次阅读 多人点赞 2013-01-07 13:55:15
    MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下: 下表描述32个通用寄存器的别名和用途 REGISTER NAME USAGE $0 $zero 常量0(constant value 0...
  • 一.常用的寄存器 r0 -r3 临时变量 用于...pc:记录cpu运行指令的地址 因为arm采用流水线方式 取值 译码 执行等 pc=pc+8, 即pc指向当前执行的指令的下两条。 cpsr :状态寄存器,每种工作模式有自己的cpsr,记录当前

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,544
精华内容 27,817
关键字:

寄存器清0指令