ХАНДЫФАР

При выполнении дальнего перехода в режиме реального адреса или виртуального, 8086 процессор переходит к сегменту кода и смещению, указанным целевым операндом. Здесь целевой операнд указывает абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16 или ptr16:32), либо косвенно с помощью ячейки памяти (mem16:16 или mem16:32). При использовании метода указателя сегмент и адрес вызываемой процедуры кодируются в инструкции с использованием 4-байтового (16-битный размер операнда) или 6-байтового (32-битный размер операнда) непосредственного удаленного адреса. При косвенном методе целевой операнд указывает ячейку памяти, содержащую 4-байтовый (16-разрядный размер операнда) или 6-байтовый (32-разрядный размер операнда) дальний адрес. Дальний адрес загружается непосредственно в регистры CS и IP.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db 0Ah, 0Dh, "Hello Assembly "
  6. ___________db World!$"
  7. data ends
  8. code segment public
  9. ____assume ds:data, cs:code
  10. ____main proc
  11. ________mov _____ax, seg data
  12. ________mov _____ds, ax
  13. ________mov ____ dl, 'D'
  14. ________call far ptr PrintChar
  15. ________lea _____dx, ds:[string]
  16. ________call far ptr PrintString
  17. ________mov _____ax, 4C00h
  18. ________int _____21h
  19. ____main endp
  20. code ends
  21. print_s segment public
  22. ____assume cs:print_s
  23. ____PrintChar proc far
  24. ________push ____ax
  25. ________mov _____ah, 02h
  26. ________int _____21h
  27. ________pop _____ax
  28. ________retf
  29. ____PrintChar endp
  30. ____PrintString proc far
  31. ________push ____ax
  32. ________mov _____ah, 09h
  33. ________int _____21h
  34. ________pop _____ax
  35. ________retf
  36. ____PrintString endp
  37. end main
При выполнении дальнего перехода в режиме реального адреса или виртуального, 8086 процессор переходит к сегменту кода и смещению, указанным целевым операндом. Здесь целевой операнд указывает абсолютный дальний адрес либо непосредственно с помощью указателя (ptr16:16 или ptr16:32), либо косвенно с помощью ячейки памяти (mem16:16 или mem16:32). При использовании метода указателя сегмент и адрес вызываемой процедуры кодируются в инструкции с использованием 4-байтового (16-битный размер операнда) или 6-байтового (32-битный размер операнда) непосредственного удаленного адреса. При косвенном методе целевой операнд указывает ячейку памяти, содержащую 4-байтовый (16-разрядный размер операнда) или 6-байтовый (32-разрядный размер операнда) дальний адрес. Дальний адрес загружается непосредственно в регистры CS и IP.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db 0Ah, 0Dh, "Hello Assembly World!$"
  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 ____ dl, 'D'__________; Копируем значение символа 'D' в регистр dl
  13. ________call far ptr PrintChar____; Вызываем процедуру PrintChar
  14. ________lea _____dx, ds:[string]__; Загружаем адрес массива string в регистр ds:dx
  15. ________call far ptr PrintString__; Вызываем процедуру PrintString
  16. ________mov _____ax, 4C00h________; Копируем значение функции завершения в ah а значение в al
  17. ________int _____21h______________; Вызываем прерывание DOS
  18. ____main endp ____________________; Конец процедуры main
  19. code ends ________________________; Конец сегмента кода
  20. print_s segment public____________; Начало сегмента print_s
  21. ____assume cs:print_s
  22. ____PrintChar proc far____________; Начало процедуры PrintChar
  23. ________push ____ax_______________; Сохраняем значение регистра ax в стеке
  24. ________mov _____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  25. ________int _____21h______________; Вызываем прерывание DOS
  26. ________pop _____ax_______________; Выталкиваем значение из стека в регистр ax
  27. ________retf______________________; Дальний возврат из процедуры PrintChar
  28. ____PrintChar endp________________; Конец процедуры PrintChar
  29. ____PrintString proc far__________; Начало процедуры PrintString
  30. ________push ____ax_______________; Сохраняем значение регистра ax в стеке
  31. ________mov _____ah, 09h__________; Копируем значение функции вывода строки в регистр ah
  32. ________int _____21h______________; Вызываем прерывание DOS
  33. ________pop _____ax_______________; Выталкиваем значение из стека в регистр ax
  34. ________retf______________________; Дальний возврат из процедуры PrintString
  35. ____PrintString endp______________; Конец процедуры PrintString
  36. end main _________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda