Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2013, 14:15   #1
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию динамически выделять блок памяти объемом 64 Кбайт. Выделенный блок заполнять символьной информацией и переписывать в файл

Помогите пожалуйста!
Задача такая: динамически выделять блок памяти объемом 64 Кбайт. Выделенный блок заполнять символьной информацией и переписывать в файл.
Есть код программы, запускается без ошибок, но файл не создает. Подскажите в чем проблема?!

Код:
.model small					; модель памяти ближнего типа
.stack 100h					        ; определить стек размером 100h
.code						        ; открыть сегмент кода
main:

	mov dx, 03DAh				; читаем из порта
	in al, dx
	int 10h
						       ; установкавидеорежима и атрибута мигания
	mov dx, 03C0h				; пишем индекс регистра видеоадаптера
	mov al, 10h
	out dx, al
	int 10h

	mov dx, 03C0h				; пишем значение регистра видеоадаптера
	mov al, 00h
	out dx, al
	int 10h
	mov ax, @data				; настраивается сегментный регистр
	mov ds, ax

	mov ah,09h				; вывод текстовой информации
	mov dx,offset Strr
	int 21h
	mov dx,offset Str1
	int 21h
	mov dx,offset Str2
	int 21h
	mov dx,offset Str3
	int 21h
	mov dx,offset Str4
	int 21h
	mov  ah,02h				; Установить положение курсора
	mov  bh,00h				; Страница 0
	mov  dx,0000h				; В левый верхний угол экрана
	int  10h				; Вызвать BIOS


for_start : 
	mov di,0 				       ; Счетчик = 0 

for_loop: 					       ; метка для перехода назад 
	mov ah,48h 				; выделяем блок памяти
	mov bx,1000h 				; размером 64кб
	mov es, ax
	int 21h
	mov byte ptr es:[di], 00h
	inc ax

	inc di 					; увеличиваем DI на 1 
	cmp di,65535 				; сравниваем DI с 65535

	mov ah,3ch
	mov cx,0
	mov dx,offset fname
	int 21h 
	mov bx,ax
	mov ah,40h
	xor dx,dx
	push es
	pop ds
	int 21h
	mov ah,3Eh 
	int 21h
	fname db 'report.txt',0
	jnz for_loop 				; если не равно, переход на for_loop 

for_finish: 					        ; если равно, выходим
	end main
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 14:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

начнём с того, что это не полный текст программы.
нет секции с данными
(там, где описаны STRR, STR1, STR2, STR3, STR4)



Цитата:
Код:
        mov ah,3Eh 
        int 21h
        fname db 'report.txt',0
        jnz for_loop                            ; если не равно, переход на for_loop
О! А вот это, вообще "супер"!!
Расскажите, кто Вас в середину исполняемого кода научил текстовые константы вставлять?! Знакомый хакер?
Или Вы самостоятельно до этого додумались?!!
Тогда, хотя бы, обеспечьте, чтобы эти байты НЕ ВЫПОЛНЯЛИСЬ!

Последний раз редактировалось Serge_Bliznykov; 14.03.2013 в 14:25.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2013, 14:23   #3
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию

там просто мои данные, с фио и группой))
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 14:24   #4
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию

они в сегменте .data, больше я ничего не вырезала
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 14:27   #5
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию

ну да, вот так вот помогли)
получается строку "fname db 'report.txt',0" нужно в .data убрать?



_________________
Не используйте форум как чат - не пишите несколько коротких сообщений подряд!
Есть что добавить - нажимайте кнопку "Правка/Редактировать" на своём крайнем сообщении
и изменяйте, добавляйте....

Прошу учесть на будущее...

Модератор.

Последний раз редактировалось Serge_Bliznykov; 14.03.2013 в 14:42.
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 14:38   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
получается строку "fname db 'report.txt',0" нужно в .data убрать?
угу. это как минимум!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2013, 14:39   #7
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию

ну теперь файл у меня хотя бы создается!
Только вот он пустой( что дальше мне делать не подскажите??))
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 15:18   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

пойти двумя путями:
1. сделать статический массив в 64 кб - т.е. изменить модель файла, добавить еще один сегмент данных (ведь 64кб полностью занимают сегмент), заполнять этот сегмент и сохранять его в файл. Но это как-бы совсем не динамика.
2. Попросить менеджер памяти DOS выделить вам 64кб ОЗУ для своих нужд в коде программы:
например, через функцию 48h int 21h (не забываем, что объем выделяется в параграфах - погуглите, если это вызывает вопросы).
выполняете операции с памятью, сохраняете её в файл, а потом уже освобождаете через 49h int 21h.

в общем-то все просто...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 14.03.2013, 15:22   #9
RuRu*
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 10
По умолчанию

если по честному, я ничего не поняла..единственное, память выделять мне нужно динамически, а не статистически. ну что поделаешь, в ассемблере я чайник
Так вот здесь ведь я и выделяю блок памяти, разве нет?
Код:
        mov ah,48h 				; выделяем блок памяти
	mov bx,1000h 				; размером 64кб
	mov es, ax
	int 21h

Последний раз редактировалось RuRu*; 14.03.2013 в 15:27.
RuRu* вне форума Ответить с цитированием
Старый 14.03.2013, 15:46   #10
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Память у вас не выделится потому что при запуске программы ДОС выделяет под вашу программу всю свободную память. Чтобы выделить, нужно блок памяти вашей программы уменьшить функцией 4a прерывания 21h
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как динамически выделять память? tur91 Общие вопросы .NET 11 08.01.2013 16:48
(Asm) Поиск символьной цепочки в памяти Lawliet32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 19.05.2012 13:20
Как поместить блок в блок? mulderfbi HTML и CSS 6 28.09.2010 12:13
первый блок должен заливать весь фон, а второй блок блок выводить сплошную горизонтальную балку SanBorisych HTML и CSS 2 12.01.2010 17:42
Что такое динамически выделенный массив структур? -ushёl- Помощь студентам 5 02.01.2010 17:58