Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хелп ми 
V
    Опции темы
prima
Дата 13.8.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

PM MAIL   Вверх
Severyanin
Дата 13.8.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Во-первых, к массиву лучше обращаться с помощью специальных индексных регистров DI и SI, а не bx. 
Цитата

NextSum:
mov Num[bx], al
inc bx
add Sum, Num[bx]
jno NextSum

Ты увеличиваешь счетчик перед сложением. То есть, прибавляешь к sum значение, которое еще не определено. smile 


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
prima
Дата 13.8.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



дайте хотябы ктонить кусок кода с разьяснениями по суммированию введенных чисел =), как это сделать правельно, как вывести
PM MAIL   Вверх
Severyanin
Дата 13.8.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Да, и не забывай десятичную коррекцию делать для чисел


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
prima
Дата 14.8.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
prima
Дата 17.8.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



мдяяяя :(
PM MAIL   Вверх
Severyanin
Дата 20.8.2007, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Подпрограммы сложения в цикле можно найти в любой книге.
Для коррекции также есть команды.
Код

NextSum:
mov Num[bx], al
inc bx
add Sum, Num[bx]
jno NextSum

Вот пример в твоем же коде.
Перед выводом BCD-числа необходимо перевести в ASCI.
Вот подпрограммы:
Код

convst:
           mov al,bl
           mov cx,4
           mov ax,0
           and al,0F0h
           ror ax,cx
           add  al,30h
convml:
            mov al,bl
            and al,0Fh
            add al,30h

convst конвертирует в ASCI старшую тетраду байта, а convml - младшую. После этого можно выводить на экран через прерывания

Добавлено через 33 секунды
Писал по памяти и не проверял, но должны работать


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
prima
Дата 20.8.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



Спасибо, стало чуть ясней =), остались маленькие вопросы:
вот я проссумировал, потом как я понял загоняем эту сумму в это конвертирование (собственно где сама сумма должна быть? bl?) и как потом нам составить само число для вывода? Чето я вот не догоняю как это все теперь в кучу собрать (
PM MAIL   Вверх
Severyanin
Дата 20.8.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Да, то значение, которое ты хочешь вывести, должно быть в bl. Извини,что сразу не написал. Ошибка в коде, который ты привел и содержится в суммировании. про нее я уже писал.  А потом записываешь в al код вызова. Точно не помню, по-моему, 09 и вызываешь прерывание 10h. только перед этим нужно курсор сдвинуть в ту же позицию, куда надо вывести. Это делается через то же прерывание BIOS 10h. Не помню только, в какие регистры что нужно выводить. Посмотрю дома, если не забуду smile 


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
prima
Дата 20.8.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



Спасибо Severyanin, я вот нашол хороший код с коментариями, разберусь.
Мало ли кому ещё понадобица, вот код:
Код

            ; Упрощенные директивы tasm
    .MODEL SMALL    ; Тип модели памяти - small
    DOSSEG        ; Упорядочение сегментов с использованием
            ; соглашений Microsoft
    .STACK 200h    ; Стековый сегмент
    .DATA        ; Начало сегмента данных

; Буфер для ввода
 InpBuff DB 200 dup (?)

; Буфер для суммирования
 SumBuff DW 0

; Буфер для вывода результата, max число = 65535 (5 разрядов)
 ResBuff DB "     ", 0dh, 0ah, '$'

; Для занесения результата в буфер
; используется разложение числа по степеням Ten 
 Ten DW 10

 Mess1 DB " Не цифровая клавиша. Повторите ввод.", 0dh, 0ah, '$'
 Mess2 DB " Цифра! Хорошо.", 0dh, 0ah, '$'
 Prompt DB " Вводите цифру, друг мой!", 0dh, 0ah, '$'
 ErrMess1 DB " Невозможно ввести больше цифр.", 0dh, 0ah, '$'
 ErrMess2 DB " При суммировании возникло переполнение.", 0dh, 0ah, '$'
 ResMess DB " Сумма равна: ", 0dh, 0ah, '$'

    .CODE        ; Начало кодового сегмента
            ; (упрощенная директива tasm)
ProgramStart:        ; Начало главной программы
    mov ax, @data    ; Загрузка начального адреса
    mov ds, ax        ; сегмента данных в DS
    sub bx, bx         ; Задание начального адреса буфера

    InputFromKbd:
        mov dx, OFFSET Prompt    ; Загрузка смещения сообщения подсказки
        mov ah, 09h        ; Задание номера функции DOS для вывода
        int 21h            ; Обращение к DOS для ее выполнения

        mov ah, 01h        ; Номер функции для ввода байта в al
        int 21h            ; Обращение к DOS для ее выполнения
        cmp al, '@'        ; Введенный байт содержит код символа <at>?
        je Stop            ; Да - на завершение программы
        cmp al, '0'        ; Введенный байт меньше кода нуля?
        jb PrtMess1        ; Да - на вывод сообщения об ошибке
        cmp al, '9'        ; Введенный байт больше кода девятки?
        ja PrtMess1        ; Да - на вывод сообщения об ошибке

        cmp bx, 200             ; Если текущий адрес больше последнего
        je StackOverflow      ; то сообщаем о переполнении стека
        mov InpBuff[bx], al    ; Заносим код нашей цифры в буфер
        
        sub ah, ah              ; Полученную цифру превращаем
        sub al, 30h             ; в ее код
        mov dx, 0FFFFh          ; Проверяем цифру на возможность
        sub dx, ax              ; переполнения ее суммы с суммой буфера
        cmp SumBuff[0], dx      ; Произойдет переполнение?
        ja SumOverflow          ; Да - на вывод сообщения о переполнении сумматора
                                ; Иначе продолжаем суммирование
        add SumBuff[0], ax      ; Добавляем элемент в сумматор
        inc bx            ; и переходим на адрес
                ; следующего элемента

        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    ; и снова на ввод

 
    StackOverflow:
        mov dx, OFFSET ErrMess1        ; Загрузка смещения сообщения
                    ; о переполнении стека
        mov ah, 09h            ; Задание номера функции DOS для вывода
        int 21h                ; Обращение к DOS для выполнения
        jmp Stop            ; и окончание работы программы


    SumOverflow:
        mov dx, OFFSET ErrMess2        ; Загрузка смещения сообщения
                                        ; о переполнении сумматора
    mov ah, 09h                     ; Задание номера функции DOS для вывода
        int 21h                         ; Обращение к DOS для выполнения
        jmp Stop                        ; и окончание работы программы


    Stop:
        mov ax, SumBuff             ; Подготовка к разложению полученной суммы
    mov bx, 4                       ; по степеням и запись коэффициентов в буфер

    Cycle:                          ; Начало цикла перевода
        sub dx, dx                  ; Получаем коэффициенты начиная с конца
        div Ten                     ; путем деления на Ten
        add dl, 30h                 ; Преобразовываем их в символы ASCII
        mov ResBuff[bx], dl         ; и заносим в буфер
        dec bx                      ; начиная с последней позиции
        cmp ax, 0                   ; Пока остаток не равен нулю
        jne Cycle                   ; цикл продолжается
         
    mov dx, OFFSET ResMess          ; Загрузка смещения сообщения о выводе результата
    mov ah, 09h                     ; Задание номера функции DOS для вывода
    int 21h                         ; Обращение к DOS для выполнения

    mov dx, OFFSET ResBuff          ; Загрузка смещения сообщения о значении результата
      mov ah, 09h                     ; Задание номера функции DOS для вывода
    int 21h                         ; Обращение к DOS для выполнения
    
    mov ah, 4ch        ; Задание функции завершения программы
        int 21h            ; Обращение к DOS для выполнения

 
END ProgramStart    ; Конец программы с указанием точки
            ; входа для редактора связей (tlink) 

PM MAIL   Вверх
Severyanin
Дата 21.8.2007, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Давай, разбирайся smile . Спрашивай, если что smile 


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.