gpt4 book ai didi

c - 我应该如何推断 x86-64 机器上 addb 指令的 C 数据类型?

转载 作者:行者123 更新时间:2023-11-30 18:44:43 24 4
gpt4 key购买 nike

我有以下 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*。为什么不能是短*?

注意:这可能是一个打印错误,因为该问题的另一个打印错误已经发布在本书的勘误表上。

最佳答案

I do not understand why v must be a char*. Why cannot it be a short*?

它不能是 short*,因为 addb 是字节操作数大小,而 %sil 是一个 8 位寄存器。 short 是 x86-64 的 C ABI 中的 16 位类型。 (ISO C 要求 short 至少为 16 位。)

add的操作数大小决定了内存中修改的字节数,即*v的对象表示的大小。

如果*vshort,则丢弃低字节中的进位而不是让它传播到高字节中将是一个错误,即使由于某种原因我们知道 b 的值很小。

<小时/>

sizeof(b) = 2 是一个技巧/红鲱鱼:

在 C 规则中,比 int 更窄的类型作为 += 等运算符的操作数会提升为 int,然后 int 加法结果被转换回目标类型。

因此 *v += b 并不关心 b*v 更宽还是更窄。 这就是为什么问题必须告诉你sizeof(b);因为您无法addb指令推断出这一点,并且它不必与*v的类型匹配。

在 x86-64 System V 和 Windows x64 中,唯一的 16 位整数类型是 shortunsigned Short,因此 sizeof(b) = = 2 告诉我们 bshortunsigned Short

(这些 ABI 还具有 CHAR_BIT = 8,即 1 字节 char,这对于具有字节可寻址内存的机器来说是正常的。)

<小时/>

uint8_tint16_t这样的固定宽度类型是unsigned charshort的类型定义,等等在。我不会为此算计他们。

这个问题还让我们排除了无符号类型,而我们无法从 asm 中排除无符号类型。无符号加法和2的补码加法是相同的二元运算。

关于c - 我应该如何推断 x86-64 机器上 addb 指令的 C 数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56841559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com