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