C 到 Y86 组装

C to Y86 Assembly

我试图理解这段代码,以便将其转换为 y86 程序集。 有人可以回答括号里的问题吗

/* This function copy_block - Copy src to dest and return xor checksum of src */
long copy_block(long *src, long *dest, long len) //(first two input arguments will be stored in %RDI and %RSI where will the be third argument stored?)
{
    long result = 0;
    while (len > 0) {
    long val = *src++; //(is this dereferencing first and then adding or opposite?)
    *dest++ = val; //(what is this line doing?)
    result ^= val; //(what is checksum and why are we XORing val with sum of previous XORed values?)
    len--;
    }
    return result;
}

示例输入

.align 8
# Source block
src:
.quad 0x00a
.quad 0x0b0 
.quad 0xc00
# Destination block
dest:
.quad 0x111  #(why are there three sources and just one dest?)
  1. (前两个输入参数将存储在 %RDI 和 %RSI 中,第三个参数将存储在哪里?)

%rdx

  1. //(这个是先解引用后加还是反引用?)

val 被设置为存储在 src 中地址的值。然后src中的地址加1。

  1. //(这条线在做什么?)

val写入dst中存放的地址,然后dst地址加1。

  1. //(什么是校验和,为什么我们要将 val 与之前的异或值之和进行异或运算?)

此校验和是检测块更改的原始方法。例如,如果您随后将数据传输到某个地方,并再次处理校验和,如果块数据已更改,则校验和很可能已更改。因此,如果您将校验和与块一起传输,并且其中一个已更改,则它们将不再匹配(计算出的校验和将与发送的校验和不匹配)。这通常在通过 RS232 等串行通信发送数据时使用。

Y86 不是 "real" 架构,而是一种为教育目的而设计的架构,我相信。我找到了对它的引用 here。它似乎确实使用了 AT&T 语法(即 source,target 操作数顺序)。

first two input arguments will be stored in %RDI and %RSI where will the be third argument stored?

检查 Y86 ABI,可能在您的讲义中。如果它匹配 SYSV AMD64 ABI,它将是 rdx 寄存器(参见 table 中的最后一行)。

如果你有一个生成 Y86 汇编的 C 编译器,那么写一个简单的程序,它接受三个参数,returns一个简单的组合——比如,三个整数相加,returns 结果。然后查看使用了哪些寄存器来产生结果。

long val = *src++;
*dest++ = val;

Post-增量发生在计算表达式之后。所以,以上等同于

long val = *src;
src++;

*dest = val;
dest++;

what is checksum?

这是一个小数字,用于检测由于传输错误或类似原因导致的数据块变化。有关详细信息,请参阅 checksum 上的维基百科文章。

why are we XORing val with sum of previous XORed values?

计算校验和的方法有很多种;这种特殊的方式是使用 XOR 计算的。

可能为了简单起见选择了 XOR。现实世界的校验和算法使用查找 table 或位移、异或和(无符号模)加法和乘法。这些将涉及更多的工作来手工翻译成汇编。

对于校验和,其想法是您发送或存储一大块数据和校验和。然后收件人或 reader 可以重新计算校验和,并将其与存储的校验和进行比较。如果两个校验和不同,则数据可能有错误。

校验和并非万无一失。很可能出现如此多的错误,以至于两者虽然明显不同,但它们的校验和匹配。

校验和也无法确定错误的位置或内容。错误识别 "checksums" 更恰当地称为纠错码。它们通常用于例如CD、DVD 和蓝光媒体;大多数硬盘驱动器还在内部维护它们写入的数据的校验和,以便它们可以在读回数据时检测到错误。有关校验和和纠错码的更多信息,请参阅 Error detection and correction 上的维基百科文章。

why are there three sources and just one dest?

该函数将 len 个四边形从 src 复制到 dest,因此源和目标的长度应该相等。

示例输入可能是一个错误,但我认为更有可能是您的讲义中某处提到示例输入被假定为后跟足够数量的未定义字节,即四边形的数量在最后一个标签之后并不表示任何内容。换句话说,lecturer/TA/whoever 可以像

一样提供样本输入
    .align 8

# Source block
src:
    .quad 0x00a
    .quad 0x0b0 
    .quad 0xc00

 # Destination block
 dest:

因为目的地的内容无论如何都会被覆盖,其内容无关紧要。 Y86 程序集似乎不支持 .quad ? 指令之类的东西,这会使内存预留变得清晰。