ХАНДЫФАР

Инструкция MOV

Копирование второго операнда в первый операнд

MOV reg/mem8, reg8 - Скопировать reg8 в reg/mem8.
MOV reg/mem16, reg16 - Скопировать reg16 в reg/mem16.
MOV reg8, reg/mem8 - Скопировать reg/mem8 в reg8.
MOV reg16, reg/mem16 - Скопировать reg/mem16 в reg16.

MOV AX, moffs16 - Скопировать слово из (seg:offset(смещение)) в AX.

MOV moffs8, AL - Скопировать AL в (seg:offset(смещение)).
MOV moffs16, AX-- Скопировать AX в (seg:offset(смещение)).
MOV reg8, imm8-- Скопировать imm8 в reg8.
MOV reg16, imm16 - Скопировать imm16 в reg16.
MOV reg/mem8, imm8 - Скопировать imm8 в reg/mem8.
MOV reg/mem16, imm16 - Скопировать imm16 в reg/mem16.

Копирует второй операнд в первый операнд. Исходным операндом может быть непосредственное значение, регистр общего назначения, сегментный регистр или ячейка памяти; регистром назначения может быть регистр общего назначения, сегментный регистр или ячейка памяти. Оба операнда должны быть одинакового размера, который может быть байтом или словом.

Инструкция mov не может быть использована для загрузки регистра cs. Попытка сделать это приводит к недопустимому исключению кода операции (#UD). Чтобы загрузить регистр cs, используйте инструкцию дальнего jmp, call или ret.

Если операндом назначения является сегментный регистр (DS, ES или SS), исходный операнд должен быть допустимым селектором сегмента. В защищённом режиме перемещение селектора сегментов в регистр сегментов автоматически приводит к загрузке информации о дескрипторе сегмента, связанной с этим селектором сегментов, в скрытую (теневую) часть регистра сегментов. При загрузке этой информации проверяется информация о селекторе сегмента и дескрипторе сегмента. Данные дескриптора сегмента получены из записи GDT или LDT для указанного селектора сегментов.

Селектор нулевого сегмента (значения 0000-0003) может быть загружен в регистры DS и ES, не вызывая исключения защиты. Однако любая последующая попытка сослаться на сегмент, соответствующий регистр сегмента которого загружен с нулевым значением, вызывает исключение общей защиты (#GP).

Загрузка регистра ss командой mov подавляет или запрещает некоторые исключения отладки и запрещает прерывания на границе следующей команды. (Блокирование заканчивается после выдачи исключения или выполнения следующей инструкции.) Такое поведение позволяет загрузить указатель стека в регистр sp со следующей инструкцией (mov sp, значение указателя стека) до того, как может быть доставлено событие. Intel рекомендует программному обеспечению использовать инструкцию lss для совместной загрузки регистра ss и sp.

В качестве примера скопируем значение 3510 в регистр ax, в регистр bx скопируем значение 123416 а в регистр cx скопируем значение 000100112.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____ax, 35
  8. ________mov_____bx, 1234h
  9. ________mov_____cx, 00010011b
  10. ________mov_____ax, 4C00h
  11. ________int_____21h
  12. ____main endp
  13. code ends
  14. end main

Следующий пример демонстрирует использование seg:offset (смещение) для загрузки адреса строки и вывода её на экран. Существует 3 варианта с одинаковым результатом. Вы сами выбираете, какой из них использовать.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Hello", 0Ah, 0Dh, 24h
  6. data ends
  7. code segment public
  8. ____assume ds:data, cs:code
  9. ____main proc
  10. ________mov_____ax, seg data
  11. ________mov_____ds, ax
  12. ________mov_____ah, 09h
  13. ________mov_____dx, offset string
  14. ________int_____21h
  15. ________mov_____ah, 09h
  16. ________mov_____dx, offset ds:string
  17. ________int_____21h
  18. ________mov_____ah, 09h
  19. ________mov_____dx, offset ds:[string]
  20. ________int_____21h
  21. __
  22. ________mov_____ax, 4C00h
  23. ________int_____21h
  24. ____main endp
  25. code ends
  26. end main
Инструкция MOV

Копирование второго операнда в первый операнд

__________________MOV reg/mem8, reg8 - Скопировать reg8 в reg/mem8.
__________________MOV reg/mem16, reg16 - Скопировать reg16 в reg/mem16.
__________________MOV reg8, reg/mem8 - Скопировать reg/mem8 в reg8.
__________________MOV reg16, reg/mem16 - Скопировать reg/mem16 в reg16.

__________________MOV AX, moffs16 - Скопировать слово из (seg:offset(смещение)) в AX.

__________________MOV moffs8, AL - Скопировать AL в (seg:offset(смещение)).
__________________MOV moffs16, AX-- Скопировать AX в (seg:offset(смещение)).
__________________MOV reg8, imm8-- Скопировать imm8 в reg8.
__________________MOV reg16, imm16 - Скопировать imm16 в reg16.
__________________MOV reg/mem8, imm8 - Скопировать imm8 в reg/mem8.
__________________MOV reg/mem16, imm16 - Скопировать imm16 в reg/mem16.

Копирует второй операнд в первый операнд. Исходным операндом может быть непосредственное значение, регистр общего назначения, сегментный регистр или ячейка памяти; регистром назначения может быть регистр общего назначения, сегментный регистр или ячейка памяти. Оба операнда должны быть одинакового размера, который может быть байтом или словом.

Инструкция mov не может быть использована для загрузки регистра cs. Попытка сделать это приводит к недопустимому исключению кода операции (#UD). Чтобы загрузить регистр cs, используйте инструкцию дальнего jmp, call или ret.

Если операндом назначения является сегментный регистр (DS, ES или SS), исходный операнд должен быть допустимым селектором сегмента. В защищённом режиме перемещение селектора сегментов в регистр сегментов автоматически приводит к загрузке информации о дескрипторе сегмента, связанной с этим селектором сегментов, в скрытую (теневую) часть регистра сегментов. При загрузке этой информации проверяется информация о селекторе сегмента и дескрипторе сегмента. Данные дескриптора сегмента получены из записи GDT или LDT для указанного селектора сегментов.

Селектор нулевого сегмента (значения 0000-0003) может быть загружен в регистры DS и ES, не вызывая исключения защиты. Однако любая последующая попытка сослаться на сегмент, соответствующий регистр сегмента которого загружен с нулевым значением, вызывает исключение общей защиты (#GP).

Загрузка регистра ss командой mov подавляет или запрещает некоторые исключения отладки и запрещает прерывания на границе следующей команды. (Блокирование заканчивается после выдачи исключения или выполнения следующей инструкции.) Такое поведение позволяет загрузить указатель стека в регистр sp со следующей инструкцией (mov sp, значение указателя стека) до того, как может быть доставлено событие. Intel рекомендует программному обеспечению использовать инструкцию lss для совместной загрузки регистра ss и sp.

В качестве примера скопируем значение 3510 в регистр ax, в регистр bx скопируем значение 123416 а в регистр cx скопируем значение 000100112.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public ___________; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _________________; Начало процедуры main
  7. ________mov_____ax, 35 ________; Копируем десятичное значение 35 в регистр ax
  8. ________mov_____bx, 1234h _____; Копируем шестнадцатеричное значение 1234 в регистр bx
  9. ________mov_____cx, 00010011b__; Копируем двоичное значение 00010011 в регистр cx
  10. ________mov_____ax, 4C00h _____; Копируем значение функции завершения процесса в ah а значение в al
  11. ________int_____21h ___________; Вызываем прерывание DOS
  12. ____main endp _________________; Конец процедуры main
  13. code ends _____________________; Конец сегмента кода
  14. end main ______________________; Конец файла. Точкой входа указывается процедура main

Следующий пример демонстрирует использование seg:offset (смещение) для загрузки адреса строки и вывода её на экран. Существует 3 варианта с одинаковым результатом. Вы сами выбираете, какой из них использовать.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public_____________________; Начало сегмента данных
  5. ____string db "Hello", 0Ah, 0Dh, 24h
  6. data ends_______________________________; Конец сегмента данных
  7. code segment public ____________________; Начало сегмента кода
  8. ____assume ds:data, cs:code
  9. ____main proc __________________________; Начало процедуры main
  10. ________mov_____ax, seg data____________; Получаем адрес сегмента памяти данных и сохраняем его в ax
  11. ________mov_____ds, ax__________________; Передаём адрес сегмента памяти данных из регистра ax в ds
  12. ________mov_____ah, 09h_________________; Копируем значение функции вывода строки в регистр ah
  13. ________mov_____dx, offset string_______; Загружаем адрес переменной string в dx (ds по умолчанию)
  14. ________int_____21h_____________________; Вызываем прерывание DOS
  15. ________mov_____ah, 09h_________________; Копируем значение функции вывода строки в регистр ah
  16. ________mov_____dx, offset ds:string____; Загружаем адрес переменной string в ds:dx
  17. ________int_____21h_____________________; Вызываем прерывание DOS
  18. ________mov_____ah, 09h_________________; Копируем значение функции вывода строки в регистр ah
  19. ________mov_____dx, offset ds:[string]__; Загружаем адрес переменной string в ds:dx
  20. ________int_____21h_____________________; Вызываем прерывание DOS
  21. __
  22. ________mov_____ax, 4C00h_______________; Копируем значение функции завершения в ah а значение в al
  23. ________int_____21h ____________________; Вызываем прерывание DOS
  24. ____main endp __________________________; Конец процедуры main
  25. code ends ______________________________; Конец сегмента кода
  26. end main _______________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda