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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2015, 16:07   #1
Pavel1234567
Новичок
Джуниор
 
Регистрация: 05.02.2015
Сообщений: 2
По умолчанию Помогите найти ошибку

Ребят помогите найти ошибку. Вводится десятичное число в консоль, затем переводится в шестнадцатиричное и выводится в консоль. Переводит не правильно. Подскажите в чем проблема?

Вот код:

Код:
.386
model flat,STDCALL
include wincon32.inc
extrn WriteConsoleA:PROC
extrn ReadConsoleA:PROC
extrn GetStdHandle:PROC
extrn ExitProcess:PROC
extrn FreeConsole:PROC
extrn AllocConsole:PROC
.data
num1 dd 0; переменная для счёта количества введённых символов
num dd 80; константа, определяющая максимальное количество считываемых символов из буфера ввода консоли
num2 dd 0
pe dd 0
mn dd 10; константа, содержащая основание целевой системы счисления
buf_v db 10 dup (0); массив для записи содержимого буфера ввода консоли

.code
start: call FreeConsole;
call AllocConsole;выделение программе собственной консоли
call GetStdHandle,STD_INPUT_HANDLE; вызов функции получения дескриптора стандартного устройства ввода

push 0 
push offset num1 
push num
push offset buf_v
push eax; после завершения работы функции getstdhandle в eax остался возвращённый ею дескриптор стандартного устройства ввода 
call ReadConsoleA; копирование строки символов из буфера консоли в массив
mov esi,0; обнуление индексного регистра для последующего обращения к элементам массива buf_v 
mov ebx, num1; копирование в регистр числа введённых символов
sub ebx,2; из счёта изымаются два последних введённых символа: возврата каретки и перевода строки
mov pe,ebx; сохранение числа реально введённых символов в переменной
mov ebx, num1; перекопирование

m0:
; цикл перевода кодов введённых чисел
mov al, buf_v[esi]; извлечение первого элемента массива, массив состоит из ascii-кодов введённых символов
sub eax, 30h; перевод кода символа во введённое с клавиатуры десятичное число
add num2, eax; прибавление первого разряда числа 
;mov num2,eax
mov eax, ebx; копирование условия конца цикла
cmp eax,pe; проверка условия
je m1
mov eax,num2; копирование промежуточного значения результата
mul mn; умножение промежуточного значения результата на основание системы счисления
mov num2,eax; запись нового промежуточного значения
inc esi; продвижение указателя массива
dec ebx; уменьшения счётчика введённых символов
mov eax,ebx;
jnz m0;проверка на конец счётчика

m1:
;цикл перевода числа в коды символов
mov esi,0; обнуление индексного регистра для последующего обращения к элементам массива buf_v 
mov eax, num2; копирование результа предыдущего цикла - введённогго с клавиатуры числа в шестнадцатеричной форме
sar ax, 4; сдвиг результата врпаво для получения первой тетрады
mov buf_v[esi],al; запись первой тетрады числа в бефер 
cmp al, 9; 
ja m2;если тетрада имеет значение большее, чем 9 то переход на метку

m2: 
mov al, buf_v[esi]; копирование
add al, 30h; прибавление базы ascii-символа, кодирующего арабские цифры
mov buf_v[esi],al;запись кода символа числа
inc esi; продвижение указателя массива
m2:
mov eax, num2; копирование
sal al, 4; получение втрой тетрады числа результата
cmp al, 10; проверка тетрады на равенство 10
mov buf_v[esi],al; 

m3:
call GetStdHandle,STD_OUTPUT_HANDLE; вызов функции получения дескриптора стандартного устройства вывода
call WriteConsoleA,eax,offset buf_v,pe, offset num,0; вывод на экран содежимого массива buf_v
call GetStdHandle,STD_INPUT_HANDLE
call ReadConsoleA,eax,offset buf_v,pe,offset num,0
call ExitProcess,0
end start

___
код нужно оформлять по правилам - с помощью тегов [CODE]
Модератор

Последний раз редактировалось Pavel1234567; 20.04.2015 в 18:01.
Pavel1234567 вне форума Ответить с цитированием
Старый 11.05.2015, 19:00   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..ниже, универсальная функция для перевода чисел в различные системы счисления, которую надо указать в регистре BX.
Код:
use16
org 100h

   mov  ax,9641     ; число для перевода в HEX
   mov  bx,16       ; система счисления
   call OutNumber   

OutNumber:
   pusha
   xor	cx,cx       ; счётчик цифр
isDiv:	            ; получаем последнюю цифру числа и запоминаем в стеке -------------|
   xor	dx,dx
   div	bx          ; делим на фактор
   push dx          ; запоминаем остаток в стеке
   inc	cx          ; считаем количество цифр
   or	ax,ax	    ; повторяем пока не 0
   jnz	isDiv

isOut:	            ; выводим число в нужном порядке в цикле --------------------------|
   pop	ax          ; снимаем число со-стека 
   cmp	al,09       ; если меньше 9, то DEC-коррекция не нужна
   jle	noHex
   add	al,7        ; DEC-коррекция
noHex:
   add	al,30h      ; ASCII-коррекция
   int	29h         ; вывод на экран
   loop isOut      
   popa
ret
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 11.05.2015, 19:51   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
mov esi,0; обнуление индексного регистра для последующего обращения к элементам массива buf_v 
mov ebx, num1; копирование в регистр числа введённых символов
sub ebx,2; из счёта изымаются два последних введённых символа: возврата каретки и перевода строки
mov pe,ebx; сохранение числа реально введённых символов в переменной
mov ebx, num1; перекопирование

m0:
; цикл перевода кодов введённых чисел
mov al, buf_v[esi]; извлечение первого элемента массива, массив состоит из ascii-кодов введённых символов
sub eax, 30h; перевод кода символа во введённое с клавиатуры десятичное число
add num2, eax; прибавление первого разряда числа 
;mov num2,eax
mov eax, ebx; копирование условия конца цикла
cmp eax,pe; проверка условия
je m1
mov eax,num2; копирование промежуточного значения результата
mul mn; умножение промежуточного значения результата на основание системы счисления
mov num2,eax; запись нового промежуточного значения
inc esi; продвижение указателя массива
dec ebx; уменьшения счётчика введённых символов
mov eax,ebx;
jnz m0;проверка на конец счётчика
на мой взгляд тут какая-то херня происходит. сколько разрядов не введи использоваться будут только два старших (это если не думать про числа меньше 10)

Последний раз редактировалось f.hump; 11.05.2015 в 19:53.
f.hump вне форума Ответить с цитированием
Старый 23.05.2015, 23:03   #4
spolyr
Пользователь
 
Регистрация: 30.03.2015
Сообщений: 17
По умолчанию

Есть у меня такая в арсенале, программа,
на входе десят, шест,двоич
на выходе тоже самое, исходник если что кину
spolyr вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите найти ошибку лена99 Паскаль, Turbo Pascal, PascalABC.NET 10 21.12.2014 20:40
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10
помогите найти ошибку DelMaker JavaScript, Ajax 2 19.05.2009 18:27
Помогите найти ошибку (С++) Alex1991 Помощь студентам 1 11.04.2009 15:19