Игнорирование ошибок в примере кода (см. ответ Аки)...
Если вы пытаетесь добавить пару 24-битных чисел; тогда первое 24-битное число положительно, потому что бит знака для этого числа находится в бите 7 0, который вы перемещаете в DL (в инструкции mov dl,0
). Второе 24-битное число также положительно, потому что его бит знака находится в бите 7 числа 0, которое вы добавляете к DL (в инструкции adc dl,0
).
В этом случае результат сложения будет положительным (сложение 2 положительных чисел даст положительный результат), а флаг знака ЦП будет корректно показывать, что результат сложения 24-битных чисел был положительным. Флаг переноса ЦП и флаг переполнения также будут правильными (и оба будут очищены); так что вы можете протестировать их обычным образом, используя такие инструкции, как js
, jg
и jo
(даже если вы знаете, что все они понятны и условные переходы могут быть либо удалены, либо преобразованы в jmp
). Однако флаг четности и нулевой флаг процессора могут быть неправильными (например, нулевой флаг скажет только, что все старшие 8 бит равны нулю, и не скажет вам, равны ли все 24 бита нулю).
Однако, если вы думали, что добавляете 16-битные числа со знаком (и пытаетесь получить 24-битный результат), то вы делаете это неправильно и получите неправильные результаты. Чтобы добавить 16-битные числа со знаком и получить 24-битный результат, вам нужно будет «подписать расширение» 16-битных чисел, чтобы сделать их 24-битными, а не «нулевым расширением» этих чисел. Например, 16-битное (отрицательное) число 0xCDEF должно стать 24-битным (отрицательным) числом 0xFFCDEF, а не 24-битным (положительным) числом 0x00CDEF.
Другой альтернативой может быть добавление 16-битных чисел, как обычно, а затем расширение знака результата до 24-бит. Это работает только в том случае, если 16-битное сложение не переполняется, а если сложение не может переполняться, то для начала вам не нужен 24-битный результат.
person
Brendan
schedule
21.11.2012