Консультация № 180037
26.09.2010, 08:46
43.11 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Помогите, пожалуйста, решить следующую задачу по программированию на Ассемблере.
Вывести на экран сумму двух введенных с клавиатуры двузначных чисел (Вводить посимвольно функцией 01 прерывания 21h, значение вводить так, чтобы сумма была меньше 100). Для решения задачи применить команды десятичной арифметики.

Обсуждение

давно
Посетитель
7438
7205
27.09.2010, 00:07
общий
это ответ
Здравствуйте, Aleksandrkib.
Примерно так. Достаточно прокомментировано, если что осталось непонятно, спрашивайте в мини-форуме
[code h=200]
.model small
.data
sNum1 db 'Enter first number: $' ;Строка приглашения для ввода первого числа
sNum2 db 'Enter second number: $' ;Строка приглашения для ввода второго числа
sSum db 'Result = ' ;Строка вывода результата
sNum db '00$' ;Сюда вставим число-сумму введенных чисел

.code
.286 ;чтобы использовать shr al, 4
.startup ;точка входа
;вводим первое число
lea dx, sNum1 ;строка приглашения
call GetNumber ;в al однобайтное BCD число
mov bh, al ;сохраним в bh
;вводим второе число
lea dx, sNum2 ;строка приглашения
call GetNumber ;в al однобайтное BCD число

add al, bh ;сложим с первым
daa ;делаем коррекцию!
;в al корректное BCD число
;выведем сообщение, для этого сформируем двубайтное символьное число
mov ah, al ;обработам и старший полубайт, и младший
shr al, 4 ;старший десятичный разряд в младшем полубайте al
and ah, 0fh ;младший десятичный разряд в младшем полубайте ah
or ax, '00' ;числа - в символы
mov word ptr sNum, ax ;запишем двубайтное число в строку результата

lea dx, sSum ;выведем
mov ah, 9
int 21h

.exit 0

;ввод однобайтного BCD числа
;результат - в al
GetNumber proc
mov ah, 9 ;подсказка
int 21h

mov bl, 0 ;здесь будем формировать BCD число
mov cx, 2 ;вводим максимум две цифры
GetLoop:
mov ah, 1 ;вводим символ
int 21h
cmp al, 0dh ;по Enter-у заканчиваем ввод досрочно
je GetNumRet
cmp al, '0' ;проверим на цифру
jb GetLoop
cmp al, '9'
ja GetLoop
and al, 0fh ;получаем из символа число 0-9
shl bl, 4 ;старый младший десятичный разряд становится старшим
or bl, al ;вставляем новый младший разряд
loop GetLoop ;вводим максимум две цифры

GetNumRet: ;перейдем на новую строку
mov ah, 2
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov al, bl ;результат в al
ret
GetNumber endp

end
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
317729
109
28.09.2010, 16:56
общий
Лысков Игорь Витальевич:
Здравствуйте, Игорь Витальевич! Запустил файл, как нас учили в институте. В командной строке поочерёдно выполнил команды:
TASM Zadacha.asm
TLINK Zadacha.obj
Zadacha.exe

Но вместо приглашения ввести первое число, второе число и др. появляются всякие непонятные символы ASCII кода. Как решить эту проблему?
У меня установлен Турбо Ассемблер 3.2i в каталоге C:\TASM.
давно
Посетитель
7438
7205
28.09.2010, 17:10
общий
Aleksandrkib:
Все просто. Программа предполагает формат COM.
Запустите TLINK Zadacha /t и получите файл Zadacha.com
Если Вы хотите именно EXE, то скажите, я чуток переделаю, только попозже, вечерком...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
317729
109
29.09.2010, 02:11
общий
Лысков Игорь Витальевич:
Если Вас не затруднит, Игорь Витальевич, желательно в формате EXE тоже.
давно
Посетитель
7438
7205
29.09.2010, 09:37
общий
Aleksandrkib:
Чтобы получить EXE, поменяйте модель памяти (первую строку) на
.model small
В результате все сегментные регистры настроятся автоматически (посмотрите в отладчике):
DS, SS на сегмент данных, ES останется равным PSP (чтобы получить, например, параметры командной строки)
Тогда линкируйте
link Zadacha
И получите Zadacha.exe

Или может от Вас требуют описывать сегменты явно, с помощью SEGMENT?
Можно и так сделать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
317729
109
30.09.2010, 15:22
общий
Большое Вам спасибо! Всё работает.
Форма ответа