标签: low-level

3D数组如何存储在C中?

我知道C中的数组是按行主顺序分配的.因此,对于2 x 3阵列:

0  1
2  3
4  5
Run Code Online (Sandbox Code Playgroud)

存储在内存中

0 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个2 x 3 x 2阵列怎么办:

0  1
2  3
4  5
Run Code Online (Sandbox Code Playgroud)

6  7
8  9
10 11
Run Code Online (Sandbox Code Playgroud)

这些如何存储在内存中?只是连续像:

0 1 2 3 4 5 6 7 8 9 10 11
Run Code Online (Sandbox Code Playgroud)

或者是其他方式?还是取决于什么?

c arrays low-level

38
推荐指数
5
解决办法
8万
查看次数

如何在Raspberry Pi上运行没有操作系统的C程序?

我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序.唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际.

我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的形式)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码.

有没有办法用Raspberry Pi实现这一目标?这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等).

c embedded arm low-level raspberry-pi

36
推荐指数
2
解决办法
3万
查看次数

下一代低级语言是迁移代码库的最佳选择?

假设您有一家运行大量C/C++的公司,并且您希望开始计划迁移到新技术,这样您就不会像15年前的COBOL公司那样结束.

目前,C/C++运行得非常好,市场上有很多开发者.

但是你现在想开始考虑它,因为考虑到巨大的运行代码库和数据敏感性,你觉得可能需要5到10年才能进入下一步而不会超出预算和开发团队的负担.

你听说过D,开始变得非常成熟,Go,承诺会很受欢迎.

你会选择什么?为什么?

c++ d go low-level

30
推荐指数
9
解决办法
6257
查看次数

汇编 - .data,.code和寄存器......?

所以今天早上我发布了一个关于汇编的混乱问题,我收到了一些非常真实的帮助,我非常感谢.

现在我开始进入组装,并开始了解它是如何工作的.

我觉得我理解的事情包括堆栈,中断,二进制/十六进制,以及一般大多数基本操作(jmp,push,mov等).

我正在努力理解并希望得到帮助的概念如下:如果您能解决以下任何问题,那将是一个巨大的帮助:

  1. .data部分究竟发生了什么?那些变量我们是在申报吗?
  2. 如果是这样,我们可以稍后在代码部分声明变量吗?如果没有,为什么不呢?如果是这样,那么我们如何以及为什么使用数据部分呢?
  3. 什么是注册?它与变量相比如何?我的意思是我知道这是一个存储一小部分信息的位置......但这对我来说听起来就像一个变量.
  4. 我如何制作阵列?我知道这似乎是随机的,但我很好奇我将如何做这样的事情.
  5. 是否列出了每个寄存器应该用于什么的常见做法?我仍然没有完全理解它们,但是已经注意到有些人说,例如,应该使用某个寄存器来存储程序中的"返回值" - 这些实践是否有全面或至少提供信息的列表?
  6. 我正在学习汇编的原因之一是更好地了解我的高级代码背后发生了什么.考虑到这一点 - 当我用c ++编程时,我经常考虑堆栈和堆.在汇编中我知道堆栈是什么 - 在哪里'堆'?

一些信息:我使用masm32和WinAsm作为IDE,我正在使用Windows 7.我有很多以前使用c ++/java等高级语言编程的经验.


编辑:感谢大家的帮助,照常提供非常丰富的信息!好东西!最后一件事 - 我想知道堆栈指针和Base指针,ESP和EBP之间有什么区别.有人可以帮我吗?

编辑:我想我现在得到它...... ESP总是指向堆栈的顶部.但是,您可以根据需要指定EBP.ESP会自动处理,但您可以使用EBP做任何您想做的事情.例如:

push 6
push 5
push 4
mov EBP, ESP
push 3
push 2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,EBP现在指向持有4的地址,但ESP现在指向持有2的地址.

在实际应用中,6,5和4可以是函数参数,而3和2可以是该函数内的局部变量.

assembly low-level masm32

28
推荐指数
2
解决办法
4万
查看次数

CPU仿真并锁定到特定的时钟速度

如果你已经阅读了我的另一个问题,你就会知道我本周末花了6502 CPU模拟器作为编程练习.

CPU模拟器大部分是完整的,并且从我的有限测试看起来相当准确,但它运行速度非常快,我想把它降低到机器的实际时钟速度.

我目前的测试循环是这样的:

    // Just loop infinitely.
    while (1 == 1)
    {                
        CPU.ClockCyclesBeforeNext--;

        if (CPU.ClockCyclesBeforeNext <= 0)
        {
            // Find out how many clock cycles this instruction will take
            CPU.ClockCyclesBeforeNext = CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].CpuCycles;

            // Run the instruction
            CPU.ExecuteInstruction(CPU.Memory[CPU.PC]);

            // Debugging Info
            CPU.DumpDebug();
            Console.WriteLine(CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength);

            // Move to next instruction
            CPU.PC += 1 + CPU.OpcodeMapper.Map[CPU.Memory[CPU.PC]].ArgumentLength;                                        
        }
    }
Run Code Online (Sandbox Code Playgroud)

如您所知,每个操作码需要一段特定的时间才能完成,所以在我倒计时CPU周期时,我不会运行下一条指令.这提供了操作码之间的适当时序,它只是整个事情快速运行.

目标CPU的速度是1.79mhz,但是我想要时钟问题的任何解决方案,即使我增加了复杂性,也要保持1.79mhz的速度,所以我不需要调整它.

有任何想法吗?

6502 emulation clockrates low-level

27
推荐指数
4
解决办法
1万
查看次数

CheatEngine的速度如何破解?

Cheat Engine附带一个名为speed hack的功能,它可以减慢或提高游戏速度.实际上,不仅是游戏,如果有一个带时钟滴答的软件,它也可以加快速度.这是如何运作的?我可以想象有一些内部时钟可以运行这些东西,但不确定这些事情是如何在低级别上发生的.

虽然这个功能已经在我尝试的大多数游戏中都有效,但它在许多游戏上都失败了,例如,NFS最想要的.为什么?有没有不同的机制来运行这些游戏,或者只是一些反作弊?

low-level anti-cheat

26
推荐指数
3
解决办法
4万
查看次数

不使用+运算符添加两个数字的最佳方法是什么?

我和一个朋友来回与脑筋急转弯,我不知道如何解决这个问题.我的假设是,有些按位运算符是可能的,但不确定.

addition low-level

25
推荐指数
5
解决办法
3万
查看次数

有没有办法为C或C++结构强制执行特定的字节序?

我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据.

但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么.是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的很多宏的整个事情?

一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意.

编辑:

感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的.

特定处理器生成大量数据(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理)读取.对数据进行字节评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层.

改变嵌入式处理器的软件是不可能的.源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据.

这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要.

它不一定是字节序的真正变化.即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受.

c c++ endianness low-level

25
推荐指数
2
解决办法
1万
查看次数

计算机如何计算平方根?

计算机如何计算平方根?我的意思是那里发生了什么!它是如何处理的!! 它是否使用像牛顿方法那样的数学方法?三角函数怎么样?几乎所有那些数学函数.在每种语言都有自己的方式的情况下,请让我们谈谈c ++.

c++ math process low-level square-root

23
推荐指数
4
解决办法
2万
查看次数

什么是Java中的"内部地址"?

在Javadoc for Object.hashCode()中声明

尽管合理实用,但是由class定义的hashCode方法Object确实为不同的对象返回了不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术.)

这是一个常见的miconception,这与内存地址有关,但它并没有因为它可以在没有通知的情况下改变,而hashCode()不会,也不能改变对象.

@Neet提供了一个很好的答案的链接/sf/answers/39579151/但我正在寻找更多细节.


这是一个例子来说明我的担忧

Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);

for (int t = 0; t < 10; t++) {
    System.gc();
    Object[] objects = new Object[10];
    for (int i = 0; i < objects.length; i++)
        objects[i] = new Object();

    for (int i = 0; i < objects.length; i++) {
        if (i > 0) System.out.print(", ");
        int location = unsafe.getInt(objects, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * i);
        System.out.printf("%08x: hc= …
Run Code Online (Sandbox Code Playgroud)

java memory unsafe hashcode low-level

23
推荐指数
2
解决办法
2355
查看次数