Перемещение двух байтов в нижнюю часть регистра - PullRequest
1 голос
/ 14 октября 2019

Предполагая, что регистр %rdi содержит 8 байтов, которые составляют действительный адрес, напишите инструкцию x86-64 для разыменования этого адреса и переместите два байта в самую нижнюю часть %rsi.

Мой ответ movq 2(%rdi), %rsi, но это не правильно.

Я не очень понимаю, как выразить часть "перемещение двух байтов". Я надеюсь, что кто-то может объяснить это для меня. Большое спасибо

1 Ответ

1 голос
/ 15 октября 2019

ход 2 байта = word размер операнда. movw (%rdi), %si.

Или просто позвольте ассемблеру определить размер операнда из регистра mov (%rdi), %si. Они собираются в идентичный машинный код (что имеет значение), просто разные способы его записи.

Запись в ESI будет расширяться от нуля до полного RSI, но запись в младший байт (SIL) или слово (SI) оставляет верхние байты неизмененными. (т.е. объединяет несколько байтов в RSI.) Причиной этого различия являются разные решения, сделанные 386 архитекторами и AMD64 при расширении x86 с более широкими регами. Почему инструкции x86-64 для 32-битных регистров обнуляют верхнюю часть полного 64-битного регистра?

Смысл этого назначения состоит в том, чтобы убедиться, что вы понимаете, насколько частичнымрегистрирует псевдоним на RSI.

...