Выделить блок памяти размером 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д