Несущий флаг сборки 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)