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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2009, 17:44   #1
Strogg
Пользователь
 
Аватар для Strogg
 
Регистрация: 19.03.2009
Сообщений: 13
По умолчанию Ввод и вывод числа

1. Почему не получается вывод введённого числа?
2. Есть ли более оптимальное решение?

Код:
masm
model small
.data	
mes1	db	'Input first  decimal number:  $'
mes2	db	'Input second decimal number:  $'
mes3	db	'Hex  form  of first  number:  $'
mes4	db	'Hex  form  of second number:  $'

nline       db      0Dh, 0Ah, '$'
tabl	db       48 dup (0),   0,1,2,3,4,5,6,7,8,9,  198 dup (0)
hex0       db      '0$'
hex1	db	'1$'
hex2	db	'2$'
hex3	db	'3$'
hex4       db         '4$'
hex5	db	'5$'
hex6	db	'6$'
hex7	db	'7$'
hex8       db          '8$'
hex9	db	'9$'
hexA	db	'A$'
hexB	db	'B$'
hexC       db         'C$'
hexD	db	'D$'
hexE	db	'E$'
hexF	db	'F$'
temp    db      0
.stack 256h  			
	mov     ax,@data	             ; инициализация регистра ds ...
	mov	ds,ax		; ... через регистр ax
	lea	bx,tabl		; загрузить относительный адрес псевдо-таблицы кодов
             mov     ax,3                      ; пересылаем в ax номер функции - очистки экрана
             int     10h                         ; вызываем необходимое прерывание
	mov	ah,9                    ; пересылаем в ah номер функции - вывод строки на экран
	mov	dx,offset mes1      ; пересылаем в dx смещение первого байта строки mes1 в сегменте данных
	int	21h		; вызываем необходимое прерывание
	xor	ax,ax		; очищаем регистр ах
	mov	ah,1h		; пересылаем в ah номер функции - ввод символа в консоли
	int	21h		; вызываем необходимое прерывание
	xlat			; трансляция байта номер ах из псевдо-таблицы кодов в регистр ах
	mov	dl,al                    ; сохраняем в dl промежуточный результат
	shl	dl,4                     ; сдвигом на четыре бита влево освобождаем место в dl для следующей цифры
	xor	ax,ax		; очищаем регистр ах
	mov	ah,1h		; пересылаем в ah номер функции - ввод символа в консоли	
	int	21h		; вызываем необходимое прерывание
	xlat			; трансляция байта номер ах из псевдо-таблицы кодов в регистр ах
	add	al,dl		; теперь в al введённое десятичное число
        mov     temp, al                      ; сохраняем содержимое al по адресу temp
        mov	ah,9                    ; пересылаем в ah номер функции - вывод строки на экран
        mov	dx,offset nline       ; пересылаем в dx смещение первого байта строки nline в сегменте данных
        int	21h                                  ; вызываем необходимое прерывание
        mov	dx,offset mes2      ; пересылаем в dx смещение первого байта строки mes2 в сегменте данных
        int	21h		             ; вызываем необходимое прерывание
	xor	ax,ax		; очищаем регистр ах
	mov	ah,1h		; пересылаем в ah номер функции - ввод символа в консоли
	int	21h		; вызываем необходимое прерывание
	xlat			; трансляция байта номер ах из псевдо-таблицы кодов в регистр ах
	mov	dl,al                    ; сохраняем в dl промежуточный результат
	shl	dl,4                     ; сдвигом на четыре бита влево освобождаем место в dl для следующей цифры
	int	21h		; вызываем необходимое прерывание
	xor	ax,ax		; очищаем регистр ах
	mov	ah,1h		
	int	21h		
	xlat			
	add	al,dl	             
             push       ax             
        mov     al, temp      

        xor     cx, cx

        shr	al, 4
	mov	cx, 2

comp:
        cmp     al, 00h
           je	l0

        cmp     al, 01h
	je	l1

        cmp	al, 02h
	je	l2

        cmp     al, 03h
	je	l3

        cmp	al, 04h
	je	l4

        cmp     al, 05h
	je	l5

        cmp	al, 06h
	je	l6

        cmp     al, 07h
	je	l7

        cmp	al, 08h
	je	l8


        cmp     al, 09h
	je	l9

        cmp	al, 0Ah
	je	lA

        cmp     al, 0Bh
	je	lB
        cmp	al, 0Ch
	je	lC


        cmp     al, 0Dh
	je	lD

        cmp	al, 0Eh
	je	laE

        cmp     al, 0Fh
	je	lF



l0:	mov	dx,offset hex0
             jmp     outp
l1:	mov	dx,offset hex1
             jmp     outp
l2:	mov	dx,offset hex2
             jmp     outp
l3:	mov	dx,offset hex3
             jmp     outp
l4:	mov	dx,offset hex4
             jmp     outp
l5:	mov	dx,offset hex5
             jmp     outp
l6:	mov	dx,offset hex6
             jmp     outp
l7:	mov	dx,offset hex7
             jmp     outp
l8:	mov	dx,offset hex8
             jmp     outp
l9:	mov	dx,offset hex9
             jmp     outp
lA:	mov	dx,offset hexA
             jmp     outp
lB:	mov	dx,offset hexB
             jmp     outp
lC:	mov	dx,offset hexC
             jmp     outp
lD:	mov	dx,offset hexD
             jmp     outp
laE:	mov	dx,offset hexE
             jmp     outp
lF:	mov	dx,offset hexF
             jmp     outp

outp:
        mov	ah,9
         int 	21h
        mov	ah,9
        mov	dx,offset nline
        int	21h

	pop	ax
	shl	al,8
	shr	al,12
        dec	cx
        jz    	stop
        jmp	comp
        

stop:	mov	ax,4c00h	; 
	int	21h		; 
 main   endp                    ;
 end    main	                ;

Последний раз редактировалось Strogg; 23.03.2009 в 17:50.
Strogg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форматный ввод/вывод Lazio Общие вопросы C/C++ 4 03.03.2009 19:29
Ввод и вывод Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 18:00
файловый ввод/вывод kot111 Общие вопросы C/C++ 1 04.02.2008 17:45
Асинхронный ввод/вывод Pblog Обсуждение статей 0 27.05.2007 02:13