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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 08:24   #1
Olya_lya
 
Регистрация: 21.10.2011
Сообщений: 6
Восклицание ошибки на ассемблере

Здравствуйте!!
Задача: Программа должна выделять английские символы в словах текстового файла зеленым фоном. Доп условия: формат- exe, ввод с клавиатуры - средствами bios, вывод на экран в графическом режиме с освобождением памяти. По возможности с комментариями.

сделала формат exe и освобождение памяти. сейчас проблема открыть файл: текстовик создан, но он все равно выдает ошибку о невозможности открыть файл!

в ассемблере новичок

Код:
.model tiny	; модель памяти 
.stack 100h	; установка размера стека 100h
.data		; начало сегмента данных 

cr	equ	0dh	;возврат каретки
lf	equ	0ah	;подача строки

FileName db '1.txt',0
ErrorOpenFile db 10,13,'Error! Unable to open file!$'

dw  80 DUP(?)
HANDLE dw ?
INPREC db 512 DUP (' ')

.code	
main:
	mov ax, @data	
	mov ds, ax 	


;открытие файла 
	mov ah,3dh		;номер функции открытия файла
	mov al,02		;только чтение
	lea dx, FileName	;ASCIIZ строка
	int 21h		

	jc open_error	;уход по ошибке
	mov HANDLE,ax	;запоминание файлового номера
	

;вывод сообщения об ошибке открытия файла
open_error:
	mov ah,9h
	lea dx, ErrorOpenFile
	int 21h

 		
;закрытие файла
	mov ah,3eh		;номер функции закрытия файла
	mov bx,HANDLE	;файловый номер
	int 21h 		


exit:			;выход из программы
	mov ah,49h	;освобождение памяти
	int 21h
	
	mov ah,4ch	;выход
	int 21h
end main

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 23.10.2011 в 09:30.
Olya_lya вне форума Ответить с цитированием
Старый 23.10.2011, 09:34   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
	jc open_error	;уход по ошибке
	mov HANDLE,ax	;запоминание файлового номера

А ЕСЛИ ФАЙЛ ОТКРЫЛСЯ БЕЗ ОШИБОК, какая строчка выполнится СЛЕДУЮЩЕЙ, после запоминания файлового хендла?!?!	

;вывод сообщения об ошибке открытия файла
open_error:
	mov ah,9h
	lea dx, ErrorOpenFile
	int 21h
ответ - выполнится Ваш код, где выдаётся сообщение об ошибке!
решение: после присвоения mov HANDLE,ax ;запоминание файлового номера
делайте JMP на ту часть программы, где Вы сообщите, что файл открылся нормально и начнёте его обрабатывать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2011, 09:52   #3
Olya_lya
 
Регистрация: 21.10.2011
Сообщений: 6
По умолчанию

спасибо! получилось)

у меня такой вопрос: почему если файл открылся без ошибок, то почему он не обрабатывается дальше по коду, то есть закрытие файла? или у ассемблера есть какая-то особенность,что нужно совершать переход?
Olya_lya вне форума Ответить с цитированием
Старый 23.10.2011, 10:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
почему если файл открылся без ошибок, то почему он не обрабатывается дальше по коду, то есть закрытие файла? или у ассемблера есть какая-то особенность,что нужно совершать переход?
погодите-ка.
При чём здесь ассемблер?!

Хотите, поясню, ЧТО Вы написали на алгоритмическом (псевдоязыке) ?

1) Открыть файл.
2) Если ошибка перейти на пункт 4
3) сохранить хэндл открытого файла
4) выдать сообщение об ошибке
5) закрыть файл.

какой пункт выполнится после пункта 3? Ответ - пункт 4 - выдать сообщение об ошибке.
а какой пункт выполнится после пункта 4 - очевидно пункт 5 - закрыть файл.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2011, 10:42   #5
Olya_lya
 
Регистрация: 21.10.2011
Сообщений: 6
По умолчанию

понятно,спасибо.
Olya_lya вне форума Ответить с цитированием
Старый 23.10.2011, 19:44   #6
Olya_lya
 
Регистрация: 21.10.2011
Сообщений: 6
По умолчанию

при добавлении jmp оказывается ничего не изменилось:

.model tiny ; модель памяти
.stack 100h ; установка размера стека 100h
.data ; начало сегмента данных

cr equ 0dh ;возврат каретки
lf equ 0ah ;подача строки

FileName db '1.txt',0
ErrorOpenFile db cr,lf,'Error! Unable to open file!$'
OpenFile db cr, lf,'File is opened!$'

HANDLE dw ?

.code ;начало сегмента кода
main:
mov ax, @data ;настройка сегментного регистра
mov ds, ax ;устновка регистра ds на сегмент данных

;открытие файла
mov ah,3dh ;номер функции открытия файла
mov al,02h ;только чтение
lea dx, FileName ;ASCIIZ строка
int 21h ;открытие файла


jc open_error ;уход по ошибке
mov HANDLE,ax ;запоминание файлового номера
jmp open


;вывод сообщения об успешном открытии файла
open:
mov ah,9h
lea dx, OpenFile
int 21h

;вывод сообщения об ошибке открытия файла
open_error:
mov ah,9h
lea dx, ErrorOpenFile
int 21h


;закрытие файла
mov ah,3eh ;номер функции закрытия файла
mov bx,HANDLE ;файловый номер
int 21h ;закрытие файла

exit: ;выход из программы
mov ah,49h ;освобождение памяти
int 21h

mov ah,4ch ;выход
int 21h
end main

то есть даже файл открывается, то выдается два сообщения (успешное открытие и ошибка при открытии), а если файл отсутствует,то только ошибка.. почему так???

Последний раз редактировалось Olya_lya; 23.10.2011 в 19:47.
Olya_lya вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формула на ассемблере Vikenty Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 30.05.2010 00:54
Курсовая на ассемблере inhell Фриланс 1 07.06.2008 06:04