Помощь - Поиск - Пользователи - Календарь
Полная версия: Перевод чисел из 10-ной в 15-ричную систему
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Neon6868
Задание: Необходимо написать программу для перевода числа из 10-ной в 15-ричную систему счисления. Число в 10-ной системе ввести с клавиатуры, число надо вводить максимум из 4 цифр. Надо заменить числа при выводе следующим образом: 10-A, 11-B, 12-C, 13-D, 14-E.

Программа не правильно работает, если числа больше 200! Например число 300 неправильно переводит! Подскажите плиз почему?

Программа:

model small
stack 100h
.data
tekst db "Vvedite chislo ne bolee 4-x cifr:",'$' ;сообщение ввести число
string dw 4 dup (0) ;массив, который будет содержать 4 цифры числа
len_string =$-string ;длина массива
delitel db 15 ;основание новой системы счисления
mas db 4 dup (0) ;массив из 4 эл-тов, содержащих число 10, который будет содержать цифры числа в новой СС
chislo dw 0 ;число в 10-ной СС
ten db 10
tekst2 db "Chislo v 15-richnoi SS:",'$'
ost dw 0
.code
start:
mov ax,@data
mov ds,ax

;выводим сообщение о вводе числа
mov ah,09h
mov dx,offset tekst
int 21h

;вводим с клавиатуры число
mov bx,0 ;номер страницы
mov cx, len_string ;записываем количество повторений ввода символа
lea dx,string ;записываем символы в массив string
mov ah,3fh ;номер функции
int 21h
sub ax,2
mov bx,ax
;получаем из цифр число
mov si,0 ;номер элемента массива string
cikl1:
cmp si,bx ;сравниваю цифру числа с числом 10, чтобы проверить что была введена цифра с клавиатуры
jnb m1 ;если равно, то выходим из цикла
mov ax,chislo ;записываю число в 10-ной СС в ах
mul ten ;умножаю число на 10
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
add ax,string[si] ;прибавляю к ax цифру числа
mov ah,0
mov chislo,ax ;записываю результат в chislo
inc si ;увеличиваю номер элемента на 1
jmp cikl1 ;если меньше, то переходим на cikl1

m1:
;перевод в 15-ричную СС
mov si,0
cikl2:
mov ax,chislo ;записываю в ах число, которое буду делить
div delitel ;делю число в 10-ной СС на 15
mov mas[si],ah
inc ost
mov ah,0
mov chislo,ax
inc si
cmp chislo,0
jne cikl2

;замена цифр остатков, если они от 10 до 14, на буквы
mov si,0
zamena:
cmp si,ost
jnb vivod
cmp mas[si],10
jb net
add mas[si],55
inc si
jmp zamena
net:
add mas[si],30h
inc si
jmp zamena
;вывод символов на экран
vivod:
mov ah,09h
mov dx,offset tekst2
int 21h

mov si,4
mov cx,ost
mov ah,02h
cikl3:
cmp mas[si],0
jne m2
dec si
jmp cikl3
m2:
mov dl,mas[si]
int 21h
dec si
loop cikl3

mov ax,4c00h
int 21h
end start

Despot
дааааааа..... походу форум мёртвый...
Ну что, так никто и не подскажет парню что делать?
Как твой len_string работает?
Neon6868
Цитата(Despot @ 19.05.2008 18:15) *

дааааааа..... походу форум мёртвый...
Ну что, так никто и не подскажет парню что делать?
Как твой len_string работает?


Спасибо Despot ,я уже разобрался...
Despot
Цитата(Neon6868 @ 22.05.2008 17:05) *

Спасибо Despot ,я уже разобрался...


ну как работает то?) Просто интересно)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.