#assembly #x86 #x86-64
#сборка #x86 #x86-64
Вопрос:
Давайте предположим, что у меня есть два регистра (скажем, RAX и RDX), которые я могу свободно использовать, не влияя на исходный код. Что лучше (предположим, мне не нужно временное значение из 0xabcd впоследствии):
#1
MOV RAX, [0xabcd]
MOVSX RAX, BYTE PTR [RAX]
MOV [0xbcde], RAX
или
#2
MOV RAX, [0xabcd]
MOVSX RDX, BYTE PTR [RAX]
MOV [0xbcde], RDX
Или есть другое решение, которое еще лучше? Также хотелось бы получить объяснение этого в целом, поскольку у меня есть довольно много точек, где у меня есть указатель памяти по определенному адресу, и мне нужно разыменовать этот указатель.
Комментарии:
1. Я предполагаю, что, поскольку каждая инструкция зависит от предыдущей, не имеет значения, что вы повторно используете
rax
значение, и это оставляет еще один слот доступным для переименования регистра в окружающем коде.2. @Jester Итак, вы бы сказали # 1? Почти то, что я тоже подумал. Также это то, что я бы предпочел, поскольку это немного упрощает понимание программы IMO.
3. Это не имеет значения. Оба варианта хороши. В 32-разрядном коде первый вариант имеет немного более короткую кодировку и может быть предпочтительным при оптимизации по размеру. Однако это не относится к 64-разрядному коду.