【发布时间】:2019-07-01 19:42:11
【问题描述】:
我有以下 C 代码,其中 v 和 b 都是有符号数据类型或指向有符号数据类型的指针。我们也知道 sizeof(b) = 2。
*v+=b
x86-64 上的汇编代码是...
addb %sil, (%rcx)
问题是 v 和 b 的 C 数据类型是什么?
我知道 %sil 对应于 b 而 %rcx 对应于 v。 但是,解决方案说“因为 b 的低位字节被添加到 %rcx 指向的字节,所以 v 必须是 char* 类型。”
我不明白为什么 v 必须是 char*。为什么不能短*?
注意:这可能是印刷错误,因为在本书的勘误表上已经发布了关于这个问题的另一个印刷错误。
【问题讨论】:
-
addb中的b表示字节,8 位。sil也是一个 8 位寄存器。因此,它必须是 8 位值,即(可能)char而不是short。它不能是short(假设是 16 位),因为加法不能正确处理从低 8 位到高 8 位的进位。哦,We also know that sizeof(b) = 2???你确定吗?如果有印刷错误,就是这样。sizeof(b)应该是1。 -
我不完全确定为什么,但我刚刚检查了这本书,b 是书中使用的两个字节。它可能与平台有关?对于这个问题,我们应该假设 addb 增加了两个字节,因为它是书中使用的假设。
-
虽然您可以在
char中添加short(带有截断),这样即使误导也可能被认为是正确的。 -
正如解决方案所说,这是因为某些值“添加到 %rcx 指向的字节”。
short不仅仅是一个字节。 -
@melpomene 我可能错了,但我认为 (%rcx) 会从 %rcx 引用的位置获取两个字节(因为它被 addb 使用)?