Как мне определить тип данных C инструкции addb на компьютере с архитектурой x86-64? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть следующий код C, где и v, и b являются типом данных со знаком или указателями на тип данных со знаком. Мы также знаем, что sizeof (b) = 2.

*v+=b

Код ассемблера на x86-64 - это ...

addb %sil, (%rcx)

Вопрос в том, что такое тип данных C для v и b?

Я понимаю, что% sil соответствует b, а% rcx соответствует v. Однако решение гласит: «поскольку младший байт b добавляется к байту, на который указывает% rcx, v должен иметь тип char *.»

Я не понимаю, почему v должен быть символом *. Почему это не может быть коротким *?

Примечание: возможно, это опечатка, так как в этом вопросе уже есть другая опечатка, опубликованная в опечатках книги.

1 Ответ

2 голосов
/ 02 июля 2019

Я не понимаю, почему v должен быть символом *.Почему это не может быть коротким *?

Это не может быть short*, потому что addb имеет размер байтового операнда, а %sil является 8-битным регистром.short - это 16-битный тип в C ABI для x86-64.(ISO C требует, чтобы short было не менее 16 битов.)

Размер операнда для add определяет, сколько байтов в памяти изменяется, то есть размер представления объекта *v.

Если бы *v было short, было бы ошибкой отбрасывать вынос из младшего байта вместо того, чтобы позволять ему распространяться в старший байт, даже если по какой-то причине мы зналиЗначение b было небольшим.


sizeof(b) = 2 - это трюк / красная сельдь:

В правилах C типы, более узкие, чем int, являются операндами для таких операторов, как += повышается до int, а затем результат сложения int преобразуется обратно в тип назначения.

Так что *v += b не имеет значения, шире b илиуже *v. Вот почему вопрос должен был ответить вам sizeof(b);потому что вы не можете сделать вывод из инструкции addb, и он не должен соответствовать типу *v.

В x86-64 System V и Windows x64единственными 16-битными целочисленными типами являются short и unsigned short, поэтому sizeof(b) == 2 говорит нам, что b равно short или unsigned short.

(эти ABI также имеют CHAR_BIT = 8т. е. 1 байт char, что нормально для машин с байтово-адресуемой памятью.)


Типы фиксированной ширины, такие как uint8_t и int16_t, являются typedefs для unsigned char и short и тд.Я не считаю их за это.

Этот вопрос также позволяет нам исключать неподписанные типы, что мы не могли из asm.Добавление без знака и добавление дополнения 2 - это одна и та же двоичная операция.

...