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

    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获取好了。

    这篇就先到这里啦

    展开全文
  • 案例是通过一个智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库;数据库网关软件与手册PLC如何将数据写入SQL数据库存入多个...

            IGT-DSER智能网关模块,支持各种PLC、智能仪表、远程IO与数据库之间双向通讯,既可以读取设备的数据上报到SQL数据库,也可以从数据库查询数据后写入到设备;

            网关安装在设备侧,随设备启动、停止,不会错过任何数据,已批量用于多种行业的智能工厂,大大提高MES等工业互联网项目的实施效率。IGT-DSER带有两种数据缓存功能:
            1. 高频次采集数据缓存,打包后一次性上报到数据库;
            2. 断网、服务器维护上报异常时,将数据缓存,待故障解除后重新上报到数据库

            本案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库;数据库网关软件与手册 PLC如何将数据写入SQL数据库存入多个数据表


            首先建立数据库Database,然后建立数据表Report1,表结构如下图:

            然后在数据表中填入数据,实现PLC根据barcode字符串查询para1和para2的值,PLC是S7-1500,数据地址对应如下:

            barcode:DB6.DBB40[String],    para1:DB6.DBW0[Int],    para2: DB6.DBD24[Real];

            然后通过网关的参数配置软件设置参数,如下图:

            将参数下载到网关后重启,网关即进入工作状态,然后准备好数据表中的数据,如下图:

            这样网关根据PLC的数值进行实时判断,当PLC的DB6.DBB40的字符串与数据库的barcode相等时,即将该行数据对应的para1的数据写入DB6.DBW0,将para2的数据写入DB6.DBD24。打开PLC的编程软件监控数据如下:

           关于配置表与SQL语言的对应关系,可看这篇文章。 IGT-DSER智能网关同样支持其他品牌的PLC,参数设置方式相似:

            ◆ FX:  三菱FX系列PLC                                    ◆ QL:  三菱Q/L系列PLC

            ◆ AS:  三菱A系列PLC                                      ◆ OM:  欧姆龙全系列PLC

            ◆ S72S:  西门子S7-200/Smart系列PLC          ◆ S734:  西门子S7-300/400系列PLC

            ◆ S71K:  西门子S7-1200/1500系列PLC          ◆ MBS:  施耐德等Modbus兼容PLC

            ◆ DVP:  台达、信捷PLC                                  ◆ NAIS:  松下全系列PLC

            ◆ KVS:  基恩士全系列PLC                               ◆ FTK:  永宏全系列PLC

            ◆ MSK:  LS/LG全系列PLC                               ◆ KOY:  光洋全系列PLC

            ◆ ABM: AB MicroLogix系列PLC                       ◆ ABC: AB Compact/Control系列PLC

    相关软件与手册:点击下载

    展开全文
  • 案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库; 首先建立数据库Database,然后建立数据表Report1,...
  • 目前我可以通过button 链接到port,并且读取到寄存器数值。但是软件与PLC只链接一会就自动断开了。请问怎么可以实现一直接通,并且循环读取寄存器的值呢—— 听说要用timer...但是不太理解如何设置timer. 是应该在...
  • 案例是通过一个IGT-DSER智能网关,实现PLC与数据库的双向通讯,根据PLC中的数值查询数据库中的数据,然后将结果返回给PLC,采用的是西门子的PLC和SQLServer数据库; 首先建立数据库Database,然后建立数据表Report1,...
  • vb真的很强大,只是坚持到最后的人不多,以上的作品我再2012年的时候就完成了。技术交流QQ 1016058890 技术交流站 www.zai996.com
  • 另外在ida动态调试过程中,除了内存中的数据可以修改,寄存器的数据也是可以动态修改的。比如说程序执行到CMP R6, #0。本来R6的值是0,经过比较后,程序会跳转到4082A3FC这个地址。 但是如果我们在PC执行...
  • 数值寄存器R数值寄存器指令 数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器, 见 7.3 节)。标准情况下提供有 200 个数值寄存器。 R[i] =(值) R[i] =(值)...
  • 数值寄存器R数值寄存器指令数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器,见 7.3 节)。标准情况下提供有 200 个数值寄存器。R[i] =(值)R[i] =(值)指令...
  • 数值寄存器R数值寄存器指令数值寄存器指令是进行寄存器的算术运算的指令。数值寄存器用来存储某一整数值或小数值得变量(有关数值寄存器,见 7.3 节)。标准情况下提供有 200 个数值寄存器。R[i] =(值)R[i] =(值)指令...
  • 汇编:寄存器数值清零操作

    千次阅读 2019-02-22 16:03:33
    一、用bic清零 全部清零 ldr r0,=0x11111111 bic r0,#0xffffffff 第五位清零 ldr r0,=0x11111111 bic r0,#0x00f00000
  • 寄存器

    2021-01-07 19:19:15
    不同类型的CPU内部的寄存器的种类,数量以及寄存器存储的数值范围都是不同的。根据功能的不同,可以讲寄存器分为以下几类。 种类 功能 累加寄存器 存储运行的数据和运算后的数据。 标志寄存器 用于反应...
  • 读不懂时序图,也没有给出时序数值,不清楚怎么赋值! LCD型号LTV350QV_04F04 #define VSPW 9 #define VBPD 1 #define LINEVAL 239 #define VFPD 1 #define CLKVAL 4 #define HSPW 40 #define ...
  • ;将BX寄存器中的数值以16位二进制的形式输出到屏幕 BIN_Print
  • 1. 一个是print_hex函数,用于实现把bx寄存器的内容以十六进制的形式显示出来 2. 一个是print_string函数,用于实现把bx寄存器所指向的字符串打印出来 直接看最终的代码实现: [org 0x7c00] ;打印字符串 mov bx...
  • 有没有大神能帮忙解决一下,目前是三菱PLC的寄存器D1002,如何通过数值输入将值写入到D1002的寄存器内?
  •  r13(sp) //栈指针寄存器(私有寄存器),当模式切换、程序跳转时,可以存储通用寄存器数值到sp指向的内存地址  r14(lr)//链接寄存器() 当程序跳转时,用来记录程序返回地址  r15(pc)//程序计数器 读操作:...
  • 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。...M 24位的尾数保存在23位中,只存储...
  • 寄存器在CPU里,数据寄存器也在CPU里,如果想向段寄存器里写入数值,必须通过数据寄存器,在CPU外部的数据无法直接送给段寄存器。具体硬件原理我也不清楚,貌似是数据总线和数据寄存器相连接,不直接和段寄存器...
  • 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。M 24位的尾数保存在23位中,只存储23位,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,382
精华内容 552
关键字:

寄存器数值