Если вы хотите обнулить или расширить знак байта в 64-битном регистре, используйте movzx ecx, al
или movsx rcx, al
соответственно.
Обратите внимание, что вы получили "недопустимую комбинацию кода операции и операндов"msgstr "когда собирается , прежде чем будет выполнен какой-либо машинный код.Это потому, что вы выбрали мнемонику (mov
), которая не имеет допустимой кодировки для этих операндов.
(122-char) + 97
= 122+97 - char
, что тривиально для реализации .122 + 97 = 219, что составляет всего 1 байт, поэтому вы можете использовать 8-битный размер операнда, если хотите.
;; input in EAX or AL
;; result in ECX or CL
mov ecx, 'z'+'a' ; let the assembler do the math with ASCII constants
sub ecx, eax
Или в одном регистре с худшей задержкой:
sub al, 'z'+'a' ; c - 219
neg al ; 219 - c