【问题标题】:What are the memory-related ISA features?与内存相关的 ISA 功能有哪些?
【发布时间】:2020-10-04 10:12:40
【问题描述】:

我正在准备计算机架构考试,但我似乎无法回答这个问题:

以下代码可用于检查与内存相关的 ISA 功能。使用这个函数你能确定什么?

#define X 0
#define Y 1

int mystery_test(){
        int i = 1;
        char *p = (char *) &i;
        if(p[0] == 1) return X;
        else return Y;
}

我在想它会检查指针和数组是否基本相同,但这不是与内存相关的功能,所以我很确定我的答案是错误的。

有人可以帮忙吗?另外,内存相关的 ISA 特性有哪些?

谢谢!

【问题讨论】:

  • 这段代码检查 CPU 是 little-endian 还是 big-endian
  • 他们希望你告诉他们字节序。但是由于其中的错误,该函数还告诉了其他内容。如果它终止了进程,你可以告诉你你在一台有对齐限制的机器上。不幸的是,如果它没有终止进程,它不会告诉你任何关于对齐限制的信息。

标签: c memory instruction-set


【解决方案1】:

Retired Ninja 的答案比你想知道的要多得多,但更简短的版本是神秘代码正在测试 CPU 的字节序。

我们都知道现代 CPU 中的内存是面向字节的,但是当它存储一个较大的项目(例如,一个 4 字节的整数)时,它按什么顺序排列组件?

想象一下整数值 0x11223344,它是四个单独的字节 (0x11 .. 0x44)。它们不能全部放在一个字节的内存地址中,因此 CPU 必须将它们按某种顺序排列。

Little-endian 表示低位部分——0x44——位于最低内存地址,而 big-endian 将最高有效字节放在首位;这里我们假设它存储在内存位置 0x9000(随机选择):

        Little   Big -endian
0x9000: x44     x11
0x9001: x33     x22
0x9002: x22     x33
0x9003: x11     x44

它必须选择一些东西,对吧?

您正在考虑的代码是将整数 1 值存储到 4(或 8)字节的内存块中,因此它将位于以下两个组织之一中:

        Little  Big
0x9000: x01     x00   
0x9001: x00     x00
0x9002: x00     x00
0x9003: x00     x01

但是通过将 integer 指针转换为 char 指针,它只查看低字节,0/1 值告诉你这是否是大端或小端。

对于 little-endian,返回 X/0,对于 big-endian,返回 Y/1。

祝你考试顺利。

【讨论】:

  • Re "大端的返回是 Y/1", Not necessarily. 你只知道它不是小端,而不是大端。
  • @ikegami - 公平点,尤其是对于建筑类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多