Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] Перемножение чисел 
V
    Опции темы
Гениальный123Робот
Дата 30.1.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Написать подпрограммы для ввода и вывода десятичных чисел. В главной программе необходимо ввести два числа при помощи этих подпрограмм, перемножить эти числа и вывести результат на экран.

Спасибо заранее. Очень надо бы. 
PM MAIL   Вверх
anwe
Дата 28.2.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Держи. Можно вводить и отрицательные числа.
Код

    model    tiny
    .286
    .code
    org    100h
start:
    mov    dx,offset prigl
    mov    ah,09h
    int    21h
    call    podprog
    cmp    byte ptr prigl[0],'z'
    je    lend
    push    ax
    mov    dx,offset perevod
    mov    ah,09h
    int    21h
    mov    byte ptr prigl[15],'2'
    mov    dx, offset prigl
    int    21h
    call    podprog
    cmp    byte ptr prigl[0],'z'
    je    lend1
    push    ax
    mov    dx,offset perevod
    mov    ah,09h
    int    21h
    pop    ax
    pop    bx
    add    ax,bx
    push    ax
    xchg    ah,al
    call    prn
    pop    ax
    call    prn
lend:
    ret
lend1:
    pop    ax
    ret
;--------------------
prn    proc    near
    mov    dh,al
    and    dh,0Fh
    shr    al,4
    call    print
    mov    al,dh
print:
    cmp    al,10
    sbb    al,69h
    das
    mov    dl,al
    mov    ah,02
    int    21h
    ret
endp    prn
;--------------------
podprog    proc    near
    mov    dx,offset buf
    mov    ah,0Ah
    int    21h
    cmp    byte ptr z[0],'-'
    jne    l2
    mov    di,1
    jmp    l3
l2:
    xor    di,di
l3:
    xor    ax,ax
    mov    cl,len
    xor    ch,ch
    mov    si,cx
    xor    bx,bx
    mov    cl,10
l1:
    mov    bl,byte ptr z[di]
    sub    bl,'0'
    jb    lerror
    cmp    bl,9
    ja    lerror
    mul    cx
    add    ax,bx
    inc    di
    cmp    di,si
    jb    l1
    cmp    byte ptr z[0],'-'
    jne    l4
    neg    ax
l4:
    ret
lerror:
    mov    dx,offset perevod
    mov    ah,09h
    int    21h
    mov    dx,offset ermes
    int    21h
    mov    byte ptr prigl[0],'z'
    ret
endp    podprog

prigl    db    'Vvedite chislo 1: ','$'
ermes    db    'Ne vernoe chislo!','$'
perevod    db    0Dh,0Ah,'$'
buf    db    6
len    db    ?
z:
end    start

PM MAIL   Вверх
Гениальный123Робот
Дата 28.2.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо огромное! Также поясни ключевые моменты. ;) Желательно побольше! Я вот только начал читать первые страницы книги...
Благодарен. 

Это сообщение отредактировал(а) Гениальный123Робот - 28.2.2007, 23:24
PM MAIL   Вверх
anwe
Дата 28.2.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

    model    tiny
    .286
    .code
    org    100h
start:
    mov    dx,offset prigl        ;вывод приглашения
    mov    ah,09h
    int    21h
    call    podprog            ;вызов подпрограммы ввода
    cmp    byte ptr prigl[0],'z'    ;если вместо первого v стоит z, значит
    je    lend            ;было введено нечисло - выход
    push    ax            ;сохранить полученное число
    mov    dx,offset perevod    ;перевод строки
    mov    ah,09h
    int    21h
    mov    byte ptr prigl[15],'2'    ;подкорректировать приглашение для 2 числа
    mov    dx, offset prigl    ;вывод его
    int    21h
    call    podprog
    cmp    byte ptr prigl[0],'z'
    je    lend1
    push    ax
    mov    dx,offset perevod
    mov    ah,09h
    int    21h
    pop    ax            ;восстановить второе число
    pop    bx            ;восстановить первое число
    add    ax,bx            ;сложить их
    push    ax            ;сохранить результат
    xchg    ah,al            ;обмен байтами
    call    prn            ;сначала вывод старшего байта
    pop    ax            ;восстановить результат
    call    prn            ;теперь вывод младшего байта
lend:
    ret
lend1:
    pop    ax            ;необходимо очистить стек от 1 числа
    ret
;--------------------
prn    proc    near
    mov    dh,al            ;сохранить результат
    and    dh,0Fh            ;оставить лишь младший полубайт
    shr    al,4            ;оставить лишь старший полубайт
    call    print            ;сначала вывод страшего полубайта
    mov    al,dh            ;восстановить результат
print:                    ;теперь - младшего полубайта
    cmp    al,10            ;три строки перевода цифры в ее код
    sbb    al,69h
    das
    mov    dl,al            ;функция вывода символа
    mov    ah,02
    int    21h
    ret
endp    prn
;--------------------
podprog    proc    near
    mov    dx,offset buf        ;считать введеное число в буфер
    mov    ah,0Ah
    int    21h
    cmp    byte ptr z[0],'-'    ;1 символ = -?
    jne    l2
    mov    di,1            ;да - занести в счетчик символов 1
    jmp    l3
l2:
    xor    di,di            ;нет - занести в счетчик символов 0
l3:
    xor    ax,ax            ;здесь будет результат
    mov    cl,len            ;здесь длина введенной строки
    xor    ch,ch
    mov    si,cx            ;она храниться в si
    xor    bx,bx            ;сюда считываем очередной символ
    mov    cl,10            ;десятичный множитель
l1:
    mov    bl,byte ptr z[di]    ;считать символ
    sub    bl,'0'            ;скорректировать под цифру 0
    jb    lerror            ;меньше - ошибка
    cmp    bl,9            ;сравнить с 9
    ja    lerror            ;больше - ошибка
    mul    cx            ;домножить
    add    ax,bx            ;добавить к полученному
    inc    di            ;увеличить счетчик
    cmp    di,si            ;равен длине строке?
    jb    l1            ;нет - повтор
    cmp    byte ptr z[0],'-'    ;да - первый символ - ?
    jne    l4            ;нет - выход
    neg    ax            ;да - обратить результат
l4:
    ret
lerror:
    mov    dx,offset perevod
    mov    ah,09h
    int    21h
    mov    dx,offset ermes        ;вывод сообщения об ошибке ввода
    int    21h
    mov    byte ptr prigl[0],'z'    ;ввести признак ввода нечисла
    ret
endp    podprog

prigl    db    'Vvedite chislo 1: ','$'
ermes    db    'Ne vernoe chislo!','$'
perevod    db    0Dh,0Ah,'$'
buf    db    6
len    db    ?
z:
end    start

Ничего сложного нет, только что признаком ввода нечисла (любого набора символов) является первый символ приглашения V, которая меняется на z. Это просто хитренький способ не вводить еще одну переменную, экономя лишний байт памяти. smile 
И еще если введено нечисло второй раз, то сначала надо очистить стек, в котором сохранен первый результат.
PM MAIL   Вверх
Гениальный123Робот
Дата 1.3.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



anwe, окей. спасибо. 
Начинаю вникать и пониматься. А тебе вот еще задачка к этой же задаче: 
Модифицировать подпрограммы второй лабораторной (данной выше) работы таким образом, чтобы можно было вводить и выводить знаковые числа.
Создай новый топ, если решишь (модифицируешь). 
P.S. Я сюда для наглядности скинул...
P.P.S. Спасибо за помощь
PM MAIL   Вверх
anwe
Дата 1.3.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ты смотрел мой первый ответ:
Цитата(anwe @  28.2.2007,  13:30 Найти цитируемый пост)
Можно вводить и отрицательные числа


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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