如何验证像C ++这样的语言在硬件中实际执行的代码是什么?

时间:2018-12-30 14:44:46

标签: c++ hardware

P.S。我是编程新手。

使用Java脚本以来,我一直想学习C ++,因为它们的语法看起来很相似,并且我对硬件中的实际代码很感兴趣。

但是,我们实际上不能轻松地查看硬件活动,对吗?

我只能接受编译器的说法,即我的数组仅被正确分配了5个索引,但是我看不到它在ram上的视觉效果或其他易于理解的效果吗?

如何验证类似的东西至少好一点?

使用JavaScript并没有真正打扰我,因为我主要是在写更多我想发生的事情(或者至少是抽象的),所以我如何对C ++声明更有信心它实际上使我能够控制这些小事情?

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找的是调试器。许多IDE提供一种,而Visual Studios随附的一种可以查看内存,寄存器和CPU活动。如果要手动执行此操作,则始终可以依赖于内联汇编,也可以通过比较在堆栈或堆上分配的对象的地址来实现。

答案 1 :(得分:0)

  

但是,我们实际上不能轻松地查看硬件活动,对吗?

调试器值得学习,简单的程序也易于调试。请记住,在大多数台式机上,您的调试代码都在虚拟内存中运行……这意味着这些地址可能不是硬件地址,而是虚拟的,并且可能会映射到任何物理内存。


  

我只能相信编译器会说我的数组已经正确放置了   仅分配了5个索引,但在我的ram或   还有其他容易的事吗?

我不确定您认为“正确”是什么意思。只要它按照您的指示行事,怎么会不合适?我的意思是没有冒犯,但是您或我如何识别某些不当行为?对准?填充?以我的经验,在调试器显示中可以看到由编译器“插入”的填充(以任何结构)。

您使用调试器“检查”的所有内存均来自虚拟内存。显示的地址是您的代码正在使用的虚拟RAM地址。


  

使用JavaScript并没有真正打扰我,因为   我主要是在写更多不可数的东西(或者至少是   更抽象)我想发生的事情,那么我会感觉如何   对C ++充满信心,声称它实际上使我可以控制   这些小东西?

练习。

我在嵌入式系统(主要是vxWorks)上具有C ++的多年经验。嵌入式系统通常确实具有虚拟内存。内存映射的I / O通常是通过特殊的硬件访问的,操作系统被“告知”了它们的特殊性质,并且硬件的定时通常与“常规”的虚拟内存不同。


  

如何验证类似的东西至少好一点?

东西像什么?我不确定您认为可以在Java中看到什么。

您认为在C ++中看不到什么“东西”?


调试器值得学习,简单的程序易于调试。

并且总是允许您“抛出”某些诊断提示。在此示例中,我实现了重载的show函数。 (仅用于开发或诊断……可能您不希望在启用show()的情况下发布代码)

示例:

 DTB::SOps_t sops; // string operations 
                   //  digiComma() inserts comma's for readability

 void show(uint64_t ui64)
 {
    cout << "\n  " << setw(24) << sops.digiComma(ui64) << flush;
 } 

 void show (uint64_t sum1, uint64_t sum2, uint64_t digit, uint64_t digit2)
 {
    cout << "  "
         << setw(8) << sops.digiComma(sum1)
         << setw(8) << sops.digiComma(sum2)
         << setw(8) << sops.digiComma(digit)
         << setw(8) << sops.digiComma(digit2)
         << flush;
 }

show()示例中的用法示例:

 int exec()
 {
    cout << "\n  Note that llui and uint64_t "
         << "\n  are the same size (on my Linux/g++ system) - 8 bytes"
         << "\n    sizeof(  llui ): " << sizeof(llui)
         << "\n    sizeof(uin64_t): " << sizeof(uint64_t) << endl;

    uint64_t checksum = 4024007185756128;  
    show(checksum);

    uint64_t   sum1 = 0;
    uint64_t digit1 = checksum % 10ULL;
    uint64_t   sum2 = 0;

    while (checksum > 0)
    {
       sum2 = sum2 + digit1;

       uint64_t digit2 = ((checksum - digit1) / 10ULL) % 10ULL;
       show(sum1, sum2, digit1, digit2);

       checksum = (checksum - digit1 - (digit2 * 10ULL)) / 100ULL;

       digit1 = checksum % 10ULL;
       digit2 =   digit2 * 2ULL;
       sum1   =     sum1 + digit2;

       show(checksum); 

       if (checksum < 10) { checksum = 0; }
    }

    if ((sum1 + sum2) % 10ULL == 0ULL)  cout << "\n  INVALID 1"; 
    else                                cout << "\n  INVALID 2"; 
    return 0;
 }

此输出可能被称为执行代码的“跟踪”结果,大约15行。


如果上述内容有所帮助,您接下来可以尝试在此代码上运行调试器。只需在show例程中添加一个断点即可。然后运行,检查结果,继续下一个断点,检查结果,然后重复。