Выделить блок памяти размером 64кБайта - Assembler
Формулировка задачи:
Данная программа выделяет блок памяти размером 64байта. Мне необходимо сделать, чтобы она выделяла блок размером 64КИЛОбайта. Для этого я количество параграфов задаю как 4000h. Но при этом она создаёт мне пустой файл. Подскажите как переделать данную программу, чтобы она работала верно.
Возможно так происходит из-за того, что ASCII символов всего 7F?
Запуталась окончательно
format MZ ;EXEпрограмма
entry csg: begin ;адрес первой команды программы
stack 512 ;размер стека – 512 байт
segment dsg ;сегмент данных
msg1 db 'Oshibka! Slishkom bolshoi razmer bloka!', 0Ah, 0Dh, \
'Chtoby viyty is programmy naghmite lybyy klavishu','$'
fname db 'File.txt',0
segment csg ;сегмент кода
begin:
mov AX,dsg ;DS на данные
mov ES,AX
mov DS,AX
for_start :
mov ah,3ch ;функция - создание файла
mov cx,0 ;атрибут - обычный файл
lea dx,[fname] ;задаём название файла
int 21h
push ax ;сохранить содержимое ax
mov ah,48h ;выделяем блок памяти
mov bx,4h ;требуем 4 параграфа (64байта)
int 21h
jnc @ok
mov ah,48h ; если запрошенное количество памяти
int 21h ; не может быть выделено, то в bx вернётся значение
; доступной памяти в параграфах
;Вывод сообщения с информацией об ошибке
mov ah, 09h
lea dx, [msg1]
int 21h
jmp for_finish
@ok:
shl bx,4 ; умножаем на 16 (2 в 4ой степени), получаем кол-во выделенных байт
mov es,ax ; DS=ES
mov ds,ax
mov di,0 ; Счетчик = 0
;заполняем выделенный блок памяти символами ASCII и загоняем их в буфер
;в нулевой байт записываем 0, в первый - 1 т.д. до 64 байт
for_loop: ; метка для перехода назад
mov ax,di ; помещаем di в ax
stosb ; увеличиваем DI на 1
cmp di,bx ; di=bx?
jnz for_loop ; если не равно, переход на for_loop
dec di ; уменьшить DI на 1
mov cx,di ; в CX - количество записываемых в файл байт
pop bx ; извлечь содержимое bx
mov ah,40h ; писать в файл через описатель
xor dx,dx ; начинать с нулевого смещения,
; при условии, что DS=ES
int 21h
; если равно, выходим
mov ah,3Eh ; закрыть описатель файла
int 21h
for_finish:
mov AH,00 ; ждать нажатия клавиши
int 16h
mov ax,4c00h ; завершение работы программы
int 21hРешение задачи: «Выделить блок памяти размером 64кБайта»
textual
Листинг программы
;выделяем память mov ah,4ah mov bx,0FFFFh int 21h ;получаем ошибку, в bx возвращается макс память sub bx,0FFFh(вычитаем сколько нам нужно) mov ah,4ah int 21h mov ah,48h bx,0fffh int 21h ;если все хорошо, то возвращается сегмент в ax
Объяснение кода листинга программы
Список действий в коде:
- Выделяем память.
- Получаем ошибку, в bx возвращается максимальная память.
- Вычитаем из bx нужное количество памяти.
- Снова выделяем память.
- Если все хорошо, то возвращается сегмент в ax.