Автор |
Сообщение |
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 04.04.2007 21:21 Лаба по ассемблеру |
|
|
Помогите с задачкой: найти и сохранить количество десятичных цифр в числе (число в памяти будет храниться в 16СС).
Исходное число хранится в двухбайтовой ячейке сегмента данных, результат необходимо сохранить в однобайтовую ячейку сегмента данных. Под словосочетанием "сохранить результат" понимается запись результат в однобайтовую ячейку в сегменте данных. Следует испрользовать только итерационные циклы и условные операторы.
Я думаю, здесь надо как-то через сдвиг числа делать и смотреть на остаток от деления каждой цифры на 10.
Так или не так, какие есть варианты?
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Kabal
Инноватор-самоучка
Репутация: +19/–1
Возраст: 26
Гороскоп:
Пол:
Откуда: Санкт-Петербург
Сообщения: 3252
Стаж: 2 года 9 месяцев
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 04.04.2007 22:21 |
|
|
ассемблер для микропроцессора 8086
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.04.2007 22:25 |
|
|
Это шикарно, но нельзя ли поточнее, например:
1) MASM
2) TASM
3) NASM
4) Встроенный в Pascal, C или другой язык высокого уровня.
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 04.04.2007 22:28 |
|
|
Sovie
Лучше всего - написать на Tasm
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.04.2007 22:32 |
|
|
Так. С ассемблером выяснилои. Теперь по заданию.
Weman писал(а): найти и сохранить количество десятичных цифр в числе
Напиши просто цифрами что было и что должно получиться. Пример входных и выходных данных. А то я трудом понимаю, что от тебя тут нужно.
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 04.04.2007 22:36 |
|
|
Например:
в памяти: 0093
результат: 4
в памяти: FFFF
результат: 0
в памяти: 0A34
результат: 3
Что-то вроде этого должно получаться
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 05.04.2007 20:57 |
|
|
Ну есть какие-нибудь варианты как сделать?
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 14.04.2007 18:13 |
|
|
Сегодня уточнил задание по лабе у преподавателя. Оказалось все намного проще!
Есть какое то число, надо ,грубо говоря, просто посчитать его длину.
Т.е. есть например:
число 1234 - результат 4
число 93 - результат 2
Метод решения состоит в том, чтобы исходное число делить на 10 после каждого деления увеличивать счетчик цифр на 1 и смотреть, чтобы частное было не равно нулю.
Вот в принципе метод решения такой. Кто может помочь с написанием кода на ассемблере?
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 15.04.2007 14:27 |
|
|
Код: #include <iostream>
using namespace std;
void main () {
short iValue;
cout << "Enter value -> ";
cin >> iValue;
_asm {
mov ax, iValue // ax = iValue
mov bl, 10 // Делить будем на 10
mov cx, 1 // Счётчик цифр
Continue: // Метка продолжения
div bl // Непосредственно деление
cmp al, 0 // Всё, больше нечего делить?
je Exit // Если нечего, то на выход
inc cl // Если есть что, увеличить счётчик
mov ah, 0 // ah = 0, ибо тут остаток от прошлого деления
jmp Continue // Продолжим-с
Exit: // Метка выхода
mov iValue, cx // Сохраним результаты
}
cout << "Result -> " << iValue << endl;
}
Добавлено спустя 22 минуты 40 секунд:
Предыдущий код хорошо тестить на iValue = 1234.
Имей в виду, что short = 2 байта. Если хочешь, чтобы было 4 байта, твори следующее:
Код: int iValue;
short iResult;
cout << "Enter value -> ";
cin >> iValue;
// iValue = 123456;
_asm {
mov dx, word ptr [iValue][2]
mov ax, word ptr [iValue]
mov bx, 10
mov cx, 1
Continue:
div bx
cmp ax, 0
je Exit
inc cl
mov dx, 0
jmp Continue
Exit:
mov iResult, cx
}
cout << "Result = " << iResult << endl;
Удобно прогонять на 123456.
При 1234567 частное не влезает в ax. Процессор генерирует прерывание типа 0. Что делать, не знаю.
Отдельное списибо Artflasher за фокусы с регистровой парой и поддержку.
|
|
Вернуться к началу |
|
|
Weman
Репутация: +5
Возраст: 20
Гороскоп:
Пол:
Сообщения: 536
Стаж: 1 год 11 месяцев
|
[] 21.04.2007 14:56 |
|
|
Sovie спасибо ОГРОМНОЕ! Во всем разобрался - оказалось довольно легко, я думал будет сложнее!
Скоро сдавать пойду
_________________ Завтранах-универсальный ответ на любую просьбу.
|
|
Вернуться к началу |
|
|
|
|