Поиск:

Ответ в темуСоздание новой темы Создание опроса
> !!!HELP!!! калькулятор на ассме, не получается кое-что сделать... 
:(
    Опции темы
Siborn
Дата 17.12.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо Chingachguk
я твой код подредачил теперь считаит большие числа нормально...и ошибку с нулём тоже сделал...а как сделать чтоб он отрицательные числа считал не подскажеш?
например 1-2=-1
он если такой пример ему дать выдаёт 1-2=4294967295

вот код новый

Код

;Калькулятор. Выполняет +,-,*,/
;Для просмотра результата нужно нажать =
;-------------------------------начало сегмента данных-------------------------
dseg segment
.386
op1 dd 0
d dd 0
osn dd 10
ab db 10,13,'Calc v1.0 Умножает, делит, складывает и вычитает. Не работает с отрицательными числами и часлами с запятой ','$'
vv db 10,13,'вводите пример в виде: число1_знак операции_число2_знак равно',10,13,'$'
s db 10,13,'это не число',10,13,'$'
gr db 10,13,'это число очень большое',10,13,'$'
n db 10,13,'делить на ноль нельзя','$'
dey db 0
dseg ends
;---------------------------начало сегмента кода-------------------------------
code segment use16
assume cs:code, ds:dseg;установка связи между сегментами и сегментными регистрами
start:
    mov ax,dseg
    mov ds,ax
mov ah,9
lea dx,ab
int 21h
mov ah,9                                       ;строка с образцом ввода примера
lea dx,vv
int 21h
call input                                               ;ввод первого операнда
mov eax,d                                                       ;и занесение его
mov op1,eax                                                    ;в переменную ор1

menu:
mov al,dey                                        ;в al копируем содержимое dey
    cmp al,'='                                    ;сравнение al со знаком =
    jne m1                                 ;если не равно, то переход на m1
    call output                                      ;вызов процедуры ввода
    mov ah,7h                                             ;ожидание нажатия  
    int 21h                                                        ;клавиши
    mov ah,4ch                                                 ;выход в DOS
    int 21h

m1:
    cmp al,'+'                                    ;сравнение al со знаком +
    jne m2                                 ;если не равно, то переход на m2
    call input                                       ;вызов процедуры ввода
    mov eax,d                                            ;копирование d в ах 
        add op1,eax                                                  ;op1=op1+ax
    jmp menu                                               ;переход на menu
m2:
    cmp al,'-'                                    ;сравнение а1 со знаком -
    jne m3                                 ;если не равно, то переход на m3
    call input                                       ;вызов процедуры ввода
    mov eax,d                                            ;копирование d в ах 
    sub op1,eax                                                  ;op1=op1-ax
    jmp menu                                               ;переход на menu
m3:
    cmp al,'*'                                    ;сравнение al со знаком *
    jne m4                                 ;если не равно, то переход на m4
    call input                                       ;вызов процедуры ввода
    mov eax,op1                                        ;копирование ор1 в ах
    mul d                                                ;умножение ах на d
    mov op1,eax                                        ;копирование ах в ор1
    jmp menu                                               ;переход на menu
m4:
    cmp al,'/'                                    ;сравнение al со знаком /
    jne menu                             ;если не равно, то переход на menu
    call input                                       ;вызов процедуры ввода
    mov eax,op1                                        ;копирование ор1 в ах
cmp al,'0'
jnz nolb
    div d                                                  ;деление ах на d
    mov op1,eax                                        ;копирование ах в ор1
    jmp menu                                               ;переход на menu
nolb:
mov ah,9
lea dx,n
int 21h
call output
;------------------------------процедуры---------------------------------------
;----------------------------процедура ввода-----------------------------------
input proc                                               ;процедура ввода числа
mov d,0                                                   
begin:
    mov ah,1h                             ;ожидание нажатия клавиши и вывод 
    int 21h         ;введённого символа на экран, в а1 получаем код символа
    cmp al,'='
    jne h
    mov dey,al
    ret
h:
    cmp al,'0'                         ;сравнение кода символа с кодом нуля 
    jge dal1                     ;если больше или равно, то перейти на dal1
mov dey,al
ret
    dal1:
    cmp al,'9'                            ;сравнение кода символа с кодом 9
    jle dal2                     ;если меньше или равно, то переход на dal2
mov ah,9h                                                         ;вывод строки
lea dx,s                                                  ;с сообщением о вводе
int 21h                                                  ;недопустимого символа
jmp begin                                                     ;переход на begin
    dal2:
    sub al,'0'    ;вычитание из кода символа код нуля, чтобы получить число
    cbw                                                ;расширение al до ax
    mov esi,eax                                        ;сохранение числа в si
    mov eax,d    ;копирование в ах числа, которое хранится в d (сначала = 0)
    mul osn                                             ;умножение ах на 10
    jnc dal3                     ;если не было переноса, то переход на dal3
mov ah,9h                                                         ;вывод строки 
lea dx,gr                                                  ;с сообщение о вводе
int 21h                                                 ;слишком большого числа
mov ah,4ch                                                     ;выход в дос DOS
int 21h
    dal3:
    add eax,esi                ;добавление к уже введённому числу новой цифры
    mov d,eax                               ;занесение полученного числа в d
    jmp begin                                      ;переход на начало ввода
input endp
;-----------------------------процедура вывода---------------------------------
output proc
mov eax,op1                                      ;копирование содиржимого d в ах
mov cx,0                                                          ;обнуление сх
    out_dec:
    mov dx,0                                                  ;обнуление dx
    div osn                                   ;деление содержимого dx на 10
    push dx                                           ;содержимое dx в стэк
    inc cx                                                   ;увеличение cx
    cmp eax,0                                              ;сравнение ax с 0
    jne out_dec                       ;если не равно, то переход на out_dec
dmet:
    pop dx                                           ;содержимое стэка в dx 
    add dl,'0'                                  ;прибавление к dl кода нуля 
    mov ah,2h                                       ;вывод символа на экран
    int 21h
    loop dmet                                                    ;цикл dmet
ret
output endp
code ends
end start


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

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

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


 




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


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

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