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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2016, 21:26   #1
morhaint
Новичок
Джуниор
 
Регистрация: 30.08.2015
Сообщений: 1
Вопрос Выводит число задом наперед

Помогите найти ошибку. Есть код перевода числа в различные системы счисления в графическом режиме. При выводе выводит число задом наперед, например, ввел 543, на выходе получается 345. Хотя вроде делал через стек и все должно быть нормально. В текстовом режиме работает правильно.

.model tiny
.code
org 100h
start:

mov ax,4F02h ; videoregim 640*480
mov bx,12h
int 10h

;ввод числа
mov si,10 ;работаем с десятичной нотацией
mov di,0
@aa:
; вводим число до нажатия клавиши "ВВОД"
mov ah,01h
int 21h
cmp al,13 ; проверяем нажатие клавиши "ВВОД"
jz a1 ; если клавиша нажата, то переходим на конец
; обработки ввода числа
; иначе выполняем следующие 8 пунктов

sub al,'0' ; из кода ASCII получаем цифру
xor ah,ah ; теперь значение ах равно значению al
mov cx,ax ; копируем ах в сх
mov ax,di ;записываем в ах введенное до текущей цифры число
mul si ;умножаем его на 10, переходя тем самым в текущий
;разряд
add ax,cx ;добавляем к числу текущую цифру
mov di,ax ;сохраняем текущее число в di
jmp @aa ; переходим на обработку следующего разряда
a1:
mov num,di ; сохраняем окончательное значение введенного числа
; в переменной "num"

mov ax,num
xor bx,bx
mov bx,32
call OutInt


ret
OutInt proc near

xor cx, cx
oi2:
xor dx,dx
div bx
push dx
inc cx
test ax, ax
jnz oi2
; Теперь приступим к выводу.
oi3:
mov ah, 09h
mov bl,1
mov bh,0

pop dx
mov al,dl
cmp al,9
jbe oi4
add al,7
oi4:
add al, '0'
int 10h
; Повторим ровно столько раз, сколько цифр насчитали.
loop oi3
ret
OutInt endp
; задание констант
num dw '0'
end start
morhaint вне форума Ответить с цитированием
Старый 29.05.2016, 22:08   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

morhaint, скачиваешь отладчик, открываешь в нём свою программу и смотришь на регистры. Ошибки сразу на лицо.. Если лень возиться с отладчиком, то можешь использовать такие функции ввода/вывода чисел в различных системах счислений:
Код:
;*********************************************************************
ASC2HEX:                 ; Процедура переводит символы в число
   xor   cx,cx           ; Вход:  ВХ = система счисления
@@:                      ; Выход: СХ = число
   xor   ax,ax           ;
   int   16h             ; ждём ввод
   cmp   al,13           ; Enter заканчивает ввод
   jz    stop            ;
   cmp   al,'0'          ; фильтр цифр
   jb    @b              ;
   cmp   al,'9'          ;
   ja    @b              ;
   int   29h             ; покажем ввод на экране
   and   ax,0fh          ; перевод символа в число
   cmp   ax,bx           ; тест ввода с системой счисления
   jae   overlow         ; больше/равно - ошибка
   xchg  ax,cx           ;
   xor   dx,dx           ;
   mul   bx              ;
   add   cx,ax           ; иначе: число в СХ
   jmp   @b              ; сл.символ..
overlow:                 ;
   jmp   error           ; на обработчик ошибки
stop:                    ;
RET                      ;

;*********************************************************************
HEX2ASC:                 ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   xor   cx,cx           ; счётчик разрядов числа
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ; делитель
   push  dx              ; остаток будет числом
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ; выводим его на экран
   cmp   al,9            ;
   jle   noHex           ;
   add   al,7            ;
noHex:                   ;
   add   al,30h          ;
   int   29h             ;
   loop  isOut           ;
   popa                  ;
RET                      ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каждое слово строки вывести задом наперед DAn9I Общие вопросы C/C++ 4 14.04.2014 22:51
Не выводит нужное число Mike26rus Общие вопросы C/C++ 7 09.12.2011 16:36
Текст "Задом наперед" Irzhi Microsoft Office Excel 6 15.06.2011 18:55
Программа Вводит символьную строку и число N и выводит строку, состоящую из первых N символов (С++) Yulai Помощь студентам 1 11.05.2009 11:39
Помогите сделать программу c выводом строки задом наперед(Pascal) Batman10000 Помощь студентам 2 14.12.2008 17:54