Выделить блок памяти размером 64кБайта - Assembler

Узнай цену своей работы

Формулировка задачи:

Данная программа выделяет блок памяти размером 64байта. Мне необходимо сделать, чтобы она выделяла блок размером 64КИЛОбайта. Для этого я количество параграфов задаю как 4000h. Но при этом она создаёт мне пустой файл. Подскажите как переделать данную программу, чтобы она работала верно. Возможно так происходит из-за того, что ASCII символов всего 7F? Запуталась окончательно
Листинг программы
  1. format MZ ;EXEпрограмма
  2. entry csg: begin ;адрес первой команды программы
  3. stack 512 ;размер стека 512 байт
  4. segment dsg ;сегмент данных
  5. msg1 db 'Oshibka! Slishkom bolshoi razmer bloka!', 0Ah, 0Dh, \
  6. 'Chtoby viyty is programmy naghmite lybyy klavishu','$'
  7. fname db 'File.txt',0
  8. segment csg ;сегмент кода
  9. begin:
  10. mov AX,dsg ;DS на данные
  11. mov ES,AX
  12. mov DS,AX
  13.  
  14. for_start :
  15. mov ah,3ch ;функция - создание файла
  16. mov cx,0 ;атрибут - обычный файл
  17. lea dx,[fname] ;задаём название файла
  18. int 21h
  19. push ax ;сохранить содержимое ax
  20. mov ah,48h ;выделяем блок памяти
  21. mov bx,4h ;требуем 4 параграфа (64байта)
  22. int 21h
  23. jnc @ok
  24. mov ah,48h ; если запрошенное количество памяти
  25. int 21h ; не может быть выделено, то в bx вернётся значение
  26. ; доступной памяти в параграфах
  27. ;Вывод сообщения с информацией об ошибке
  28. mov ah, 09h
  29. lea dx, [msg1]
  30. int 21h
  31. jmp for_finish
  32. @ok:
  33. shl bx,4 ; умножаем на 16 (2 в 4ой степени), получаем кол-во выделенных байт
  34. mov es,ax ; DS=ES
  35. mov ds,ax
  36. mov di,0 ; Счетчик = 0
  37. ;заполняем выделенный блок памяти символами ASCII и загоняем их в буфер
  38. нулевой байт записываем 0, в первый - 1 т.д. до 64 байт
  39. for_loop: ; метка для перехода назад
  40. mov ax,di ; помещаем di в ax
  41. stosb ; увеличиваем DI на 1
  42. cmp di,bx ; di=bx?
  43. jnz for_loop ; если не равно, переход на for_loop
  44. dec di ; уменьшить DI на 1
  45. mov cx,di ; в CX - количество записываемых в файл байт
  46. pop bx ; извлечь содержимое bx
  47. mov ah,40h ; писать в файл через описатель
  48. xor dx,dx ; начинать с нулевого смещения,
  49. ; при условии, что DS=ES
  50. int 21h
  51. ; если равно, выходим
  52. mov ah,3Eh ; закрыть описатель файла
  53. int 21h
  54. for_finish:
  55. mov AH,00 ; ждать нажатия клавиши
  56. int 16h
  57. mov ax,4c00h ; завершение работы программы
  58. int 21h

Решение задачи: «Выделить блок памяти размером 64кБайта»

textual
Листинг программы
  1. ;выделяем память
  2.  mov ah,4ah
  3.  mov bx,0FFFFh
  4.  int 21h
  5.  
  6. ;получаем ошибку, в bx возвращается макс память
  7.  sub bx,0FFFh(вычитаем сколько нам нужно)
  8.  mov ah,4ah
  9.  int 21h
  10.  
  11.  mov ah,48h
  12.  bx,0fffh
  13.  int 21h
  14.  
  15. ;если все хорошо, то возвращается сегмент в ax

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

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

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

12   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы