Работа с памятью: адресация выделенной области памяти - Assembler

Узнай цену своей работы

Формулировка задачи:

Привет, ребят! Допустим я создал (выделил) какой-то участок памяти (функция 48h).. Вооот И мне очень хотелось бы его как-то адресовать (в моем понимании адресовать - значит обращаться к нужному мне участку выделенной памяти и, при необходимости его изменять). По сути это просто буфер, в который я бы хотел запихивать данные, но я никак не пойму, как к нему обратиться.. Пробовал
Листинг программы
  1. mov byte ptr [buffer], 20 ;хочу занести в первый байт двадцатку, но вместо этого просто изменяется значение переменной
  2. ;buffer....
  3. ;........
  4. ;........
  5. buffer dw ?
  6. end LP
Подскажите, пожалуйста, как быть! А я пока попробую сам найти ответ)))

Решение задачи: «Работа с памятью: адресация выделенной области памяти»

textual
Листинг программы
  1. .model tiny
  2. .code
  3. .startup
  4.  
  5. BufSizeParas    =       4096    ; размер буфера в параграфах (по 16 байт)
  6. StackSize       =       256             ; размер стека байтах, должен быть кратен 16 байтам для корректных расчётов)
  7.  
  8. BufOfs          =       (TheEnd-@Startup+100h+StackSize+15) and 0FFF0h  ; смещение буфера относительно cs, ds выравниванием по 16 байтам)
  9.  
  10.                 lea     sp,StackStart
  11.  
  12.                 mov     ax,ds:[2]       ; сегмент после программы (последний выделенный программе сегмент + 1)
  13.                 mov     dx,cs           ; сегмент кода
  14.                 sub     ax,dx           ; кол-во параграфов, выделенных программе
  15.                 cmp     ax,BufOfs/16+BufSizeParas       ; достаточно ли свободной памяти?
  16.                 jb      LowMemory
  17.  
  18.                 add     dx,BufOfs/16    ; получение сегмента буфера
  19.                 mov     es,dx           ; es = сегмент буфера
  20.  
  21.                 xor     di,di
  22.                 mov     cx,BufSizeParas*8
  23.                 xor     ax,ax
  24.                 rep stosw               ; инициализируем буфер нулями
  25.  
  26.                 mov     byte ptr es:[0],20      ; один вариант записи в буфер
  27.                 mov     es:Buffer,21            ; второй вариант записи в буфер
  28.  
  29.                 int     20h             ; ret делать нельзя, т.к. в стеке у нас нет 0 (мы же изменили sp)
  30.  
  31.         LowMemory:
  32.                 mov     ah,9
  33.                 lea     dx,mLowMemory
  34.                 int     21h
  35.  
  36.                 int     20h             ; ret делать нельзя, т.к. в стеке у нас нет 0 (мы же изменили sp)
  37.  
  38. mLowMemory      db      'Too low memory :(',13,10,'$'
  39.  
  40.         TheEnd:                         ; конец программы
  41.         org BufOfs
  42.         StackStart:                     ; начало стека (он растёт вниз, при записи первого слова значение будет записано по адресу -2 относительно текущего)
  43.  
  44. org     0                               ; чтобы буфер начинался со смещения 0
  45. Buffer          label   byte
  46.  
  47. end

Объяснение кода листинга программы

Список элементов кода:

  1. Установка размера буфера в параграфах и байтах.
  2. Вычисление смещения буфера относительно cs, ds.
  3. Выделение сегмента стека.
  4. Вычисление сегмента кода.
  5. Проверка доступности свободной памяти.
  6. Получение сегмента буфера.
  7. Инициализация буфера нулями.
  8. Запись в буфер.
  9. Обработка ситуации нехватки памяти.
  10. Вывод сообщения о нехватке памяти.
  11. Вычисление сегмента окончания программы.
  12. Вычисление начала стека.
  13. Установка начала буфера на 0.
  14. Создание метки для буфера.
  15. Конец программы.
  16. Организация стека.
  17. Вывод сообщения о нехватке памяти.
  18. Вычисление сегмента окончания программы.
  19. Вычисление начала буфера на 0.
  20. Создание метки для буфера.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы