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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2012, 15:30   #1
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
Вопрос Вывод на экран (assembler)

Всем привет)
Собственно говоря вот код. Я хочу добиться вывода на экран того, что загоняется в буфер - но кроме последовательно выводящихся символов таблицы ASCII - пока не выходит. Не могу понять - почему в переменную perem1 не загоняется начальный адрес смещения буфера, для последующего вывода на экран этого участка кода (я же по идее квадратными скобками типа говорю считать по этому адресу?) Понятно что это всё равно будут ASCII символы)
Код:
CSEG segment
assume ds:CSEG, cs:CSEG, es:CSEG, ss:CSEG
org 100h

Begin:
	mov ax,3D00h               ; загоняем в регистры ah - 3dh (открытие файла для прерывания 21h и установка флага jc в 1 если файл не найден) и al - 00h тип открытия на чтение 
	mov dx, offset File_open   ; в dx загоняем адрес смещения по которому располагается файл (по идее надо задать и сегмент в котором находится путь к файлу
	                           ; но у нас он находится по умолчанию в этом же сегменте где и наш код - ds:CSEG то есть мы его не задаём)
	int 21h                    ; прерывание после которого в регистр ax записывается номер файла, который нам нужен(путь до которого указан выше в ds:dx) и установка флага в 1 или 0 jump if carry jc 
	
	jc Error_file 				; если jc установлен в 1 то прыжок на метку Error_file
	
	mov Handle,ax 				; в ax как мы помним сидит номер файла, который мы перегоняем в переменную Handle
	mov bx,ax 					; в bx мы загоняем номер файла так как функция считывания файла в буффер 3Fh использует номер файла именно из bx
	mov ah,3Fh 					; загоняем в ah функцию чтения из файла 3Fh для прерывания 21h
	mov cx,02fffh 				; в регистр счётчика загоняем количество байтов для считывания
	mov dx,offset Buffer		; здесь адрес ds:dx буфера того куда мы считываем 
	;add perem1,offset Buffer	??		
		int 21h 
	
	mov ah,3Eh 					; проводим закрытие файла функцией 3Eh
	mov bx,Handle 				; в регистре bx должен быть номер того файла который мы закрываем и мы его туда помещаем из переменной handle 
	int 21h
	
	mov dx,offset Mess_ok 		; теперь выводим на экран строку о том что всё ок
Out_prog: 						; метка завершения программы в коде которой мы выводим сообщение в зависимости от исхода
	mov ah,9
	int 21h
	mov ah,10h
	int 16h
;===Здесь мой код==================
	
	mov ax,0B800h         ; в ax загоняем 0b800h для перегонки его в es
	mov es,ax			  ; загоняем в es 0b800h как адресс по которому находится видеобуфер экрана
	mov di,0			  ; смещение в сегменте es равно 0
	mov cx,2fffh		  ; количество байт которые мы считали
							; цвет символа для вывода
	mov ax,3				;Это мы очищаем экран
        int 10h		
		mov ah,31 
Print_out:
	
	
	mov al,byte ptr [perem1] ; собственно сам символ который планируется увидеть на экране что находится по адресу perem1
	mov es:[di],ax
	add di,2
	add perem1,1
loop Print_out
	
	
	
	int 20h 					; завершаем прогу прерыванием 20h 
	
Error_file: 					; это метка ошибки
	mov dx,offset Mess_error
	jmp Out_prog 				; переход на метку выхода
	
	Handle dw 0 				; здесь мы определяем переменную 2-х байтовую
	Mess_ok db 'File is in memory$'
	Mess_error db 'Error$'
	
	File_open db 'c:\users\snap\desktop\open.txt',0
	
	Buffer equ $ 				; вот это типа то место где типа наш буфер - то есть в конце кода - типа теперь буфер благодаря $ содержит адрес этого места для записи сюда
   	perem1 dw Buffer 
CSEG ends
end Begin
Pillllot вне форума Ответить с цитированием
Старый 08.02.2012, 20:16   #2
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

во-первых, содержимое perem1 зартется при чтении файла,
во-вторых, perem1 всегда указывает на одно и то же место в памяти, и конструкция [perem1] загружает значение одного и того же байта.
нужно, за perem1 объявить например perem2, читать файл туда, и при выводе :
Код:
		mov ah,31 
lea si,perem2
Print_out:
	
	
	mov al,byte ptr [si] ; собственно сам символ который планируется увидеть на экране что находится по адресу perem1
	mov es:[di],ax
	add di,2
	inc si
loop Print_out
alexey2 вне форума Ответить с цитированием
Старый 08.02.2012, 21:23   #3
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от alexey2 Посмотреть сообщение
во-первых, содержимое perem1 зартется при чтении файла
Вот те на) Это не понятно...хотя - это типа получается память того места которое мы определили под переменную param1 будет заполнятся считанными из файла байтами? я вообще хотел поместить в переменную адрес начала буфера...а вот то что переменная где-то рядом сама окажется - не подумал. Если я сейчас вообще правильно Вас понял)

Цитата:
Сообщение от alexey2 Посмотреть сообщение
во-вторых, perem1 всегда указывает на одно и то же место в памяти, и конструкция [perem1] загружает значение одного и того же байта.
нужно, за perem1 объявить например perem2, читать файл туда, и при выводе
Про конструкцию я понял - не знал такого ранее, хотя подозревал провал в этом месте - ещё видимо всё впереди) А по поводу очерёдности объявления - тоже вроде как понял - место в памяти раньше надо выделять чем то место куда считываем.
Спасибо большое за ответ - очень признателен)
А вот ещё такой момент: в отладчике когда пытаюсь прогнать код - изначально все сегменты имеют одно и то же значение - так как это типа COM файл и => 64Кбайт - один сегмент. Так первые пару шагов всё идёт по коду - а потом левые инструкции начинаются и сегменты начинают меняться - хотя прога ещё не завершилась) В чём может быть подвох? Отладчик AFD. Спасибо)
Pillllot вне форума Ответить с цитированием
Старый 08.02.2012, 21:37   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Pillllot Посмотреть сообщение
А вот ещё такой момент: в отладчике когда пытаюсь прогнать код - изначально все сегменты имеют одно и то же значение - так как это типа COM файл и => 64Кбайт - один сегмент. Так первые пару шагов всё идёт по коду - а потом левые инструкции начинаются и сегменты начинают меняться - хотя прога ещё не завершилась) В чём может быть подвох? Отладчик AFD. Спасибо)
Наверное в отладчике, когда доходите до прерывания DOS, вы не проскакиваете его, а входите в пошаговое выполение соответствующего обработчика этого прерывания.
Надо в отладчике,когда доходите до команды int 21h, или любого другого прерывания, перескакивать через нее, сразу же переходя на следующую за прерыванием команду в вашей программе.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 08.02.2012, 22:17   #5
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

Цитата:
я вообще хотел поместить в переменную адрес начала буфера
да, в perem1 будет адрес начала буфера, и буфер будет указывать на perem1...
про отладчик не скажу... убедись что собирается именно com-файл, посмотри что за инструкция, с которой начинаются проблемы. вообще-то, под буфер памяти формально никто не выделял, и черт его знает где располагается стек. когда я практиковался на tasm, то для com-файлов стек был в конце сегмента, и все остатки от 64к начиная с конца кода были свободно доступны. Для exe стек создавался в сегменте данных сразу за последними определенными данными, и, явно не объявляя буфер через dup с большим числом, использовать области за последним выделенным байтом было нельзя... Так что попробуй выделить под буфер несколько килобайт если ничего не поможет...
alexey2 вне форума Ответить с цитированием
Старый 09.02.2012, 09:57   #6
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
По умолчанию

Большое спасибо за ответы!!!
Pillllot вне форума Ответить с цитированием
Старый 09.02.2012, 09:59   #7
Pillllot
 
Регистрация: 02.12.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Наверное в отладчике, когда доходите до прерывания DOS, вы не проскакиваете его, а входите в пошаговое выполение соответствующего обработчика этого прерывания.
Надо в отладчике,когда доходите до команды int 21h, или любого другого прерывания, перескакивать через нее, сразу же переходя на следующую за прерыванием команду в вашей программе.
кстати да - я это заметил тоже. Хм, интересный момент) Спасибо)
Pillllot вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод данных на экран в Assembler sap_ax Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 28.12.2011 20:15
Вывод файла *.тхт на экран (assembler) Kelevra23 Помощь студентам 0 01.12.2011 15:57
Вывод пикселя на экран (Assembler) Demonhunterus Помощь студентам 0 30.09.2011 19:39
Assembler - ввод данных (имени и фамилии) с клавиатуры и вывод на экран МартинИ Помощь студентам 1 25.05.2010 00:40
вывод информации на экран о состоянии памяти на текущем диске А(assembler) alien9356 Фриланс 2 15.06.2009 15:41