C至Y86总成
我试图理解这段代码,以便将其翻译成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
/* 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?)
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: