| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Хелп ми |
| Автор: prima 13.8.2007, 10:08 |
| вобщем надо решить задачку: суммирование однозначных чисел, введенных пользователем, констроль переполнения. Вывести сумму. У мну есть готовый код но я не понимаю зачем там стоко всего понаписано и есть свой код который не работает) Работает но где "?" мне не понятно: ;; Программа вывода суммы цифр на экран ;; ;; Упрощенные директивы tasm .MODEL SMALL ; Тип модели памяти- small DOSSEG ; Упорядочение сегментов с использованием ;; соглашений Microsoft .STACK 200h ; Стековый сегмент .DATA ; Начало сегмента данных Sum DW ? ,10,13 MegaSum DB 5 dup (0) ten DW 10 Mess1 DB 0dh, 0ah, "He цифровая клавиша. Повторите ввод", 0dh, 0ah, '$' Mess2 DB 0dh, 0ah, "Цифра! Хорошо.", 0dh, 0ah, '$' Mess3 DB 0dh, 0ah, "Мужик, ты перебрал значения, на сегодня печать окончена, я выключаюсь.", 0dh, 0ah, '$' Prompt DB "Вводите цифру, друг мой!", 0dh, 0ah, '$' .CODE ; Начало кодового сегмента ;; (упрощенная директива tasm) ProgramStart: ; Начало главной программы mov ax, @data ; Загрузка начального адреса mov ds, ax ; сегмента данных в DS mov Sum, 0 mov bx, 5 InputFromKbd: mov dx, OFFSET Prompt ; Загрузка смещения сообщения подсказки sub ax, ax mov ah, 09h ; Задание номера функции DOS для вывода int 21h ; Обращение к DOS для ее выполнения sub al, al mov ah, 01h ; Номер функции для ввода байта в al int 21h ; Обращение к DOS для ее выполнения cmp al, 'q' ; Введенный байт содержит код символа <at> je Dummy cmp al, '0' ; Введенный байт меньше кода нуля? jb PrtMess1 ; Да - на вывод сообщения об ошибке cmp al, '9' ; Введенный байт больше кода девятки? ja PrtMess1 ; Да - на вывод сообщения об ошибке NextSum: sub al, 30h sub ah, ah add Sum, ax ; копируем ax в Sum cmp Sum, 65526 jae PrtMess3 mov dx, OFFSET Mess2 ; Загрузка смещения сообщения о правильном вводе mov ah, 09h ; Задание номера функции DOS для вывода int 21h ; Обращение к DOS для выполнения jmp InputFromKbd ; и снова на ввод PrtMess1: mov dx, OFFSET Mess1 ; Загрузка смещения сообщения об ошибке mov ah, 09h ; Задание номера функции DOS для вывода int 21h ; Обращение к DOS для выполнения jmp InputFromKbd ; PrtMess3: mov dx, OFFSET Mess3 ; Загрузка смещения сообщения об ошибке mov ah, 09h ; Задание номера функции DOS для вывода int 21h ; Обращение к DOS для выполнения jmp Stop ; ifBigger: ? Sub dx,10 add dl, 30h mov MegaSum[bx], dl dec bx mov MegaSum[bx], 31h dec bx cmp bx,0 je Output ; cmp ax,0 je Output ; jmp Delenie Dummy2: ? sub dl,30h mov cx,dx jmp ifBigger Dummy: ? mov ax, Sum mov bx,5 Delenie: ? Sub dx,dx Div ten add dl, 30h cmp dl,'9' ja Dummy2 mov MegaSum[bx], dl sub bx,1 cmp ax,0 jne Delenie mov bx,0 Output: mov dx, OFFSET MegaSum mov ah, 09h int 21h Stop: mov ah, 4ch ; Задание функции завершения программы int 21h ; Обращение к DOS для выполнения END ProgramStart ; Конец программы с указанием точки ;; входа для редактора связей (tlink) ? - обьясните зачем и почему. и вот мой код, напутаный с самим суммированием чисел и вводом их, много раз переписывал и пробывал, так что там мешанина =) .MODEL SMALL DOSSEG .STACK 200h .DATA Num DB 200 dup (?), '$' Sum DW 200 dup (?), '$' Mess1 DB " Цифру жми!", 0dh, 0ah, '$' Mess2 DB " Наконец цифра!", 0dh, 0ah, '$' Prompt1 DB " ++++++++++++++++-Программа суммирования введенных чисел-++++++++++++++++++", 0ah, 0ah, '$' Prompt DB " Вводите цифру!", 0dh, 0ah, '$' .CODE ProgramStart: mov ax, @data mov ds, ax sub bx, bx mov Num[bx], 0 ;------------------------ Input: mov dx, OFFSET Prompt1 mov ah, 09h int 21h InputFromKbd: mov dx, OFFSET Prompt mov ah, 09h int 21h mov ah, 01h int 21h cmp al, '@' je Print cmp al, '0' jb PrtMess1 cmp al, '9' ja PrtMess1 mov dx, OFFSET Mess2 mov ah, 09h int 21h jmp NextSum ;------------------------ NextSum: mov Num[bx], al inc bx add Sum, Num[bx] jno NextSum PrtMess1: mov dx, OFFSET Mess1 mov ah, 09h int 21h jmp InputFromKbd Print: mov dx, OFFSET Sum mov ah, 9 int 21h Stop: mov ah, 4ch int 21h END ProgramStart |
| Автор: Severyanin 13.8.2007, 11:18 | ||
Во-первых, к массиву лучше обращаться с помощью специальных индексных регистров DI и SI, а не bx.
Ты увеличиваешь счетчик перед сложением. То есть, прибавляешь к sum значение, которое еще не определено. |
| Автор: prima 13.8.2007, 12:10 |
| дайте хотябы ктонить кусок кода с разьяснениями по суммированию введенных чисел =), как это сделать правельно, как вывести |
| Автор: Severyanin 13.8.2007, 12:17 |
| Да, и не забывай десятичную коррекцию делать для чисел |
| Автор: prima 14.8.2007, 13:57 |
| |
| Автор: prima 17.8.2007, 16:23 |
| мдяяяя :( |
| Автор: Severyanin 20.8.2007, 05:18 | ||||
| Подпрограммы сложения в цикле можно найти в любой книге. Для коррекции также есть команды.
Вот пример в твоем же коде. Перед выводом BCD-числа необходимо перевести в ASCI. Вот подпрограммы:
convst конвертирует в ASCI старшую тетраду байта, а convml - младшую. После этого можно выводить на экран через прерывания Добавлено через 33 секунды Писал по памяти и не проверял, но должны работать |
| Автор: prima 20.8.2007, 10:09 |
| Спасибо, стало чуть ясней =), остались маленькие вопросы: вот я проссумировал, потом как я понял загоняем эту сумму в это конвертирование (собственно где сама сумма должна быть? bl?) и как потом нам составить само число для вывода? Чето я вот не догоняю как это все теперь в кучу собрать ( |
| Автор: Severyanin 20.8.2007, 11:30 |
| Да, то значение, которое ты хочешь вывести, должно быть в bl. Извини,что сразу не написал. Ошибка в коде, который ты привел и содержится в суммировании. про нее я уже писал. А потом записываешь в al код вызова. Точно не помню, по-моему, 09 и вызываешь прерывание 10h. только перед этим нужно курсор сдвинуть в ту же позицию, куда надо вывести. Это делается через то же прерывание BIOS 10h. Не помню только, в какие регистры что нужно выводить. Посмотрю дома, если не забуду |
| Автор: prima 20.8.2007, 15:20 | ||
| Спасибо Severyanin, я вот нашол хороший код с коментариями, разберусь. Мало ли кому ещё понадобица, вот код:
|
| Автор: Severyanin 21.8.2007, 05:21 |
| Давай, разбирайся |