![]() |
|
|
![]()
|
|
| Siborn |
|
|||
|
Unregistered |
Помогите пожалуста с курсовиком... Нужно написать калькулятор, который делит, умножает, суммирует и вычитает... Я почти всё сделал, только, когда складываю или умножаю числа большие и результат больше вордового, то он считает до 65535 а потом начинает снова с нуля (при вычитании из меньшего числа большего он тоже так делает только в другую сторону - доходит до нуля и потом в обратном порядке от 65535 вниз)
и ещё нужно при попытке деления на ноль, чтобы выводилось сообщение о том, что на ноль делить нельзя... Ну и если возможно чтоб считал числа с запятой... з.ы. Извините, что комменты нечитабельны - код написан в фаре... в блокноте с шрифтом Terminal всё видно з.з.ы.пожалуйста хоть кто-нибудь помогите, нужно очень срочно - в понедельник сдача курсача...я неделю сидел мучил комп, но так и не придумал как сделать, чтобы работало нормально... з.з.з.ы. Заранее благодарен вот код
|
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: нет Всего: 124 |
Используй 32-битные регистры...
AX замени на EAX, например... И далее аналогично... |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
я пробовал, но потом в какой регистр результат помещаится я не помню (
у нас нормально прошло всего несколько пар за весь семестр и толком ничего не объясняли.... всё что тут есть я повыдирал из мануалов и учебников, но вот про регистры и куда результат при операциях помещаится я толком не понял...я удивляюсь, что прога ваще хоть чтото считает ( я бы дальше ковырялся сам но просто не успею до понеделька чтото сделать ( поэтому и прошу помощи у вас всех |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: нет Всего: 124 |
Типа так...
И DW замени на DD... |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
не... ну это я понял... просто там же када переменная вордовая и регистр 16битный то результат записывается в один регистр, а когда двойная вордавая и 32битный регистр то результат уже в другой регистр... вот я и не знаю куда (
|
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: нет Всего: 124 |
???
add opl, EAX — вот про это ? ??? И что тут не работает ? Ты в отладчике смотрел ? |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
сделал я как ты сказал
все ошибки поуберал везде ах на еах поменял si на esi теперь ваще непашет ничо екзешник создался но прога не пашет...нет запроса на ввод примера и соответственно нет результата |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Ну так верно, что 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. |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Chingachguk
да нет мне достаточно чтобы результат влезал в dd тама в задании курсового больше не просят...и нужно чтоб считал с запятой ( а вот как запятую оформить я ваще не предстваляю.... ( |
|||
|
||||
| Chingachguk |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Тогда используй 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 (те когда ты предполагаешь "руками" в опрелеленном месте десятичную точку). Например (цитата из книги Зубкова С.В.):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Chingachguk
спасибо сейчас попробую...только можно коменты подробнее? а то я в ассме почти ничо не смыслю....почти вся прога из мануалов повыдергана и я особо не понял что ты написал ))) у нас ассм идёт всего семестр и на этом он закончицца и поэтому нам его бегло преподали и толком ничо не объяснили (( Добавлено @ 15:19 Chingachguk да и ещо можешь написать куда это вставить в моём коде? а то я тама для вывода использую стэк а не переменные .... |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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. |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
то что слабовато разбираюсь я знаю и не скрываю ))
я понял что нада делать dd вместо dw просто ты тама предложил вывод с помощью двух переменыых val1 и val2 если я правильно понял так вот я подредачил все переменные под dd но оно теперь ваще не пашет (( вот код подредаченый
Добавлено @ 15:55 забыл тама после dseg segment идёт строчка .386 прога запускаеца но ваще никаких запросов и сообщений |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Вот так работает кроме деления:
Компилляция: tasm.exe %1.asm tlink %1.obj /3 pause -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Siborn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 16.12.2005 Репутация: нет Всего: нет |
Chingachguk
спасибо только неработаит не деление а вычитание и с отрицательными числами не работаит ( эхх....но всё равно спасибо |
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |