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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 19:20   #1
-=Andriushka=-
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 91
По умолчанию Программа для перевода из 4-ичной СС в 5-ичную (с ограничением ввода цифр)

Код:
.model small
.stack 100h
.data
DSEG SEGMENT
pr_nmbr db 'Введите 4-ричное число: $'
res_msg db 0ah,0dh,'Результат: $'
buf     label byte      ;Буфер для ввода 4-ричного числа.
max     db 9            ;Максимум 8 символов + 1 для 0dh.
lnt     db ?            ;Число введенных символов.
nmbr    db 9 dup(?)     ;Введенное 4-ричное число.
DSEG ENDS
 
SSEG SEGMENT STACK
db 256 dup(0)
SSEG ENDS
 
CSEG SEGMENT
assume cs:CSEG,ds:DSEG
start:  mov ax,DSEG
        mov ds,ax
 
;Вводим 4-ричное число.        
 
        mov ah,09h
        mov dx,offset pr_nmbr
        int 21h
 
        mov ah,0ah
        mov dx,offset buf
        int 21h
 
;Преобразуем его в десятичное.
 
        xor ax,ax
        xor bx,bx       ;Индекс цифры в nmbr4.
        xor ch,ch
        mov cl,lnt      ;Число цифр.
cnvrt:  mov dx,4
        mul dx
        mov dl,nmbr[bx] ;Берем следующий символ.
        sub dl,30h      ;Преобразуем его в цифру.
        add ax,dx       ;Добавим к числу.
        inc bx          ;В bx индекс следующего символа.
        loop cnvrt
 
;Преобразуем в 5-ричное.
 
        xor cx,cx
        mov bx,5        ;Будем делить на основание 5.
nxt:    xor dx,dx
        div bx
        or ax,0         ;Больше не делится?
        jz lst
        push dx         ;Запомним остаток в стеке.
        inc cx
        jmp nxt
lst:    push dx         ;Последний остаток.
        inc cx
 
;Вывод результата на экран.
 
        mov ah,09h
        mov dx,offset res_msg
        int 21h
        mov ah,02h
outp:   pop dx
        add dl,30h
        int 21h
        loop outp
 
        mov ax,4c00h
        int 21h
CSEG ENDS
end start
вот такая есть программка...она должна переводить из 4-ичной СС в 5-ичную...но почему то считает не так маленько и разрешает вводить все цифры хотя должны вводиться только 0123...подскажите пожалуйста как исправить эти недоразумения?

Последний раз редактировалось Stilet; 03.10.2011 в 08:18.
-=Andriushka=- вне форума Ответить с цитированием
Старый 03.10.2011, 07:28   #2
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

Преобразовании в десятичное число, вернее в двоичный код в котором производятся многие математические операции?
Если так, то эта часть должна работать по следующему алгоритму, известный из информатики, допустим пример:
123->3*4^0+2*4^1+1*4^2
По мой-му смотреть надо там, постараюсь завтра сказать в чём дело.
wanes101 вне форума Ответить с цитированием
Старый 04.10.2011, 10:59   #3
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

У тебя отличные алгоритмы, вчера смотрел твою программу в отладчике всё правильно.
Я так понимаю весь глюк, что программа просто вылетает.
Дело это из-за следующего: просто программа после перевода из одной сс в другую, после вывода значения вылетает т.к. дальше нет никаких действий, сделай ввод с клавиатуры. Для этого можно после расчётов вставить следующие:

mov ah,0ah
mov dx,offset buf
int 21h
Или полностью код:
Цитата:
.model small
.stack 100h
.data
DSEG SEGMENT
pr_nmbr db 'Введите 4-ричное число: $'
res_msg db 0ah,0dh,'Результат: $'
buf label byte ;Буфер для ввода 4-ричного числа.
max db 9 ;Максимум 8 символов + 1 для 0dh.
lnt db ? ;Число введенных символов.
nmbr db 9 dup(?) ;Введенное 4-ричное число.
DSEG ENDS

SSEG SEGMENT STACK
db 256 dup(0)
SSEG ENDS

CSEG SEGMENT
assume cs:CSEG,ds:DSEG
start: mov ax,DSEG
mov ds,ax

;Вводим 4-ричное число.

mov ah,09h
mov dx,offset pr_nmbr
int 21h

mov ah,0ah
mov dx,offset buf
int 21h

;Преобразуем его в десятичное.

xor ax,ax
xor bx,bx ;Индекс цифры в nmbr4.
xor ch,ch
mov cl,lnt ;Число цифр.
cnvrt: mov dx,4
mul dx
mov dl,nmbr[bx] ;Берем следующий символ.
sub dl,30h ;Преобразуем его в цифру.
add ax,dx ;Добавим к числу.
inc bx ;В bx индекс следующего символа.
loop cnvrt

;Преобразуем в 5-ричное.

xor cx,cx
mov bx,5 ;Будем делить на основание 5.
nxt: xor dx,dx
div bx
or ax,0 ;Больше не делится?
jz lst
push dx ;Запомним остаток в стеке.
inc cx
jmp nxt
lst: push dx ;Последний остаток.
inc cx

;Вывод результата на экран.

mov ah,09h
mov dx,offset res_msg
int 21h
mov ah,02h
outp: pop dx
add dl,30h
int 21h
loop outp
; делаем ввод с клавиатуры
mov ah,09h
mov dx,offset pr_nmbr
int 21h
Цитата:
mov ax,4c00h
int 21h
CSEG ENDS
end start
Цитата:
разрешает вводить все цифры хотя должны вводиться только 0123...подскажите пожалуйста как исправить эти недоразумения?
А этим прерыванием и не ограничишь ввод с клавиатуры, можно вводить и символы.

Последний раз редактировалось wanes101; 04.10.2011 в 11:02.
wanes101 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать прогу для перевода римских цифр phreaker228 Помощь студентам 2 05.06.2011 14:32
"Число в p-ичной системе счисления. Перевести число в q-ичную систему" и не только :) Zinder Паскаль, Turbo Pascal, PascalABC.NET 4 10.04.2010 14:20
программа для перевода из инфиксной формы записи в постфиксную Diana888 Помощь студентам 0 01.10.2009 23:15
программа для перевода из инфиксной формы записи в постфиксную Diana888 Общие вопросы C/C++ 0 01.10.2009 23:06
Программа для перевода из 16-ной с/c в 2-ную fult Паскаль, Turbo Pascal, PascalABC.NET 0 05.05.2009 21:57