Работа с памятью: адресация выделенной области памяти - 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
Объяснение кода листинга программы
Список элементов кода:
- Установка размера буфера в параграфах и байтах.
- Вычисление смещения буфера относительно cs, ds.
- Выделение сегмента стека.
- Вычисление сегмента кода.
- Проверка доступности свободной памяти.
- Получение сегмента буфера.
- Инициализация буфера нулями.
- Запись в буфер.
- Обработка ситуации нехватки памяти.
- Вывод сообщения о нехватке памяти.
- Вычисление сегмента окончания программы.
- Вычисление начала стека.
- Установка начала буфера на 0.
- Создание метки для буфера.
- Конец программы.
- Организация стека.
- Вывод сообщения о нехватке памяти.
- Вычисление сегмента окончания программы.
- Вычисление начала буфера на 0.
- Создание метки для буфера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д