преобразования ascii char в char Сборка x86? - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать атбашный шифр в сборке x86, где 'a' s становится 'z' s, 'b' s становится 'y' s и так далее.Я использую такое уравнение, что (122-символ) + 97 (в значениях ascii) является символом atbash.

mov     al, 'c'
mov     rax, 122
mov     rcx, al
sub     rax, rcx
add     rax, 97

Однако при выполнении этих строк указывается, что существует недопустимая комбинация кода операции иоперанды.

Как правильно выполнить это уравнение с char с и int с?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если вы хотите обнулить или расширить знак байта в 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
0 голосов
/ 20 февраля 2019

Эта строка: mov rcx, al недопустима, поскольку не существует кодировки mov, которая имеет пункт назначения r64 и источник r/m8.

Эта строка в любом случае избыточна:

mov     al, 'c'
mov     rax, 122

Частичный регистр al является псевдонимом для младшего байта регистра rax.Вы перезаписываете 'c' с помощью 122 сразу после следующей строки.Если вы намереваетесь скопировать только 'c' в rcx, вы можете использовать инструкцию movzx, которая распространяется на ноль до полного пункта назначения из источника r/m:

mov al, 'c'
movzx ecx, al ; upper 32 bits are zeroed too

К счастью, в отличие от своего 32-разрядного предшественника, x86_64 имеет еще несколько GPR, которые вы можете использовать (от r8 до r15).Используйте некоторые из них для арифметики с 122 и 97 для реализации вашего шифра.

...