Консультация № 188084
06.10.2015, 19:15
0.00 руб.
0 5 1
Здравствуйте! У меня следующая задача:

По запросу программы пользователь вводит с
клавиатуры последовательность целых трехзначных положитель-
ных десятичных чисел, разделенных пробелами. Ввод последова-
тельности заканчивается нажатием <Enter>.
Программа выводит последовательность этих же чисел, но
записанных в обратном порядке и в шестнадцатеричной системе
счисления.

Если хоть кто-то чем-нибудь поможет уже будет здорово!

Обсуждение

давно
Посетитель
7438
7205
06.10.2015, 22:54
общий
Адресаты:
Здравствуйте, Евгения!
Во-первых, мы рады, что Вы опять заскочили к нам и назвались нормальным именем Евгения, кстати, весьма красивым...
Во-вторых, "кто-то чем-нибудь поможет" - это не про нас. Здесь Вы найдете помощь от и до...
В-третьих, хотелось все же услышать, Вас интересует сдать программку, как и весь Ассемблер, и забыть, как страшный сон. Или все же хотите разобраться, понять, как это все работает? Хотелось бы надеяться, что второе
Вернемся к программке... чтобы между нами была любовь и понимание, хотелось бы услышать от Вас ответы на следующие вопросы:
1) Каким компилятором (Ассемблером) пользуетесь? (TASM, MASM, NASM, FASM...)
2) На какую тему программа? Ведь ее можно написать по-разному, но Вам-то необходимо продемонстрировать что-то конктретное... Разве нет?
2) Какую модель памяти рекомендуется Вам использовать? (TINY, SMALL,...). Как следствие, формируем COM или EXE?
3) Описывать используемые сегменты явно или можно использовать описатели типа .model tiny ?
4) Используем подпрограммы или пишем линейно?
Список можно продолжать бесконечно... Чтобы можно было написать так, чтобы Вы поняли, и чтобы Вы смогли ее сдать
И напоследок, будут вопросы, смело задавайте их в мини-форуме... На все вопросы получите исчерпующие ответы...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
07.10.2015, 00:31
общий
Адресаты:
По заданию:
1)Числа вводятся строкой, которая потом обрабатывается или можно организовать контроль ввода допустимых цифр, пробел и ВВОД.?
2)Ввод строкой: обрабатываются всё числа, или только первые три?
3)Само число реверсируется или реверсируется только последовательность чисел?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
398689
10
07.10.2015, 07:03
общий
Адресаты:
Здравствуйте, Игорь Витальевич!
Хотелось бы конечно побыстрее сдать и забыть как страшный сон. Не буду лгать. Но и разобраться, понять тоже. Еще пригодится в жизни. Обычно я всё делаю сама, но ассемблер для меня малознакомая тема.
1) компилятор TASM
2) Темы нет. Просто "Разработка программ на Ассемблере"
3) можно использовать описатели типа .model tiny
4) программа непростая, скорее использовать подпрограммы
давно
Посетитель
398689
10
07.10.2015, 07:12
общий
Адресаты:
Здравствуйте, Константин Николаевич!
1) контроль ввода необязательно.
2) ввод строкой. Три числа разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>
3) я так понимаю само число
давно
Посетитель
7438
7205
07.10.2015, 14:56
общий
это ответ
Здравствуйте, Евгения!
Держите программу. Постарался максимально прокомментировать в тексте.
Сама постановка задачи, вывод в обратном порядке, наталкивает на мысль
хранить числа в стеке. Что и было сделано
Будут вопросы - пишите в мини-форум...
[code h=200]
.model tiny
.code
.startup

call GetString ;вводим строку с числами
call GetNumbers ;разбираем строку и выводим числа в виде hex и в обратном порядке

lea dx, sPress ;сообщение нажать любую клавишу
mov ah, 9 ;функция вывода строки
int 21h

mov ah, 0 ;ждем нажатие на клавишу
int 16h

.exit 0 ;выход из программы (эквивалентно mov ax, 4c00h / int 21h)

;ввод строки с консоли
GetString proc
lea dx, sNumbers ;сообщение 'Enter Numbers: '
mov ah,9
int 21h

lea dx, InputString ;адрес параметра функции ввода строки (формат описан ниже)
mov ah, 0ah ;номер функции ввода строки
int 21h
ret
GetString endp

;разбор строки и вывод результата
;числа будем хранить в стеке, чтобы вывести их в обратном порядке!
GetNumbers proc
mov bp, 10 ;будем умножать на 10 (при преобразовании строки в число)
xor cx, cx ;счетчик введенных чисел (хранятся в стеке)

lea si, InputString+2 ;адрес самой строки
;+2, т.к. в первых двух байтах длина строки и число введенных символов
;длину строки не используем, строку будем анализировать до кода конца строки (0dh)
num_loop: ;цикл формирования очередного числа
xor bx, bx ;здесь будем накапливать число
xor di, di ;счетчик цифр очередного числа,
; т.о. если =0, то числа нет (для контроля лишних пробелов)
sym_loop: ;цикл преобразования числовой строки в число
lodsb ;читаем очередной байт в регистр al из ds:[si], автоинкремент si
;анализируем байт
cmp al, 0dh ;прошли до конца строки?
je cmp_last ;да, учтем последнее число из строки

cmp al, ' ' ;пробел?
je space_found ;или конец введенного числа, или дополнительные разделители,
; которые проигнорируем

;ждем только цифры '0' <= al <= '9'
cmp al, '0' ;проверим на цифру
jb sym_loop ;нецифры игнорируем
cmp al, '9'
ja sym_loop

inc di ;есть очередная цифра, считаем, чтобы знать, что что-то есть
;вдвинем в формируемое число введенный десятичный разряд
;для этого предыдущие разряды умнодим на 10 и сложим с введенным
xchg ax, bx ;ax = предыдущим разрядам, bx = введенной цифре
mul bp ;dx:ax = предыдущим старшим разрядам * 10
and bx, 000fh ;превратим символ цифры 30h-39h в число 0-9
add bx, ax ;bx = введенному числу (на данный момент)

jmp sym_loop ;повторяем анализ символов строки

space_found: ;встретили пробел
test di, di ;есть число?
jz sym_loop ;нет - дополнительные пробелы игнорируем

push bx ;число сохраняем в стеке!
inc cx ;считаем

jmp num_loop ;на формирование следующего числа

cmp_last: ;встретили 0dh-конец строки
test di, di ;проверим, было ли у нас сформировано число
jz output_hex ;если в конце строки есть пробелы, то счетчик di=0
;если строка заканчивается цифрой, то di не равен 0
;и тогда это последнее число также надо сохранить в стеке
push bx ;в стек!
inc cx ;считаем

output_hex: ;выводим результат
lea dx, sHex ;сообщение 'Hex values: '
mov ah,9
int 21h

mov si, cx ;счетчик введенных чисел в si

hex_loop: ;цикл вывода hex-значений
test si, si ;проверим на 0
jnz hex_continue
ret ;все выведено или не было ни одного - выходим!

hex_continue: ;продолжаем вывод
pop bp ;извлекаем из стека очередного числа
;(в обратном порядке! так работает стек!)
mov cx, 4 ;счетчик hex-цифр
form_hex_loop: ;цикл вывода hex-цифр, начиная со старшей
rol bp, 1 ;циклически сдвигаем 4 раза, чтобы старшие 4 бита
rol bp, 1 ;(старшая hex-цифра) попали на мели младших бит
rol bp, 1
rol bp, 1
mov bx, bp ;получаем код очередной цифры в младших битах
and bx, 0fh ;маскируем все остальные биты
mov dl, byte ptr Hex[bx] ;получаем символ hex-цифры из строки Hex
mov ah, 2 ;и выводим на экран
int 21h
loop form_hex_loop ;по всем 4 цифрам

mov dl, ' ' ;разделим числа пробелом
mov ah, 2
int 21h

dec si ;уменьшим счетчик чисел
jmp hex_loop ;и на повтор

GetNumbers endp

;
Hex db '0123456789ABCDEF'
sNumbers db 0dh,0ah,"Enter numbers: $"
sHex db 0dh,0ah,"Hex values: $"
sPress db 0dh,0ah,"Press any key$"
InputString db 128,0,128 dup(?)

end
[/code]
5
Комментарии к исходному коды превосходны! Все вопросы отпадают. Спасибо-спасибо огромное! Я у Вас в должниках!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа