Консультация № 182458
10.03.2011, 17:24
250.00 руб.
0 13 2
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, со следующей задачкой:

Написать на языке ассемблера программу, реализующую некоторый алгоритм в соответствии с полученным заданием: Дано натуральное число n. Сколько в нем цифр?

Прошу написать, насколько это возможно, подробное описание всех действий!

Обсуждение

давно
Посетитель
7438
7205
10.03.2011, 17:57
общий
Число вводим или задаем в теле программы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.03.2011, 19:12
общий
для строгости нужно еще уточнить систему счисления
говорить о количестве цифр можно только в контексте конкретной системы
например 143 decimal (3 цифры) = 8F hex (2 цифры) = 217 oct (3 цифры) = 10001111 bin (8 цифр)
Неизвестный
10.03.2011, 19:19
общий
Адресаты:
Лысков Игорь Витальевич, хороший вопрос. Этого я и не знаю. Давайте попробуем тот вариант что проще.
Alex_S, я не знаю подробностей. Всё что я знаю о выполнении задачки - это то что я указал в условии
Неизвестный
10.03.2011, 20:18
общий
Обычно в таких заданиях используются двоично десятичные цифры (BCD). Надо бы знать максимальный размер числа, в байтах?
Если число 2х-8х байтовое, это один алгоритм, а если оно много разрядное (16 и более байт), то это совсем другой алгоритм!
давно
Старший Модератор
31795
6196
10.03.2011, 23:09
общий
это ответ
Здравствуйте, Попов Андрей Александрович!

Смотрите приложение.
Цитата: 263725
Давайте попробуем тот вариант что проще.

Код числа задается в программе. Компилятор TASM 2+.
вопросы задавайте в минифоруме.
Удачи!

Приложение:
model tiny
.186
.code
org 100h
n equ 12345
begin:
mov ax,n;загружаем число
call OutNumber;вызываем вывод
mov al,'=';вывод разделителя
int 29h;на экран
mov ax,di;востанавливаем количество цифр
call OutNumber;вызываем вывод
xor ax,ax;ждем любую клавишу
int 16h;с помощью BIOS
ret;выход ДОС
OutNumber: xor cx,cx;сбрасываем счетчик
mov bx,10;система счисления
@@01: xor dx,dx;сбрасываем старший байт
div bx;делим на СС
push dx;запоминаем остаток в стеке
inc cx;считаем количество
or ax,ax;повторяем пока не ноль
jnz @@01
mov di,cx;запоминаем количество
@@02: pop ax;извлекаем из стека
or al,'0';переводим в символ
int 29h;выводим
loop @@02;пока СХ больше нуля
ret;возврат
end begin
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
10.03.2011, 23:16
общий
Цитата: 363839
Обычно в таких заданиях используются двоично десятичные цифры (BCD)

В таких заданиях может быть использовано всё, вернее задано, но не озувучено экспертам. Т.е. они должны подключать свою ЭКCТРОСЕНСОРИКУ.
Магнитные бури однако, весна, коты мешают(я только с 2-00:4:00, думаю, что это не мешает).
Я дал свой ответ, нужно будет доведем до нужного уровня(от уровня спрашивающего не зависит).
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
11.03.2011, 06:39
общий
11.03.2011, 21:24
это ответ
Здравствуйте, Попов Андрей Александрович!
Решение для числа представленного строкой символов в ASCII или ANSI кодировке в памяти по адресу _n и заканчивается пустым символом:

Приложение:
lea esi, [_n] ;загружаем адрес первого символа числа
cikl:
lodsb ;считываем очередной символ в регистр al
or al, al ;тестируем al
jnz cikl ;проверяем на наличие пустого символа (завершение строки), если нет считываем следующий символ
sub esi, _n ;вычисляем количество символов включая пустой
dec esi ; уменьшаем значение на 1

; всё, в регистре esi находится количество символов, цифр данного числа
5
давно
Старший Модератор
31795
6196
11.03.2011, 20:57
общий
Код:
     sub   esi, _n       ;вычисляем количество символов включая пустой
inc esi ; уменьшаем значение на 1


Как-то инкремент с уменьшением не совмещаются.
Уточняйте, что Вы хотели этим сказать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
11.03.2011, 21:06
общий
Адресаты:

Ёлки-зелёные! А как исправить? Виноват, не прав.
давно
Посетитель
7438
7205
11.03.2011, 21:16
общий
Пишите здесь, что должно быть...
Подправим, или я, или Константин Николаевич
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.03.2011, 21:21
общий
вместо " inc esi ; уменьшаем значение на 1"
надо "dec esi ; уменьшаем значение на 1"
давно
Старший Модератор
31795
6196
11.03.2011, 21:22
общий

там должно быть dec

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
11.03.2011, 21:29
общий
Адресаты:
В будущем старайтесь подходить более качественно(как минимум проверяйте код) к своим ответам, тем более на платные вопросы.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа