Каковы особенности хранения 32-битного целого числа со знаком в регистре?
Мой тип чисел - это целое число со знаком в виде двух чисел.
В регистрах памяти%rdi/edi/di у меня 0xFFFFFFFF. В%rsi/esi/si у меня 0x80000000.
Моя инструкция addl %edi, %esi
,
Как мне правильно добавить это?
Я думаю, что ответ:
Поскольку я добавляю полный 32-битный регистр, я получаю преимущество добавления полных сумм 0xFFFFFFFF и 0x80000000.
Итак, к подписанному добавлено целое число со знаком, и оба они 32-разрядные. Я эффективно добавляю -2147483648 и 0x80000000. Поскольку 0x80000000 - это 2147483648 в шестнадцатеричном формате, я добавляю эти два и получаю ноль.
Флаг нуля активирован Флаг переноса активирован (так как я добавляю старшее значение 32-битного регистра)
1 ответ
В 32-битном двух дополнениях, 0xFFFFFFFF
представляет -1, и 0x80000000
представляет -2,147,483,648. Сумма из них составляет -2,147,483,649. Это не вписывается в 32 бита, поэтому оно переполняется. Вычисленный результат будет 0x7FFFFFFF
, что составляет 2 147 483 647.
На уровне битов: FFFFFFFF
плюс 80000000
производит 17FFFFFFF
, что значит 7FFFFFFF
хранится в 32-разрядном месте назначения, а 1
это выполнение.