ASM вопрос, два дополнения - PullRequest
0 голосов
/ 12 апреля 2011

так что эта книга «пошаговый ассемблерный язык» действительно удивительна, но она немного загадочна о том, как работает два дополнения при работе с реальной памятью и регистрацией данных. Наряду с этим, я не уверен, как подписанные значения представлены в памяти либо, что я чувствую, может быть то, что держит меня в замешательстве. Anywho ...

там написано: «-1 = $ FF, -2 = $ FE и так далее». теперь я понимаю, что дополнение числа к двум умножается на -1, и при добавлении к оригиналу вы получите 0. Итак, FF - это шестнадцатеричный эквивалент 11111111 в двоичном формате и 255 в десятичном. поэтому мой вопрос: что говорит книга, когда в ней написано «-1 = $ FF»? Означает ли это, что -255 + -1 даст вам 0, но также, что он явно не установил флаг OF?

так на практике ... допустим, у нас есть 11h, то есть 17 в десятичном виде и 00100001 в двоичном. и это значение в AL. так что тогда мы NEG AL, и это установит CF и SF, и изменит значение в AL на ... 239 в десятичном виде, 11101111 в двоичном или EFh? я просто не вижу, как это будет 17 * -1? или это просто плохо сформулированное объяснение в книге, где оно действительно означает, что оно дает вам значение, которое вам понадобится, чтобы вызвать переполнение?

спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

В двух дополнениях, для байтов, (-x) == (256 - x) == (~x + 1).(~ - это C'ish для оператора NOT, который переворачивает все биты в своем операнде.)

Скажем, у нас 11h.

100h - 11h == EFh
(256 - 17  == 239)

Обратите внимание, что 256 работает сбайты, потому что они размером 8 бит.Для 16-битных слов вы бы использовали 2 ^ 16 (65536), для слов 2 ^ 32.Также обратите внимание, что вся математика - это мод 256 для байтов, 65536 для шорт и т. Д.

Или, не используя / + 1,

~11h = EEh
+1...  EFh

Этот метод работает для слов всех размеров.

0 голосов
/ 12 апреля 2011

что говорит книга, когда написано "-1 = $ FF"?

Если рассматривать только байт, то дополнение 1 к двум является 0xff (или $FF, если использовать этот формат для шестнадцатеричных чисел).

Чтобы разбить его, дополнение (или дополнение) 1 равно 0xfe, затем вы добавляете 1, чтобы получить дополнение к двум: 0xff

Аналогично для 2: дополнение 0xfd, добавьте 1, чтобы получить дополнение к двум: 0xfe

Теперь давайте посмотрим на 17 десятичных. Как вы говорите, это 0x11. Дополнение - 0xee, а дополнение двух - 0xef - все, что согласуется с тем, что вы указали в своем вопросе.

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

17 + (-17) == 0 

Теперь в гексе:

0x11 + 0xef == 0x100

Поскольку мы имеем дело с числовыми объектами, размер которых составляет всего один байт, 1 в 0x100 отбрасывается (некоторые размахивают здесь рукой ...), и мы получаем:

0x11 + 0xef == 0x00

Чтобы справиться с «размахиванием руками» (к сожалению, я, вероятно, не буду делать это понятным образом): начиная с флага переполнения (OF или иногда называется V по причинам, которые я не знаю) совпадает с флагом переноса (C), перенос может быть проигнорирован (это указывает на то, что подписанная арифметика произошла правильно). Один способ думать об этом, который, вероятно, не очень точен, но я считаю полезным, состоит в том, что начальные числа в номере дополнения отрицательного числа два «совпадают» с ведущими нулями в неотрицательном числе дополнения числа два.

...