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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2009, 21:14   #1
Alasmus
 
Регистрация: 29.10.2009
Сообщений: 3
По умолчанию Assembler. Подпрограмма на вывод значений.

Приветствую! Пришел я к вам с просьбой о помощи) а помощь нужна в следующем:
"Написать на ассемблере подпрограмму вывода на экран значения регистра AX в десятичной системе счисления без использования прерываний DOS и BIOS (для текстового режима видеокарты, для процессора Intel 8086) ", т.е. кто-либо пишет программу, решает забить в AX, например, 1234 и потом вызвать подпрограмму для перевода числа в десятичную систему и вывода его на экран(без прерываний, повторюсь)) Сразу оговорюсь, что на изучение Ассемблера была всего неделька и профессионалом я за это время не стал) вот что получилось из трудов:

Код:
mov ax,0B800h		
mov es,ax                         
mov di,0				

mov es:[di],ax 

std

mov	cx,10          		
Repeat:
	xor	dx,dx          	
	div	cx             
                                       	
	xchg	ax,dx          	
	add	al,'0'         	
	stosb                	
	xchg	ax,dx         	
	or	ax,ax          	
	jne	Repeat
и далее сами вопросы. Если пользователь вносит в AX число, то использовать его уже нельзя чтобы не "испортить", т.е. надо воспользоваться push и pop, насколько я понимаю? push ax и далее код подпрограммы. Следующее это цикл. строка "or ax,ax" была написана с расчетом того, что она будет сравнивать AX нулем и далее если не равно, то запускать цикл заново. как мне объяснили, она не проверяет, а обнуляет, так что в цикле нет смысла) не могу понять...и последнее это stosb, нужно ли в тексте это, и как использовать?

Выражаю огромную признательность заранее! И прошу прощения за кучу текста)
Alasmus вне форума Ответить с цитированием
Старый 29.10.2009, 21:33   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Чтобы не "испортить" число, которое в AX в Вашем коде используется
Код:
xchg ax, dx
...
xchg ax, dx
так что тут всё нормально.
stosb кладёт байт из al по адресу, что хранится в di и увеличивает его(адрес, что в di) на 1, так что оно должно там быть.
or ax, ax не обнуляет ax, тот кто Вам это сказал ошибся... Так что здесь тоже всё в порядке.
В принципе, на первый взгляд, код рабочий, только одно замечание, если я правильно помню, то в видеопамяти, что по адресу 0B800h идёт 1 байт - отображаемый символ и второй за ним - атрибут символа.
То есть после stosb нужно дописать ещё inc di

P.S.
Насчёт не испортить число, неверно понял, что именно надо ) Да, можно использовать push ax перед кодом и pop ax перед ret

Последний раз редактировалось netrino; 29.10.2009 в 21:46.
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 21:52   #3
Alasmus
 
Регистрация: 29.10.2009
Сообщений: 3
По умолчанию

Благодарю, особенно на счет inc di! =) если будут еще замечания, то с удовольствием вычитаю)
Alasmus вне форума Ответить с цитированием
Старый 29.10.2009, 22:08   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да, не сразу заметил, по поводу std, тут не подходит по алгоритму его использовать.
В общем, можно так переписать:
Код:
mov ax,0B800h		
mov es,ax                         
mov di,0				

; mov es:[di],ax  // Вот это я не понял зачем, думаю можно без этого.

mov	bx,10          		
mov      cx, 0
Repeat:
	xor	dx,dx          	
	div	bx             
                                        	
	add	dl,'0'         	
	push     dx           
           inc        cx 	
	or	ax,ax          	
	jne	Repeat

WriteToScreen:
           pop       ax
           stosb
           inc        di
           dec       cx
           jnz        WriteToScreen
Только не проверял, может ошибки есть, давно на асме не кодил )
netrino вне форума Ответить с цитированием
Старый 29.10.2009, 22:19   #5
Alasmus
 
Регистрация: 29.10.2009
Сообщений: 3
По умолчанию

Спасибо) попробуем!
Alasmus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод значений из скрипта на страничку Salomon HTML и CSS 3 17.03.2009 15:42
выборка нужных значений, вывод AZaharov Microsoft Office Excel 19 17.10.2008 12:22
Вывод значений уравнения прямой Иллидан Microsoft Office Excel 4 17.09.2008 09:41
графический вывод значений массива vitalik007 Помощь студентам 6 21.10.2007 20:34