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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2009, 17:29   #1
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию Не желает работать правильно программа из Питера Абеля

Снова здравствуйте. У меня опять не работает программа из книги Питера Абеля. В этот раз компилировал как положено)).
Она должна запрашивать ввод имени с клавиатуры, после чнего выводить его на экран и подавать звуковой сигнал.
Код:
TITLE	AO8CTRNM (EXE)	Ввод имен с клавиатуры, вывод их в центре экрана, подача звукового сигнала
	.MODEL	SMALL
	.STACK	64
	.DATA
PARLIST	LABEL	 BYTE	;Список параметров имен:
MAXNLEN	   DB	20	;  максимальная длина имени
ACTULEN	  DB	?	;  количество введенных символов
KBNAME	  DB	21 DUP(' ');  введенное имя
PROMPT	  DB	'Name? ', '$' ;Запрос
;-----------------------------------------------
	.CODE
.386    		;Требеуется для МОVZX
A10MAIN	PROC	FAR
	MOV	 AX,@DATA	;Инициализация
	MOV	 DS,AX           ;  сегментных
	MOV	 ES,AX           ;  регистров
;	mov	 ax,0007h ;это я пробывал установить видеорежим, но толку от этого мало
;	int	 10h
	CALL	 Q10CLEAR        ;Очистка экрана
A20:	
	MOV	 DX,0000         ;Установка курсора в 00.00
	CALL	 Q20CURSOR
	CALL	 B10INPUT        ;Организация ввода имени
	CALL	 Q10CLEAR        ;Очиска экрана
	CMP	 ACTULEN,00      ;Введено ли имя?
	JE	 A30             ;Если нет, то выход
	CALL	 C10CENTER       ;Установить сигнал, и выполнить центровку
	CALL	 D10DISPLY       ;Вывести имя
	JMP	 A20             ;Повторить
A30:
	MOV	 AX,4C00H        ;Завершить работу
	INT	 21H
A10MAIN	 ENDP
;	Вывод приглашения и восприятие ввода с клавиатуры:
;	--------------------------------------------------
B10INPUT	 PROC	NEAR
	PUSH	 AX		;Сохранем используемые
	PUSH	 DX      	;  регистры
	MOV	 AH,09H          ;Запрос на вывод на экран
	LEA	 DX,PROMPT       ;  приглашения пользователя
	INT	 21H
	MOV	 AH,0AH    	;Запрос ввода с клавиатуры
	LEA	 DX,PARLIST      ;Указание адреса PARLIST
	INT	 21H
	POP	 DX              ;Восстановление значений
	POP	 AX              ;  регистров
	RET
B10INPUT	ENDP
			;Установить сигнал
			;  и выполнить центровку
;			-------------------------
C10CENTER	 PROC	NEAR
	MOVZX	 BX,ACTULEN	;Заменить 0Dh на 07 
	MOV	 KBNAME[BX],07
	MOV	 KBNAME[BX+1],'$';Установить ограничитель вывода
	MOV	 DL,ACTULEN      ;Определить центральный столбец:
	SHR	 DL,1            ;  разделить длину строки на 2
	NEG	 DL              ;  изменить знак
	ADD	 DL,40           ;  прибавить 40
	MOV	 DH,12           ;Центральный столбец
CALL	 Q20CURSOR               ;Установить курсор
		RET
C10CENTER	 ENDP
;			Вывести имя в центр экрана
;			---------------------------
D10DISPLY	 PROC	NEAR
	MOV	 AH,09H
	LEA	 DX,KBNAME
	INT	 21H
	RET
D10DISPLY	 ENDP
;			Очистка экрана и установка атрибутов
;			------------------------------------
Q10CLEAR	 PROC	NEAR
	PUSHA
	MOV	 AX,0600H	;Запросить прокрутку экрана
	MOV	 BX,30		;Арибут цвета
	MOV	 CX,0000         ;От 00,00
	MOV	 DX,184FH        ;До 24,79	
	INT	 10H
	POPA
	RET
Q10CLEAR	ENDP
;			Установка курсора в столбец и строку
;			------------------------------------
Q20CURSOR	PROC	NEAR
	MOV	 AH,02H		;Запрос на установку курсора
	MOV	 BH,00           ;Страница 00
	INT	 10H
	RET
Q20CURSOR	ENDP
	END	 A10MAIN
Все компилируется, но когда запускаю (из FARa) вижу:
1. Если FAR развернут на весь экран, то все становится черным. Строки приглашения 'Name? ' нет. Я начинаю вводить символы, при этом ничего не происходит. Когда нажимаю Ввод, то подается звуковой сигнал (ну так и должно быть), но символы так и не выводятся на экран.
2. Если FAR не развернут на весь экран, то окошко становится черным и на нем есть курсор (приглашения так же нет). Если вводить символы, то курсор двигаетя, а то, чего я ввожу не видно. После нажатия Ввода звуковой сигнал НЕ подается.
И так до тех пор, пока не введу последнюю строку (так и должно быть).
Запускал под отладчиком, но я даже не знаю на что обратить внимание. Заметил вот что: LEA DX,PROMPT в процедуре B10INPUT заменяется на LEA DX,[0000] (где, как я догадываюсь, [0000] - смещение в сегмент данных. По этому адресу находится мой PROMPT). Это нормально, что смещение равно нулю? Я же его в самом конце инициализировал. И когда сразу после этого вызываю прерывание 21н, то отладчик пишет что то красными буквами, но так быстро, что я даже не успеваю прочитать.
Хух, вроде написал все что знаю, подскажите пожалуйста, как это все заставить работать?

Последний раз редактировалось bullvinkle; 27.02.2009 в 17:41. Причина: не работает табуляция.....
bullvinkle вне форума Ответить с цитированием
Старый 27.02.2009, 18:56   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Почему оба сегмента ES и DS адресуют одну и туже память? Может
mov ax,0B800h
mov es,ax
? Или я что то не понимаю?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 27.02.2009, 19:09   #3
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Ivan_32, исправил как ты сказал, но программа работает так же.
Может есть еще какие то причины?
bullvinkle вне форума Ответить с цитированием
Старый 27.02.2009, 20:22   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

У меня есть серьёзные подозрения, что вы чёрными буквами по чёрному фону рисуете. Попробуйте так:

Код:
Q10CLEAR	 PROC	NEAR
	PUSHA
	MOV	 AX,0600H	;Запросить прокрутку экрана
	MOV	 BH,30		;Арибут цвета
	MOV	 CX,0000         ;От 00,00
	MOV	 DX,184FH        ;До 24,79	
	INT	 10H
	POPA
	RET
Q10CLEAR	ENDP
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 27.02.2009 в 20:24.
Ulex вне форума Ответить с цитированием
Старый 28.02.2009, 11:11   #5
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Вот так работает! Спасибо.
bullvinkle вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно работает программа из книги Абеля. bullvinkle Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 23.02.2009 10:56
Программа в Delphi не хочет работать. (Одномерный массив). Kawun Помощь студентам 9 14.11.2008 16:26
Как работать с TCanvas - на PaintBox1 программа должна рисовать полигон Михаил Юрьевич Общие вопросы Delphi 16 04.01.2008 15:31
как правильно работать с массивом TStrings Air Общие вопросы Delphi 6 19.12.2007 17:55
Посмотрите пожалуйста правильно ли написана программа,если нет укажите ошибку. Викулька Помощь студентам 1 10.12.2007 22:49