Несущий флаг сборки 8086 - число со знаком, как минус равно плюс

Я что-то не поняла. Это вопрос:

mov  al,-128d
mov  ah,40d
add  al,ah ;result is out of 8 bit unsigned range?

Почему флаг переноса не включается? это должно быть 88, 88 не в диапазоне 0-255!

почему число маленькое d в конце, а не с маленьким ч? его десятичное число?

Зачем -128 + 40 равняется 168?

Как это возможно?

1 ответ

Да, маленькая буква "d" после цифр означает "десятичная дробь", поэтому mov al,-128d такой же как mov al,-128 или же mov al,-80h,

Я не понимаю эту часть вопроса с 88.

Около add al,ah:

Это будет сделать al = al + ah, Оба регистра имеют ширину 8 бит, и их содержимое (двоичное) AL = 10000000, AH = 00101000, Результат такого сложения в двоичном виде 10101000 = 168 в десятичном виде, если интерпретируется как 8-битное значение без знака.

Но когда вы пытаетесь интерпретировать то же значение, что и 8-битное значение со знаком, оно равно -88,

ADD сам или регистры AL/AH не понимаю вашу интерпретацию, им все равно, ADD будет делать простое добавление битов, и CF устанавливается, когда последнее добавление старшего бита переполнено, что в данном случае не произошло (если AL интерпретируется как 8-разрядное значение без знака, оно равно +128 и 128 + 40 = 168 => не превышает 255 => флаг переноса = 0).

На самом деле результат не находится ни в одном 8-битном диапазоне без знака или со знаком, результат является правильным значением 168 или -88, в зависимости от того, как вы его интерпретируете (как без знака или со знаком), это то же самое значение в AL, То, как вы читаете / интерпретируете это, зависит от следующего кода.

Чтобы какая-то беззнаковая арифметика 8b выходила за пределы диапазона, вам нужно, чтобы результат был больше 255, т.е.

    mov  al,150  ; binary 1001 0110
    mov  ah,150
    add  al,ah   ; al = 44 (low 8 bits of value 300), CF=1 (like 9th bit for ADD)
    ; 300 is in binary 0000 0001 0010 1100 (needs at least 9 bits)
Другие вопросы по тегам