Поиск:

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


Unregistered











Помогите пожалуста с курсовиком... Нужно написать калькулятор, который делит, умножает, суммирует и вычитает... Я почти всё сделал, только, когда складываю или умножаю числа большие и результат больше вордового, то он считает до 65535 а потом начинает снова с нуля (при вычитании из меньшего числа большего он тоже так делает только в другую сторону - доходит до нуля и потом в обратном порядке от 65535 вниз)
и ещё нужно при попытке деления на ноль, чтобы выводилось сообщение о том, что на ноль делить нельзя... Ну и если возможно чтоб считал числа с запятой...

з.ы. Извините, что комменты нечитабельны - код написан в фаре...
в блокноте с шрифтом Terminal всё видно

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

з.з.з.ы. Заранее благодарен

вот код

Код

;Љ «мЄг«пв®а. ‚лЇ®«­пҐв +,-,*,/
;„«п Їа®б¬®вࠠ१г«мв в  ­г¦­® ­ ¦ вм =
;-------------------------------­ з «® бҐЈ¬Ґ­в  ¤ ­­ле-------------------------
dseg segment
op1 dw 0
d dw 0
osn dw 10
vv db 10,13,'ўў®¤ЁвҐ ЇаЁ¬Ґа ў ўЁ¤Ґ: зЁб«®1_§­ Є ®ЇҐа жЁЁ_зЁб«®2_§­ Є а ў­®',10,13,'$'
s db 10,13,'нв® ­Ґ зЁб«®',10,13,'$'
gr db 10,13,'нв® зЁб«® ®зҐ­м Ў®«м讥',10,13,'$'
dey db 0
dseg ends
;---------------------------­ з «® бҐЈ¬Ґ­в  Є®¤ -------------------------------
code segment
assume cs:code, ds:dseg;гбв ­®ўЄ  бўп§Ё ¬Ґ¦¤г бҐЈ¬Ґ­в ¬Ё Ё бҐЈ¬Ґ­в­л¬Ё аҐЈЁбва ¬Ё
start:
    mov ax,dseg
    mov ds,ax
mov ah,9                                       ;бва®Є  б ®Ўа §ж®¬ ўў®¤  ЇаЁ¬Ґа 
mov dx,offset vv
int 21h
call input                                               ;ўў®¤ ЇҐаў®Ј® ®ЇҐа ­¤ 
mov ax,d                                                       ;Ё § ­ҐбҐ­ЁҐ ҐЈ®
mov op1,ax                                                    ;ў ЇҐаҐ¬Ґ­­го ®а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 ax,d                                            ;Є®ЇЁа®ў ­ЁҐ d ў  е 
        add op1,ax                                                  ;op1=op1+ax
    jmp menu                                               ;ЇҐаҐе®¤ ­  menu
m2:
    cmp al,'-'                                    ;ба ў­Ґ­ЁҐ  1 б® §­ Є®¬ -
    jne m3                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m3
    call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
    mov ax,d                                            ;Є®ЇЁа®ў ­ЁҐ d ў  е 
    sub op1,ax                                                  ;op1=op1-ax
    jmp menu                                               ;ЇҐаҐе®¤ ­  menu
m3:
    cmp al,'*'                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ *
    jne m4                                 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  m4
    call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
    mov ax,op1                                        ;Є®ЇЁа®ў ­ЁҐ ®а1 ў  е
    mul d                                                ;г¬­®¦Ґ­ЁҐ  е ­  d
    mov op1,ax                                        ;Є®ЇЁа®ў ­ЁҐ  е ў ®а1
    jmp menu                                               ;ЇҐаҐе®¤ ­  menu
m4:
    cmp al,'/'                                    ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ /
    jne menu                             ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­  menu
    call input                                       ;ўл§®ў Їа®жҐ¤гал ўў®¤ 
    mov ax,op1                                        ;Є®ЇЁа®ў ­ЁҐ ®а1 ў  е
    div d                                                  ;¤Ґ«Ґ­ЁҐ  е ­  d
    mov op1,ax                                        ;Є®ЇЁа®ў ­ЁҐ  е ў ®а1
    jmp menu                                               ;ЇҐаҐе®¤ ­  menu
;------------------------------Їа®жҐ¤гал---------------------------------------
;----------------------------Їа®жҐ¤га  ўў®¤ -----------------------------------
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 si,ax                                        ;б®еа ­Ґ­ЁҐ зЁб«  ў si
    mov ax,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 ax,si                ;¤®Ў ў«Ґ­ЁҐ Є г¦Ґ ўўҐ¤с­­®¬г зЁб«г ­®ў®© жЁдал
    mov d,ax                               ;§ ­ҐбҐ­ЁҐ Ї®«г祭­®Ј® зЁб«  ў d
    jmp begin                                      ;ЇҐаҐе®¤ ­  ­ з «® ўў®¤ 
input endp
;-----------------------------Їа®жҐ¤га  ўлў®¤ ---------------------------------
output proc
mov ax,op1                                      ;Є®ЇЁа®ў ­ЁҐ б®¤Ёа¦Ё¬®Ј® d ў  е
mov cx,0                                                          ;®Ў­г«Ґ­ЁҐ бе
    out_dec:
    mov dx,0                                                  ;®Ў­г«Ґ­ЁҐ dx
    div osn                                   ;¤Ґ«Ґ­ЁҐ б®¤Ґа¦Ё¬®Ј® dx ­  10
    push dx                                           ;ᮤҐа¦Ё¬®Ґ dx ў бвнЄ
    inc cx                                                   ;㢥«ЁзҐ­ЁҐ cx
    cmp ax,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


  Вверх
SergeCpp
Дата 16.12.2005, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Используй 32-битные регистры...

AX замени на EAX, например...

И далее аналогично...

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


Новичок



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

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



я пробовал, но потом в какой регистр результат помещаится я не помню (
у нас нормально прошло всего несколько пар за весь семестр и толком ничего не объясняли....
всё что тут есть я повыдирал из мануалов и учебников, но вот про регистры и куда результат при операциях помещаится я толком не понял...я удивляюсь, что прога ваще хоть чтото считает (

я бы дальше ковырялся сам но просто не успею до понеделька чтото сделать ( поэтому и прошу помощи у вас всех
PM MAIL   Вверх
SergeCpp
Дата 16.12.2005, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Типа так...

Код

m1:
    cmp al,'+'
    jne m2
    call input 
    mov EAX, d 
        add op1, EAX
    jmp menu


И DW замени на DD...

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


Новичок



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

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



не... ну это я понял... просто там же када переменная вордовая и регистр 16битный то результат записывается в один регистр, а когда двойная вордавая и 32битный регистр то результат уже в другой регистр... вот я и не знаю куда (
PM MAIL   Вверх
SergeCpp
Дата 16.12.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



???

add opl, EAX — вот про это ?

???

И что тут не работает ?

Ты в отладчике смотрел ?

PM MAIL WWW ICQ   Вверх
Siborn
Дата 16.12.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сделал я как ты сказал
все ошибки поуберал везде ах на еах поменял si на esi
теперь ваще непашет ничо
екзешник создался но прога не пашет...нет запроса на ввод примера и соответственно нет результата
PM MAIL   Вверх
Chingachguk
Дата 16.12.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

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



Цитата
и результат больше вордового, то он считает до 65535 а потом начинает снова с нуля


Ну так верно, что 16 битов в регистрах и результат, скажем умножения - это 32 бита,

mov ax,op1
mul d
mov op1,ax

; Хотя на самом деле тут результ в регистрах dx:ax (32 бита)

Ну допустим ты сделаешь 32 бита... Но все равно можно влепить такое число что и 32 будет мало...

А вот в calc.exe все можно сделать. Отчего ?

Дело в том, что ты можешь выбрать что писать. Либо "малый" калькулятор в котором в принципе нельзя вводить большие числа (например, больше 8 бит),

либо "настоящий", в котором можно вводить и считать любые числа, но тогда уже нужно как минимум сопроцессор использовать (или другие представления).



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Siborn
Дата 16.12.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Chingachguk
да нет
мне достаточно чтобы результат влезал в dd

тама в задании курсового больше не просят...и нужно чтоб считал с запятой ( а вот как запятую оформить я ваще не предстваляю.... (


PM MAIL   Вверх
Chingachguk
Дата 16.12.2005, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

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



Цитата
мне достаточно чтобы результат влезал в dd


Тогда используй 32-х битные накопители результата, ибо:

res dd ?

mov ax,val1
mul word ptr val2
; dx:ax=val1*val2
; 32 bits
mov word ptr res+2,dx
mov word ptr res,ax

; Деление 32 битов
mov dx,word ptr res+2
mov ax,word ptr res
div word ptr Divisor
; result: ax=res/Divisor, dx=res mod Divisor

Цитата
и нужно чтоб считал с запятой


А вот тут уже надо либо использовать сопроцессор, либо делать свой формат типа BCD (те когда ты предполагаешь "руками" в опрелеленном месте десятичную точку).

Например (цитата из книги Зубкова С.В.):

Цитата
5.5. Вычисления с фиксированной запятой
Существует широкий класс задач, где требуются вычисления с вещественными числами, но не требуется высокая точность вычислений. Например, в этот класс задач попадают практически все процедуры, оперирующие с координатами и цветами точек в двух- и трехмерном пространстве. Так как в результате все будет выводиться на экран с ограниченным разрешением и каждая компонента цвета будет записываться как 6- или 8-битное целое число, не требуются все те десятки знаков после запятой, которые вычисляет FPU. А раз не требуется высокая точность, можно выполнить вычисление значительно быстрее. Чаще всего для представления вещественных чисел с ограниченной точностью используется формат чисел с фиксированной запятой: целая часть числа представляется в виде обычного целого числа, и дробная часть — точно так же в виде целого числа (как мы записываем небольшие вещественные числа на бумаге).

Наиболее распространенные форматы для чисел с фиксированной запятой — 8:8 и 16:16. В первом случае на целую и на дробную части числа отводится по одному байту, а во втором — по одному слову. Операции с этими двумя форматами можно выполнять, помещая число в регистр (16-битаый — для формата 8:8 и 32-битный — для формата 16:16). Разумеется, можно придумать и использовать совершенно любой формат, например 5:11, но некоторые операции над такими числами могут усложниться.



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Siborn
Дата 16.12.2005, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Chingachguk
спасибо сейчас попробую...только можно коменты подробнее? а то я в ассме почти ничо не смыслю....почти вся прога из мануалов повыдергана и я особо не понял что ты написал )))

у нас ассм идёт всего семестр и на этом он закончицца и поэтому нам его бегло преподали и толком ничо не объяснили ((
Добавлено @ 15:19
Chingachguk
да и ещо можешь написать куда это вставить в моём коде?
а то я тама для вывода использую стэк а не переменные ....

PM MAIL   Вверх
Chingachguk
Дата 16.12.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

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



Не понял вопроса ?

Что значит - куда вставить ?

Вот твое умножение:

m3:
cmp al,'*' ;ба ў­Ґ­ЁҐ al б® §­ Є®¬ *
jne m4 ;Ґб«Ё ­Ґ а ў­®, в® ЇҐаҐе®¤ ­ m4
call input ;ўл§®ў Їа®жҐ¤гал ўў®¤
mov ax,op1 ;Є®ЇЁа®ў ­ЁҐ ®а1 ў е
mul d ;г¬­®¦Ґ­ЁҐ е ­ d
mov op1,ax ;Є®ЇЁа®ў ­ЁҐ е ў ®а1
jmp menu

op1 у тебя объявлена как ворд:

op1 dw 0

Ее надо сделать dword (32 бита) и соответственно заполнять из dx:ax после умножения.

Но вывод результата тоже должен быть 32 бита, те вот это:

output proc
mov ax,op1 ;Є®ЇЁа®ў ­ЁҐ ᮤЁа¦Ё¬®Ј® d ў е
mov cx,0 ;®Ў­г«Ґ­ЁҐ бе
out_dec:
mov dx,0 ;®Ў­г«Ґ­ЁҐ dx
div osn ;¤Ґ«Ґ­ЁҐ ᮤҐа¦Ё¬®Ј® dx ­ 10
push dx ;ᮤҐа¦Ё¬®Ґ dx ў бвнЄ
inc cx ;㢥«ЁзҐ­ЁҐ cx
cmp ax,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

Нужно будет поправить на вывод 32-х битного op1.

Имхо ты совсем слабо разбираешься чтобы самому все это подманьячить, так что лучше:

- оставь как есть - не более 16 битов результат;
- ну или садись за книжки и код и учись ;)






--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Siborn
Дата 16.12.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



то что слабовато разбираюсь я знаю и не скрываю ))

я понял что нада делать dd вместо dw

просто ты тама предложил вывод с помощью двух переменыых val1 и val2 если я правильно понял
так вот я подредачил все переменные под dd но оно теперь ваще не пашет ((

вот код подредаченый
Код

;Калькулятор. Выполняет +,-,*,/
;Для просмотра результата нужно нажать =
;-------------------------------начало сегмента данных-------------------------
dseg segment
op1 dd 0
d dd 0
osn dw 10
vv db 10,13,'вводите пример в виде: число1_знак операции_число2_знак равно',10,13,'$'
s db 10,13,'это не число',10,13,'$'
gr db 10,13,'это число очень большое',10,13,'$'
dey db 0
dseg ends
;---------------------------начало сегмента кода-------------------------------
code segment
assume cs:code, ds:dseg;установка связи между сегментами и сегментными регистрами
start:
    mov eax,dseg
    mov ds,eax
mov ah,9                                       ;строка с образцом ввода примера
mov dx,offset 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 в ах
    div d                                                  ;деление ах на d
    mov op1,eax                                        ;копирование ах в ор1
    jmp menu                                               ;переход на menu
;------------------------------процедуры---------------------------------------
;----------------------------процедура ввода-----------------------------------
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


Добавлено @ 15:55
забыл тама после dseg segment идёт строчка .386
прога запускаеца но ваще никаких запросов и сообщений
PM MAIL   Вверх
Chingachguk
Дата 16.12.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

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



Вот так работает кроме деления:

Код

;Калькулятор. Выполняет +,-,*,/
;Для просмотра результата нужно нажать =
.386
;-------------------------------начало сегмента данных-------------------------
dseg segment
op1 dd 0
d dd 0
osn dd 10
vv db 10,13,'вводите пример в виде: число1_знак операции_число2_знак равно',10,13,'$'
s db 10,13,'это не число',10,13,'$'
gr db 10,13,'это число очень большое',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                                       ;строка с образцом ввода примера
    mov dx,offset vv
    int 21h
    call input                                               ;ввод первого операнда

;    mov  ax,4c00h
;    int  21h

    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
;    mov  eax,dword ptr op1
;    mov  dword ptr d,eax
    call input                                       ;вызов процедуры ввода
    mov  eax,op1                                        ;копирование ор1 в ах

;    call output                                      ;вызов процедуры ввода
;    mov  eax,dword ptr d
;    mov  dword ptr op1,eax
;    call output                                      ;вызов процедуры ввода

    xor  edx,edx 

    div  dword ptr d                                                  ;деление ах на d
    mov  op1,eax                                        ;копирование ах в ор1

;;    call output                                      ;вызов процедуры ввода

    jmp menu                                               ;переход на menu
;------------------------------процедуры---------------------------------------
;----------------------------процедура ввода-----------------------------------
input proc                                               ;процедура ввода числа
    mov dword ptr 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
    cwd
    mov esi,eax                                        ;сохранение числа в si
    mov eax,d    ;копирование в ах числа, которое хранится в d (сначала = 0)
    mul dword ptr 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  edx,0                                                  ;обнуление edx
    div  osn                                   ;деление содержимого dx на 10
    push edx                                           ;содержимое dx в стэк
    inc  cx                                                   ;увеличение cx
    cmp  eax,0                                              ;сравнение ax с 0
    jne  out_dec                       ;если не равно, то переход на out_dec

dmet:
    pop  edx                                    ;содержимое стэка в dx 
    add  dl,'0'                                 ;прибавление к dl кода нуля 
    mov  ah,2h                                       ;вывод символа на экран
    int  21h

    dec  cx
    jnz  dmet                                                    ;цикл dmet

    mov  dl,'-'                                 ;прибавление к dl кода нуля 
    mov  ah,2h                                       ;вывод символа на экран
    int  21h

    ret
output endp
code ends
end start



Компилляция:

tasm.exe %1.asm
tlink %1.obj /3
pause





--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Siborn
Дата 16.12.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Chingachguk
спасибо только неработаит не деление а вычитание

и с отрицательными числами не работаит (

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

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

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


 




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


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

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