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

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

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

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

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

textual
Листинг программы
.model tiny
.code
.startup
 
BufSizeParas    =       4096    ; размер буфера в параграфах (по 16 байт)
StackSize       =       256             ; размер стека (в байтах, должен быть кратен 16 байтам для корректных расчётов)
 
BufOfs          =       (TheEnd-@Startup+100h+StackSize+15) and 0FFF0h  ; смещение буфера относительно cs, ds (с выравниванием по 16 байтам)
 
                lea     sp,StackStart
 
                mov     ax,ds:[2]       ; сегмент после программы (последний выделенный программе сегмент + 1)
                mov     dx,cs           ; сегмент кода
                sub     ax,dx           ; кол-во параграфов, выделенных программе
                cmp     ax,BufOfs/16+BufSizeParas       ; достаточно ли свободной памяти?
                jb      LowMemory
 
                add     dx,BufOfs/16    ; получение сегмента буфера
                mov     es,dx           ; es = сегмент буфера
 
                xor     di,di
                mov     cx,BufSizeParas*8
                xor     ax,ax
                rep stosw               ; инициализируем буфер нулями
 
                mov     byte ptr es:[0],20      ; один вариант записи в буфер
                mov     es:Buffer,21            ; второй вариант записи в буфер
 
                int     20h             ; ret делать нельзя, т.к. в стеке у нас нет 0 (мы же изменили sp)
 
        LowMemory:
                mov     ah,9
                lea     dx,mLowMemory
                int     21h
 
                int     20h             ; ret делать нельзя, т.к. в стеке у нас нет 0 (мы же изменили sp)
 
mLowMemory      db      'Too low memory :(',13,10,'$'
 
        TheEnd:                         ; конец программы
        org BufOfs
        StackStart:                     ; начало стека (он растёт вниз, при записи первого слова значение будет записано по адресу -2 относительно текущего)
 
org     0                               ; чтобы буфер начинался со смещения 0
Buffer          label   byte
 
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
Похожие ответы