Выделить блок памяти размером 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

Объяснение кода листинга программы

Список действий в коде:

  1. Выделяем память.
  2. Получаем ошибку, в bx возвращается максимальная память.
  3. Вычитаем из bx нужное количество памяти.
  4. Снова выделяем память.
  5. Если все хорошо, то возвращается сегмент в ax.

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы