精华内容
下载资源
问答
  • 寄存器数值转换

    2021-02-07 14:23:34
    寄存器的位值被重新定义后,怎么计算寄存器的值? 1、单片机的有些数据通常需要保存在寄存器中,它们是以0或1的方式存在的。 上图是一个24位的寄存器,MSB最高位是bit23,LSB最低位是bit0。 当bit23:0=0xFFFFFF...

    寄存器的位值被重新定义后,怎么计算寄存器的值?

    1、单片机的有些数据通常需要保存在寄存器中,它们是以0或1的方式存在的。

    上图是一个24位的寄存器,MSB最高位是bit23,LSB最低位是bit0。

    当bit23:0=0xFFFFFF时,它对应的十进制数值为:

    2、有时为了表示某种数据,有的资料会对寄存器的位值进行重新定义。见下图:

    上图中,0.0 ≤寄存器的值域< 1.0

    当bit23:0=0xFFFFFF时,它对应的十进制数值为:

    //返回数值: 0.0<= 浮点数值 < 1.0

    //dat=0x800000,则返回2^(-1)

    //dat=0x400000,则返回2^(-2)

    //dat=0x200000,则返回2^(-3)

    //dat=0x100000,则返回2^(-4)

    //dat=0x080000,则返回2^(-5)

    //dat=0x040000,则返回2^(-6)

    //dat=0x020000,则返回2^(-7)

    //dat=0x010000,则返回2^(-8)

    //dat=0x008000,则返回2^(-9)

    //dat=0x004000,则返回2^(-10)

    //dat=0x002000,则返回2^(-11)

    //dat=0x001000,则返回2^(-12)

    //dat=0x000800,则返回2^(-13)

    //dat=0x000400,则返回2^(-14)

    //dat=0x000200,则返回2^(-15)

    //dat=0x000100,则返回2^(-16)

    //dat=0x000080,则返回2^(-17)

    //dat=0x000040,则返回2^(-18)

    //dat=0x000020,则返回2^(-19)

    //dat=0x000010,则返回2^(-20)

    //dat=0x000008,则返回2^(-21)

    //dat=0x000004,则返回2^(-22)

    //dat=0x000002,则返回2^(-23)

    //dat=0x000001,则返回2^(-24)

    //dat=0x000000,则返回0

    //函数功能:它和(float)dat/0x1000000是等价的

    float value_commutation(u32 dat)

    {

        float f,tmpFloatData;

        u8 i;

        u32 dat_temp;

     

        dat_temp=dat;

        dat_temp = (u32)(dat_temp&0x00FFFFFF);//只有最低24位参与计算

     

        f=0.5;//2^(-1)=0.5

        tmpFloatData=0.0;

        for(i = 0;i<24;i++)

        {

           if(dat_temp&0x800000) tmpFloatData=tmpFloatData+f;

           dat_temp =(u32)( dat_temp << 1 );

           f = f/2.0;

        }

        return tmpFloatData;

    }

     

    3、负数是以补码保存的,下面的寄存器被定义如下:

    MSB最高位为符号位

    当MSB=1时,该寄存器表示的是一个负数,负数是以补码保存的;负数的补码减1,就得到反码,再将反码除了最高位MSB外,其余各位取反,就得到负数的原码。

    当MSB=0时,该寄存器表示的是一个正数;

    -1.0 ≤ 寄存器的值 < 1.0

     

    1) 当bit23:0=0xFFFFFF时,它对应的十进制数值是一个负数,因此

    反码为:0xFFFFFF-1=0xFFFFFE

    原码为:(~0xFFFFFE)|0x800000=0x000001|0x800000=0x800001

    2) 当bit23:0=0x800000时,它对应的十进制数值是一个负数,因此

    反码为:0x800000-1=0x7FFFFF

    原码为:(~0x7FFFFF) |0x800000=0x800000|0x800000 =-0x800000=-1

    负数补码的最高位为1,其余各位为0,表示该负数最小,因此这里为-1;

     

    3) 当bit23:0=0x800001时,它对应的十进制数值是一个负数,因此

    反码为:0x800001-1=0x800000

    原码为:(~0x800000)|0x800000=0x7FFFFF|0x800000 =-0x7FFFFF

    //返回数值: -1.0<= 浮点数值 < 1.0

    //dat=0x800000,则返回-2^(0)

    //dat=0x400000,则返回2^(-1)

    //dat=0x200000,则返回2^(-2)

    //dat=0x100000,则返回2^(-3)

    //dat=0x080000,则返回2^(-4)

    //dat=0x040000,则返回2^(-5)

    //dat=0x020000,则返回2^(-6)

    //dat=0x010000,则返回2^(-7)

    //dat=0x008000,则返回2^(-8)

    //dat=0x004000,则返回2^(-9)

    //dat=0x002000,则返回2^(-10)

    //dat=0x001000,则返回2^(-11)

    //dat=0x000800,则返回2^(-12)

    //dat=0x000400,则返回2^(-13)

    //dat=0x000200,则返回2^(-14)

    //dat=0x000100,则返回2^(-15)

    //dat=0x000080,则返回2^(-16)

    //dat=0x000040,则返回2^(-17)

    //dat=0x000020,则返回2^(-18)

    //dat=0x000010,则返回2^(-19)

    //dat=0x000008,则返回2^(-20)

    //dat=0x000004,则返回2^(-21)

    //dat=0x000002,则返回2^(-22)

    //dat=0x000001,则返回2^(-23)

    //dat=0x000000,则返回0

    //函数功能:它和(float)dat/0x800000在功能上是等价的

    float value_commutation1(u32 dat)

    {

        float f,tmpFloatData;

        s8 flag;

        u32 dat_temp;

        u8 i;

     

        dat_temp=dat;

        dat_temp = (u32)(dat_temp&0X00FFFFFF);//只有最低24位参与计算

    //计算负数原码开始

        flag = 1;//假定为正数

        f=0.5;

        if(dat&0x800000)//最高位为符号位

        {

           flag = -1;//设置为负数

           dat_temp = dat_temp -1;//负数的补码减一得到反码

           dat_temp = (u32)(~dat_temp); //除最高位外,其余位取反得到原码

           dat_temp = (u32)(dat_temp&0X7FFFFF);

        }

        if(dat==0x800000) tmpFloatData=1.0;

        else tmpFloatData=0.0;

    //计算负数原码结束

        for(i = 0;i<23;i++)

        {

           dat_temp =(u32)( dat_temp << 1 );

           if(dat_temp&0x800000) tmpFloatData=tmpFloatData+f;

           f = f/2.0;

        }

     

        tmpFloatData = tmpFloatData*flag;//添加正负号

        return tmpFloatData;

    }

     

    展开全文
  • 使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题 比如定时器更新中断,在中断服务程序打下断点后,程序没有执行。但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需要一点时间,并...

    使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题

    比如定时器更新中断,在中断服务程序打下断点后,程序没有执行。但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需要一点时间,并不是刚进入中断服务的计数0,所以最后寄存器窗口获取的数值并不是中断服务函数执行时的数值。

    展开全文
  • Hook_获取寄存器数值

    千次阅读 2016-10-23 11:40:06
    很多分析程序的时候,我们会发现如果能读出目标程序运行到指定地址之后的寄存器数据的话,我们的工作会轻松很多。可是怎么能够读取出来呢? 要知道,寄存器的值是随着程序的运行而在不断做着改变的。 如果想要像...

    很多分析程序的时候,我们会发现如果能读出目标程序运行到指定地址之后的寄存器数据的话,我们的工作会轻松很多。可是怎么能够读取出来呢?

    要知道,寄存器的值是随着程序的运行而在不断做着改变的。

    如果想要像使用调试工具一样读出寄存器的值的话,其实有2种方法。

    第一种就是做个简易的程序调试器,在指定地址上下断点,让程序获取debug异常,读取寄存器数据。

    第二种就是在程序运行到指定行数的时候加上我们自己的代码,读出我们想要的东西。

    这种技术叫什么呢?

    我也不是很清楚,反正是hook的一种吧。

    关于这种hook的技术,用处挺大的,有了这个,可以说是 哈哈,只可意会。

    下篇就讲讲怎么hook获取好了。

    这篇就先到这里啦

    展开全文
  • 目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。请问怎么可以实现一直接通,并且循环读取寄存器的值呢—— 听说要用timer...但是不太理解如何设置timer. 是应该在...
  • 另外在ida动态调试过程中,除了内存中的数据可以修改,寄存器的数据也是可以动态修改的。比如说程序执行到CMP R6, #0。本来R6的值是0,经过比较后,程序会跳转到4082A3FC这个地址。 但是如果我们在PC执行...

    我们继续分析自毁程序密码这个app,我们发现该程序会用fopen ()打开/proc/[pid]/status这个文件,随后会用fgets()和strstr()来获取,于是我们在strstr()处下个断点,然后让hex view的数据与R0同步。每次点击继续,我们都会看到strstr传入的参数。当传入的参数变为TracerPid:XXXX的时候我们停一下。因为在正常情况下,TracerPid的值应该是0。但是当被调试的时候就会变成调试器的pid。

    enter image description here

    enter image description here

    为了防止程序发现我们在调试,在这里我们需要把值改回0。我们在hex view的2那里点击右键,然后选择edit。随后我们输入30和00,再点击”apply changes”。就可以把TracerPid改为0了。然后就可以bypass这一次的反调试的检测。

    enter image description here

    但这个程序检测TracerPid的次数非常频繁,我们要不断的修改TracerPid的值才行,这种方法实在有点治标不治本,所以我们会在下一节介绍patch so文件的方法来解决这个问题。

    另外在ida动态调试过程中,除了内存中的数据可以修改,寄存器的数据也是可以动态修改的。比如说程序执行到CMP R6, #0。本来R6的值是0,经过比较后,程序会跳转到4082A3FC这个地址。

    enter image description here

    但是如果我们在PC执行到4082A1F8这条语句的时候,将R6的值动态修改为0。程序就不会进行跳转了。

    enter image description here

    enter image description here

    你甚至可以修改PC寄存器的值来控制程序跳转到任何想要跳转到的位置,简直和ROP的原理一样。但记得要注意栈平衡等问题。

    enter image description here

    展开全文
  • 汇编:寄存器数值清零操作

    千次阅读 2019-02-22 16:03:33
    一、用bic清零 全部清零 ldr r0,=0x11111111 bic r0,#0xffffffff 第五位清零 ldr r0,=0x11111111 bic r0,#0x00f00000
  • ;将BX寄存器中的数值以16位二进制的形式输出到屏幕 BIN_Print
  • 寄存器

    2021-01-07 19:19:15
    不同类型的CPU内部的寄存器的种类,数量以及寄存器存储的数值范围都是不同的。根据功能的不同,可以讲寄存器分为以下几类。 种类 功能 累加寄存器 存储运行的数据和运算后的数据。 标志寄存器 用于反应...
  • ARM指令集详解 分类:LINUX 2011-02-07 22:51:34 ...ARM 可以用两套指令集:ARM指令集和Thumb指令集。...内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为 指令执行条件,是可选的,如果不写则...
  • 对 CC2420 寄存器进行初始化,设置CC2420 寄存器数值,并读取设置的寄存器的数值。本实验以CC2420 中的MDMCTRL0 为例,进行设置,并读取其设置的数值在串口工具上显 示出来。
  • 1. 一个是print_hex函数,用于实现把bx寄存器的内容以十六进制的形式显示出来 2. 一个是print_string函数,用于实现把bx寄存器所指向的字符串打印出来 直接看最终的代码实现: [org 0x7c00] ;打印字符串 mov bx...
  • 有没有大神能帮忙解决一下,目前是三菱PLC的寄存器D1002,如何通过数值输入将值写入到D1002的寄存器内?
  • 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。...M 24位的尾数保存在23位中,只存储...
  • Mader.SVGA大屏写点汇编程序(超数值寄存器分页法)3.0
  • Mader.SVGA大屏写点汇编程序(超数值寄存器分页法).......................................................................................
  •  r13(sp) //栈指针寄存器(私有寄存器),当模式切换、程序跳转时,可以存储通用寄存器数值到sp指向的内存地址  r14(lr)//链接寄存器() 当程序跳转时,用来记录程序返回地址  r15(pc)//程序计数器 读操作:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,516
精华内容 31,406
关键字:

寄存器数值