![]() |
|
|
![]()
|
|
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
вобщем надо решить задачку: суммирование однозначных чисел, введенных пользователем, констроль переполнения. Вывести сумму.
У мну есть готовый код но я не понимаю зачем там стоко всего понаписано и есть свой код который не работает) Работает но где "?" мне не понятно: ;; Программа вывода суммы цифр на экран ;; ;; Упрощенные директивы 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 |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Во-первых, к массиву лучше обращаться с помощью специальных индексных регистров DI и SI, а не bx.
Ты увеличиваешь счетчик перед сложением. То есть, прибавляешь к sum значение, которое еще не определено. -------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
дайте хотябы ктонить кусок кода с разьяснениями по суммированию введенных чисел =), как это сделать правельно, как вывести
|
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Да, и не забывай десятичную коррекцию делать для чисел
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
|
|||
|
||||
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
мдяяяя :(
|
|||
|
||||
| Severyanin |
|
||||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Подпрограммы сложения в цикле можно найти в любой книге.
Для коррекции также есть команды.
Вот пример в твоем же коде. Перед выводом BCD-числа необходимо перевести в ASCI. Вот подпрограммы:
convst конвертирует в ASCI старшую тетраду байта, а convml - младшую. После этого можно выводить на экран через прерывания Добавлено через 33 секунды Писал по памяти и не проверял, но должны работать -------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
||||
|
|||||
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
Спасибо, стало чуть ясней =), остались маленькие вопросы:
вот я проссумировал, потом как я понял загоняем эту сумму в это конвертирование (собственно где сама сумма должна быть? bl?) и как потом нам составить само число для вывода? Чето я вот не догоняю как это все теперь в кучу собрать ( |
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Да, то значение, которое ты хочешь вывести, должно быть в bl. Извини,что сразу не написал. Ошибка в коде, который ты привел и содержится в суммировании. про нее я уже писал. А потом записываешь в al код вызова. Точно не помню, по-моему, 09 и вызываешь прерывание 10h. только перед этим нужно курсор сдвинуть в ту же позицию, куда надо вывести. Это делается через то же прерывание BIOS 10h. Не помню только, в какие регистры что нужно выводить. Посмотрю дома, если не забуду
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| prima |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
Спасибо Severyanin, я вот нашол хороший код с коментариями, разберусь.
Мало ли кому ещё понадобица, вот код:
|
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
Давай, разбирайся
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |