Вывод числа не более FFFF (65535)

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Гении АСМы, подскажите, как вывести на экран число из регистра в десятичной форме в заданной позиции экрана MSDOS? Помогите макросом!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это не максрос, а целая программа :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Romeo писал(а):Это не максрос, а целая программа :)
Есть семпл для анализа? Просто внятного ничего мне найти не удалось по этому поводу. Если это и правда очень сложно, в чем я не сомневаюсь (для меня по крайней мере :) ) . Может просто приведете примерчик макроса или процедурку по выводу числа из регистра на экран (без доп. наворотов)? Или хотя бы пока вывод цифры!

Нашел это (процедура печатает дес. число из регистра AX без знака):

Код: Выделить всё

print10	proc
	push	ax
	push	cx
	push	dx
	xor	cx,cx
p3&#58]

Сделал так:
[code]	.model small
	.stack 100h
	.386
	.data

stop 	macro
	mov	ah,8
	int	21h
endm

	.code

begin:

print10	proc
	push	ax
	push	cx
	push	dx
	xor	cx,cx
p3:	xor	dx,dx
	div	cs:p
	add	dx,48
	push	dx
	inc	cx
	cmp	ax,0
	jne	p3
	mov	ah,2
p4:	pop	dx
	int	21h
	loop	p4
	pop	dx
	pop	cx
	pop	ax
	ret
p	dw	10
print10	endp

	mov	ax,10
	call	print10

	stop
	mov	ah,4ch
	int 21h

end begin
Скомпилил так:
tasm x
tlink x

Запустил и получил ошибку:
16-разрядная подсистема MS-DOS
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения приложения нажмите "Закрыть"

Моя ось XP.
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Данный вопрос собственно не с потолка возник...
Дело было так:
Я сделал лабу по АСМу и весело со спокойной душей пошел в лабу, преподу показывать. Придя в лабу, понял, что моя прога в лабе ведет себя совсем по другому. Там тоже новые машинки P4, как и на компьютере, где было произведено данное творение. Правда, виндовс там 2000, а не XP, как у меня. В итоге запустив свою прогу на экране я увидел 2 зеленых квадрата по центру экрана (т.е. я не видел результата т.е. моих бегущих цифр совсем). Странно подумал я и запустил программу в режиме совместимости с W95. Кое что проявилось (например подписи, а цифры нет)
Ну и ушел я домой расстроенный, уверенный в своей правоте, правда преподу до балды, мол хочу, чтобы работало!
Проверял на др. компах, теже самые 2 квадрата по центру экрана (пустые). А у меня по прежнему на компе работает прога. Я даже изготовил видео доказательство (скачайте, пожалуйста, не пожалеете). В архиве:
1. Видеодоказательство того, что у меня на машине работает
2. Странно ведущий себя exe-ник
3. Соурц

Если помогать не охото, то хоть зацените видюху, кора и изврат страшные! Народ из аськи и мои однокурсники были в шоке, особенно после заявления, что если препод будет буянить, я предьявлю ему видео :D

http://xos.ru/mifi/xz.rar (163Кб)

В чем дело? Почему где-то работает, а где-то нет? Какие именно настройки?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

XGarik,

посмотрел видео.

не вижу прямых доказательств, что запущеный exe-шник - это ассемблер, а не паскаль, например.
berkut
Сообщения: 82
Зарегистрирован: 26 авг 2004, 19:07

жёстко ;) я рискнул запустить всё это дело на XP - не работает как ожидаеццо. но с ошибкой не вылетает
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

XGarik писал(а):
Скомпилил так:
tasm x
tlink x

Запустил и получил ошибку:
16-разрядная подсистема MS-DOS
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:0000 IP:0077 OP:f0 37 05 0e 02 Для завершения приложения нажмите "Закрыть"
Если запихнуть процедуру в твою программу, получаем ошибку компилятора:

**Error** test.asm(81) CS unreachable from current segment

Точно не помню, но могу предположить, что в модели "small" CS использовать нельзя.
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Oscar писал(а):XGarik,

посмотрел видео.

не вижу прямых доказательств, что запущеный exe-шник - это ассемблер, а не паскаль, например.
Согласен, завтра исправлюсь выложу обновление видео. Только на этот раз скомпилю прямо этот же файл TASMом! На глазах у всех и запущу его! Правда, смысла врать в такой ситуации я не вижу! К тому же на видео размер exe-шника меньше на поряк (1007 байт), чем в Паскале и др. языках!
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

XGarik,

значит так, по порядку:


1. тот бред, что я написал про CS - я был не прав,
прошу не обращать внимания, сто лет с асмом не возился


2. заголовок темы "Вывод числа не более FFFF (65535)"
немного неправильно отображает суть вопроса.

У тебя числа определены, как байт
(если я не ошибаюсь, это FFh, то есть 255).


3. программа у тебя НЕ ПРАВИЛЬНАЯ,
и какие бы ты доказательства не приводил, это ничего не изменяет.

На твоём компьютере она работает вообще по чистой случайности.

Смотрим сюда:

Код: Выделить всё

cprintN macro	num
	push	es
	mov	ax, ds
	mov	es, ax
	mov	al, num
	add	al, 30h
	int	10h
	pop	es
endm
Можно полюбопытствовать, какую именно функцию BIOSа ты пытаешься вызвать, запихнув в верхнюю часть регистра ax (ah - задаёт ф-цию) половину адреса смещения данных (ds) ?

----------

Проблема вывода числа на ассемблере - не есть тривиальная.

Та процедура, которую ты нашел, это делает таки правильно!
И она будет работать без сбоев, если ты метку входа в программу (begin:) перенесёшь после определения процедуры !!!

Алгоритм её такой:
делим число на основание численной системы (10 в нашем случае)
получаем остаток - последняя цифра числа
превращаем цифру в символ (ASCII character)
/*
кусок ASCII таблицы:
0 - 30h
1 - 31h
2 - 32h
...
9 - 39h
*/
запихиваем символ в стэк

так до тех пор, пока результат целочисленного деления не будет равен нулю (пока не закончатся цифры в числе)

затем выводим цифры (символы из стэка в обратном порядке) на экран

----------

в общем, вот тебе твой макрос:

Код: Выделить всё

cprintN macro num
	local	processdigit, print
	push	es

	xor dh, dh		; clear dh

	mov al, num
	mov cx, 0
	mov bl, 10

processdigit:
	
	div bl 			; divide ax=ah:al by value in bl. result in al, remainder in ah

	mov dl, al		; save result for compare

	mov al, ah		; move remainder digit from ah in al

	xor ah, ah		; clear ah

	add al, 30h		; convert digit to ASCII digit

	push ax			; save ASCII digit

	inc cx			; update number of digits to output


	cmp dl, 0		; if not last digit
	jne processdigit	; do it again


	mov ah, 02h 		; init DOS Fn 02H: display output
print:
	pop dx			; get ASCII digit
	int 21h			; display output
	loop print

	pop	es
endm

Ещё я добавил в начале и в конце clrscr для красоты ..


P.S. Виндовз у меня - 2000, так что совместимость с компьютерами в твоём универе должна быть нормальная.
Хоть и не думаю, что в этом может быть проблема.

P.P.S. Удачи тебе в учёбе! :-)
XGarik
Сообщения: 10
Зарегистрирован: 20 апр 2006, 12:59

Спасибо огромное и респект Oscar! Таких исчерпывающих знаниями и подробных ответов на форумах мне еще никогда не давали, за все время моего пребывания в интернете! Проверил на своем и другом компьютере, где ранее не работало, все просто идеально работает, как и требуется!
С меня пиво или сок (если не пьешь, как я), что пожелаешь! :D :D :D
Для затравки и коллекции приколов, вот новая видюха с полным процессом компиляции и работающая на моем компьютере!

http://xos.ru/mifi/x.rar (435Кб)

Еще раз спасибо всем тем, кто пробовал у себя этот изврат и рисковал своими машинами ради моего блага :mrgreen: :mrgreen: :mrgreen:
Ответить