Сборка - инструкция Mov и размер операндов - PullRequest
0 голосов
/ 31 октября 2018

Когда мы используем инструкцию mov в ассемблере, исходный и целевой операнды должны иметь одинаковый размер. Если я напишу:

mov rax, 1

Преобразуется ли 1 операнд относительно размера регистра rax?

Например, если rax 16 бит, мы получаем:

0000000000000001

1 Ответ

0 голосов
/ 31 октября 2018

Есть 2 языка. Первый - это ассемблер, где у вас может быть строка символов, например "mov rax, 1". Второй - машинный язык, где у вас будет набор байтов.

Эти языки связаны, но разные. Например, инструкция mov на ассемблере - это фактически несколько разных кодов операций на машинном языке (один для перемещения байтов в / из регистров общего назначения, один для перемещения слов / dwords / qwords в регистры общего назначения, один для перемещения dwords / qwords управлять регистрами, один для перемещения dwords / qwords в регистры отладки и т. д.). Ассемблер использует инструкцию и ее операнды для выбора соответствующего кода операции (например, если вы сделаете mov dr6,eax, тогда ассемблер выберет код операции для перемещения dwords / qwords для отладки регистров, потому что ни один из других кодов операции не подходит).

Точно так же операнды могут быть разными. Например, для языка ассемблера константа 1 имеет тип «целое число» и не имеет никакого размера (ее размер подразумевается от того, как / где она использовалась); но в машинном коде непосредственный операнд должен быть каким-то образом закодирован, и размер кодирования будет зависеть от того, какой код операции (и какие префиксы) используются для mov.

Например, если mov rax,1 преобразуется в байты 0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00; тогда вы можете сказать, что операндом является «64 бита, закодированные в 4 байта (с использованием расширения знака)»; или вы могли бы сказать, что операнд является 32-битным, закодированным в 4 байта (и что инструкция только перемещает 32 бита в RAX, а затем знак распространяется на верхние 32 бита RAX вместо того, чтобы что-либо перемещать в них). Хотя эти вещи звучат по-разному (и хотя большинство людей сказали бы, что последнее «более правильно»), поведение точно такое же, и единственными различиями являются поверхностные различия в том, как машинный код (другой язык, который не является языком ассемблера) описано. На ассемблере 1 по-прежнему является (подразумеваемым из контекста) 64-битным операндом, независимо от того, что происходит на машинном языке.

...