2016-01-27 4 views
2

Мне кажется, что это очень глупый вопрос, но я не мог найти ответ.Перемещение переменных в другую переменную

есть ли другой способ передать содержимое переменной данных, другой переменной, не используя push/pop или перенести ее сначала в регистр?

Я имею в виду что-то вроде этого:

.data 

txt dd 1 
txt1 dd 2 

.code 

start: 

mov txt1, txt 

;or - mov [txt1], txt 

ret 

end start 
+0

Не думайте о переменных как о расположении памяти. Переменная может быть записана в регистр или мертва в памяти. Вы можете и должны хранить переменные в регистрах как можно больше, а только проливать их на память, когда это необходимо. 32bit x86 имеет 7 регистров общего назначения (помимо указателя стека), которые вы можете использовать и должны использовать. –

ответ

4

В 8086 семья, самый простой способ заключается в использовании промежуточного регистра:

mov eax, txt 
    mov txt1, eax 

Многие CISC архитектуры не-Intel обеспечивает прямую память команда перемещения памяти. Архитектуры RISC редко делают.

Если есть больше, чем это, возможно, было бы проще использовать команду строки перемещения, которое требует настройки ИЭУ и ЭОД регистров, флаг DF, и если вы хотите использовать rep префикс, то ECX регистр:

Очевидно, что это не стоит одного или двух слов, но если у вас есть искусственные ограничения (нет промежуточного регистра, нет push/pop), то это может удовлетворять условиям.

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

+0

* Почти каждая архитектура, отличная от Intel, обеспечивает прямые команды перемещения mem-mem *? Большинство архитектур, отличных от Intel *, являются * RISC, а не CISC, а архитектуры RISC обычно являются загрузками/хранилищами. Я тестировал 'int a, b; void foo() {a = b;} 'на godbolt, а ARM/ARM64/PPC/AVR - все загрузки/сохранения с использованием регистров нуля. http://goo.gl/k5oFXS. Инструкция x86 'movs' необычна. –

+0

@PeterCordes: Хотя кажется, что недавние проекты, как правило, RISC, x86 явно является дизайном CISC без перемещений mem-to-mem. Однако семейства M68K, NS320x, Rx, Vax, 8051 и даже Z80 являются CISC. Я пересмотрел этот комментарий. Благодарю. – wallyk