Усечение до add bl, 0xff
происходит во время сборки. (Или вы получаете ошибку во время сборки, если используете NASM -Werror=number-overflow
или -Werror
)
x86 Машинный код имеетнет кодировок с непосредственными значениями шире размера операнда;это было бы излишним и пустой тратой пространства.например, add r/m8, imm16
не существует, только imm8
.См. https://www.felixcloutier.com/x86/add для доступных кодировок.
Если вы хотите думать о нем как о расширении знака до 32-битного, а затем обрезании до ширины назначения, это хорошо, потому что это не меняетрезультат.Но такая умственная гимнастика, вероятно, не помогает.
Размер операнда инструкции установлен в 8 битов регистром назначения, являющимся 8-битным регистром в источнике asm.Таким образом, ассемблер выберет 8-битный код операции add
.Таким образом, когда ЦП декодирует его, размер операнда задается кодом операции, а не непосредственными данными или результатом добавления.
Заботится ли инструкция mov или она просто сохранит 00ffhв результате?
Я вижу, как вы представляете, что add
может расширяться и влиять на ЧД, но я не понимаю, как это может любой смысл.
Это отдельная инструкция.
Это язык ассемблера;каждая инструкция собирается отдельно и (логически) выполняется отдельно в программном порядке, что оказывает указанное влияние на архитектурное состояние машины.
(Реальные процессоры x86 выполняют параллельное / неупорядоченное выполнение, но отслеживаютвсего, чтобы поддерживать иллюзию, что инструкции выполняются по порядку по одному. Это аппаратный эквивалент правила C / C ++ «как будто».)