Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C至Y86总成_C_Assembly_Y86 - Fatal编程技术网

C至Y86总成

C至Y86总成,c,assembly,y86,C,Assembly,Y86,我试图理解这段代码,以便将其翻译成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 thir

我试图理解这段代码,以便将其翻译成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?)
  • (前两个输入参数将存储在%RDI和%RSI中,第三个参数将存储在哪里?)
  • %黑索今

  • //(这是先解除引用,然后添加还是相反?)
  • val设置为存储在src地址的值。然后src中的地址递增1

  • //(这条线在干什么?)
  • val写入dst中存储的地址,然后dst地址递增1

  • //(什么是校验和,为什么我们要用以前的XORed值之和XORing val?)
  • 此校验和是检测块更改的基本方法。例如,如果随后将数据传输到某个位置,并再次处理校验和,则如果块数据已更改,则校验和很可能已更改。因此,如果您将校验和与块一起传输,并且其中一个已更改,则它们将不再匹配(计算出的校验和与发送的校验和不匹配)。这通常在数据通过RS232等串行通信发送时使用。

    Y86不是一种“真正的”体系结构,我相信它是为教育目的而设计的。我找到了它的参考资料。它似乎确实使用了AT&T语法(即源、目标操作数顺序)

    前两个输入参数将存储在%RDI和%RSI中,第三个参数将存储在哪里

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

    如果您有一个生成Y86程序集的C编译器,那么就编写一个简单的程序,它接受三个参数,并返回一个简单的组合——比如,三个整数相加并返回结果。然后查看使用哪些寄存器生成结果

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

    后增量发生在表达式求值之后。因此,上述内容相当于

    long val = *src;
    src++;
    

    什么是校验和

    它是一个小数目,用于检测由于传输错误或类似原因导致的数据块更改。有关详细信息,请参阅上的Wikipedia文章

    为什么我们要用先前的XORD值之和XORG val

    有许多不同的方法来计算校验和;这种特殊的方法是使用XOR计算的

    选择XOR可能是为了简单。现实世界的校验和算法使用查找表、位移位、异或和(无符号模)加法和乘法。这些将需要更多的工作来转化为手工组装

    有了校验和,您就可以发送或存储一块数据,然后使用校验和。然后,收件人或读者可以重新计算校验和,并将其与存储的校验和进行比较。如果两个校验和不同,则数据可能有错误

    校验和不是万无一失的。很可能会有如此多的错误,尽管两者明显不同,但它们的校验和是匹配的

    校验和也不能识别错误的位置或内容。错误识别“校验和”更恰当地称为纠错码。它们通常用于CD、DVD和蓝光媒体;大多数硬盘驱动器在内部还维护它们写入的数据的校验和,以便它们在读回数据时能够检测到错误。有关校验和和纠错码的更多信息,请参阅Wikipedia上的文章

    为什么有三个来源,只有一个目的地

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

    示例输入可能是一个bug,但我认为更可能的是,在您的课堂讲稿中提到,假设示例输入后面有足够数量的未定义字节,即,最终标签后面的四元组数量并不表示任何内容。换句话说,讲师/助教/任何人都可以提供示例输入

        .align 8
    
    # Source block
    src:
        .quad 0x00a
        .quad 0x0b0 
        .quad 0xc00
    
     # Destination block
     dest:
    

    因为目标的内容无论如何都会被覆盖,它的内容并不重要。Y86程序集似乎不支持像
    .quad?
    指令这样的东西,这会使内存保留变得清晰。

    这些问题中的每一个都可以通过快速测试程序轻松测试。这要么是家庭作业,要么你应该问作者。这些都是非常基本的问题,它们实际上是意识形态的,因此在每一本C语言书中都有体现。当问题的一部分使现有答案部分无效时,不要删掉其中的一部分。我想知道为什么答案花了这么多时间讨论校验和,直到我检查了编辑历史记录。谢谢,但你错过了最后一个问题#(为什么有三个源,只有一个dest?)。它们是传递的三个变量,源地址、目标地址和要复制的数量(块大小).谢谢,但您错过了示例中的最后一个问题(为什么有三个来源,只有一个目的地?)input@Wkhan:哦,我也是。补充到答案中。我认为
    dest:
    标签后面的四边形数没有意义。你可以要求助教或查看课程笔记来验证。如果
    len==3
    ,那么您肯定需要在
    src
    dest
    中同时使用三个四元组(四个字、八字节单位或64位单位)。谢谢您的回答
        .align 8
    
    # Source block
    src:
        .quad 0x00a
        .quad 0x0b0 
        .quad 0xc00
    
     # Destination block
     dest: