Очевидно, есть Знак-Флаг. Но когда у меня есть фрагмент кода, например:
;starts with parry, zero set
mov eax, 100 ; mov does not affect the flags
neg eax ; sets carry, adjust and sign, unsets zero
mov ebx, 4000000000; mov does not affect the flags
mov ecx, eax ; mov does not affect the flags
mov edx, 50 ; mov does not affect the flags
add ebx, edx ; unsets all set flags, value of ebx is 4000000050
У меня возникают проблемы с пониманием того, как программа знает, что add ebx, edx
равно 4000000050
.
Помните, что флаг знака все еще установленот отрицания eax
.
И поскольку сборка не имеет типов, подобных C, которые различают signed
и unsigned
и ebx
установлен старший бит, значение, хранящееся в ebx
, может быть его действительнымзначение или это может быть его 2 дополнением. Мы не знаем.
По крайней мере, это мое понимание. Так как же программа узнает, что ebx
равно +4000000000
, а не отрицательному значению, дополнение 2 к которому равно 4000000000
в двоичном.