26.05.2014, 20:22 | #1 (permalink) |
Новичок
Регистрация: 26.05.2014
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите исправить калькулятор
.code .386 ;используем eax org 100h start: vvod1: ;выбор функции xor eax,eax ;обнуляем регистры xor edx,edx ; call clrscr mov ah,9 ;Вывод сторки мессаге1 mov dx,offset message1 ; int 21h ; mov ah,08h ;считать символ с клавиатуры int 21h ; cmp al,'+' ;сравнение с '+' je cloj ;значит складываем cmp al,'-' je vich ;вычитание cmp al,'/' je dele ;деление cmp al,'*' je rr1 ;используем jmp т.к далеко jmp rr ; rr1: jmp umnoj ;Умножение rr: cmp al,'q' ;выход je quit cmp al,'Q' je quit jmp short vvod1 ;если не ввели то повторять ввод quit: ret ;Выход cloj: ;Сложение dx+ax->ax call clrscr ;стереть экран call aa1 ;ввод а push dx ;сохраняем dx в стеке call bb1 ;ввод b pop dx ;вытаскиваем dx из стека add ax,dx ;складываем ax и dx результат в eax call print call endstrd mov ah,9 ;Вывод сторки мессаге2 mov dx,offset message2 ; int 21h mov ah,08h int 21h ; jmp vvod1 vich: ;вычитание call clrscr ;стереть экран call aa1 ;ввод а push dx call bb1 ;ввод b pop dx sub dx,ax ;вычитаем из dx ax результат в edx mov ax,dx ;переносим его eax call print ;выводит eax в десятичной системе call endstrd mov ah,9 ;Вывод сторки мессаге2 mov dx,offset message2 ; int 21h mov ah,08h int 21h ; jmp vvod1 dele: ;деление (цело численное) call clrscr ;стереть экран call aa1 ;ввод а push dx call bb1 ;ввод b pop dx xchg dx,ax mov cx,dx ;сохраняем делитель в cx xor dx,dx ;обнуляем dx там будет остаток div cx ;делим результат в eax call print call endstrd mov ah,9 ;Вывод сторки мессаге2 mov dx,offset message2 ; int 21h mov ah,08h int 21h ; jmp vvod1 umnoj: ;умножение call clrscr ;стереть экран call aa1 ;ввод а push dx call bb1 ;ввод b pop dx mul edx ;умножаем результат в eax call print call endstrd mov ah,9 ;Вывод сторки мессаге2 mov dx,offset message2 ; int 21h mov ah,08h int 21h ; jmp vvod1 clrscr: xor dx,dx ;положение курсора dh-строка dl-столбец mov ah,02h ;установить в 0,0 int 10h ; mov bl,0000111b ;атрибут символов белый на чёрном mov cx,25*80 ;количество символов mov ax,0920h ;вывод 25*80 пробелов int 10h ; ret endp aa1: ;ввод а mov dx,offset aaaa mov ah,9 int 21h call mover mov dx,ax ;перенесём в dx ret endp bb1: ;ввод а mov dx,offset bbbb mov ah,9 int 21h call mover ret endp mover: mov dx,offset bufer ;аресс буфера mov ah,0ah ;считать строку данных в буфер int 21h ; mov dx,offset endstr ;перенос курсора на строку ниже mov ah,9 ; int 21h ; ;перевод из строки в бинарное число xor di,di ;начало буферв xor ax,ax ;текущее значение ax mov cl,blength xor ch,ch xor bx,bx mov si,cx ;длинна буфера mov cl,10 ;множитель tohex: mov bl,byte ptr bconteg[di] sub bl,'0' ;цифра = код символа - код символа '0' jb tata ;если ко символа < чем код '0' cmp bl,9 ;или > чем '9' ja tata ;начать ввод занаво mul cx ;иначе умножить на 10 add ax,bx ;добавить к ax новую цифру inc di ;увеличить адресс cmp di,si ;если он меньше чем кол. символов + 1 jb tohex jmp tra tata: jmp vvod1 ;Нужно использовать дальний переход tra: ret endp print: mov ebx,0ah ;делитель xor cx,cx ;счётчик divloop: xor edx,edx ;обнуляем edx div ebx ;делим на 10 add edx,'0' ;дописываем к остатку деления код нуля push edx ;сохраняем число в стеке inc cx ;увеличиваем счётчик на 1 test eax,eax ;если есть что делить то jnz divloop ;продолжаем делить(если не ноль) restore: pop eax ;читаем записанные числа из стека mov edx,eax ;пишем их в eax mov ah,2 ;функция вывода символа по коду код в al int 21h ; dec cx ;уменьшаем счетчик cmp cx,0 ;если он не = нолю jne restore ;то проолжаем вывод ret endp endstrd: mov dx,offset endstr ;перенос курсора на строку ниже mov ah,9 ; int 21h ; ret endp ret message1 db "PRESS",0dh,0ah db "+ for add. a+b.",0dh,0ah db "- for sub. a-b",0dh,0ah db "/ for div. a/b",0dh,0ah db "* for mul. a*b",0dh,0ah db "q for quit",0dh,0ah,'$' message2 db "Press any key",0dh,0ah,'$' aaaa db "a=",'$' bbbb db "b=",'$' endstr db 0dh,0ah,'$' enderes db ' ',0dh,0ah,'$' bufer db 5 ;max размер ввода чисел blength db ? ;размер буфера после считывания bconteg: ;содержимое буфера будет за концом файла hexstring equ bconteg end start |
26.05.2014, 20:22 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Тема довольно популярная и ранее создавалась на нашем форуме Помогите исправить код. Pascal Помогите исправить ошибку Помогите исправить код |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|