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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler]Квадратное уравнение, Решить квадратное уравнение 
V
    Опции темы
Гениальный123Робот
Дата 3.5.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Написать программу, находящую решение квадратного урвнения 
ax2 + bx + c = 0 с помощью сопроцессора. 
Спасибо заранее

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


Опытный
**


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

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



Цитата(Гениальный123Робот @  3.5.2007,  12:02 Найти цитируемый пост)
с помощью сопроцессора

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


Опытный
**


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

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



У меня кроме условия никаких дополнений нет. Не знаю. smile  
PM MAIL   Вверх
JAPH
Дата 3.5.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И всё-таки,
a, b, c вводятся с клавы или определены в программе?
Корни выводить или сохранять в некоторые переменные?
Корни вещественные или комплексные?

anwe, FPU = мат. сопроцессор


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Гениальный123Робот
Дата 3.5.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JAPH @ 3.5.2007,  19:07)
И всё-таки,
a, b, c вводятся с клавы или определены в программе?
Корни выводить или сохранять в некоторые переменные?
Корни вещественные или комплексные?

anwe, FPU = мат. сопроцессор

JAPH, если в условии не указано, то все равно ;) Как сможешь, так и реши, плиз
PS А если двумя методами, то еще лучше... 
PM MAIL   Вверх
JAPH
Дата 3.5.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Реализовал самый сложный вариант. Пусть не лучшим образом, но вроде работает.
Комментарии писать уже лень, если что, задавайте вопросы, завтра, maybe, поясню.
Код
        .486C
cseg    segment use16
        assume  cs: cseg, ds: nothing, ss: sseg
outp:   push    ax
        push    cx
        push    dx
        push    bp
        mov     bp, sp
        push    000Ah
        push    0000h
        setc    cl
        ftst
        fstsw   ax
        sahf
        setc    ch
        mov     ah, 02h
        mov     dl, 20h
        int     21h
        test    cl, cl
        jnz     short @13
        mov     dl, 3Dh
        int     21h
        mov     dl, 20h
        int     21h
@13:    test    ch, ch
        jz      short @14
        mov     dl, 2Dh
        int     21h
        jmp     short @15
@14:    test    cl, cl
        jz      short @15
        mov     dl, 2Bh
        int     21h
@15:    fabs
        fld1
        fld     st(1)
        fprem
        fsub    st(2), st
        fxch    st(2)
        fild    word ptr [bp - 2]
        xor     cx, cx
        fld     st(1)
@16:    fprem
        fist    word ptr [bp - 4]
        push    word ptr [bp - 4]
        inc     cx
        fsubp   st(2), st
        fdiv    st(1), st
        fld     st(1)
        ftst
        fstsw   ax
        sahf
        jnz     short @16
        fstp    st(0)
        fstp    st(1)
        mov     ah, 02h
@17:    pop     dx
        add     dl, 30h
        int     21h
        loop    @17
        fxch    st(2)
        ftst
        fstsw   ax
        sahf
        jz      short @18
        mov     ah, 02h
        mov     dl, 2Eh
        int     21h
        mov     cx, 0006h
@19:    fmul    st, st(2)
        fxch    st(1)
        fld     st(1)
        fprem
        fsubr   st, st(2)
        fsub    st(2), st
        fistp   word ptr [bp - 4]
        mov     dl, [bp - 4]
        add     dl, 30h
        mov     ah, 02h
        int     21h
        fxch    st(1)
        ftst
        fstsw   ax
        sahf
        loopnz  @19
@18:    fstp    st(0)
        fstp    st(0)
        fstp    st(0)
        leave
        pop     dx
        pop     cx
        pop     ax
        ret
inp:    push    ax
        push    dx
        push    bp
        mov     bp, sp
        push    000Ah
        push    0000h
        mov     ah, 02h
        mov     dl, 20h
        int     21h
        mov     dl, 3Dh
        int     21h
        mov     dl, 20h
        int     21h
        fld1
@10:    mov     ah, 01h
        int     21h
        cmp     al, 2Dh
        jne     short @2
        fchs
        jmp     short @10
@2:     fldz
@7:     cmp     al, 0Dh
        je      short @3
        cmp     al, 2Eh
        je      short @4
        sub     al, 30h
        jb      short @5
        cmp     al, 09h
        jbe     short @6
@5:     mov     ax, 4C00h
        int     21h
@6:     fimul   word ptr [bp - 2]
        mov     [bp - 4], al
        fiadd   word ptr [bp - 4]
        mov     ah, 01h
        int     21h
        jmp     short @7
@4:     fld1
@9:     mov     ah, 01h
        int     21h
        cmp     al, 0Dh
        je      short @8
        sub     al, 30h
        jb      short @5
        cmp     al, 39h
        ja      short @5
        fidiv   word ptr [bp - 2]
        fld     st(0)
        mov     [bp - 4], al
        fimul   word ptr [bp - 4]
        faddp   st(2), st
        jmp     short @9
@8:     fstp    st(0)
@3:     fmulp   st(1), st
@1:     mov     ah, 02h
        mov     dl, 0Ah
        int     21h
        leave
        pop     dx
        pop     ax
        ret
@:      mov     ah, 02h
        mov     dl, 61h
        finit
        int     21h
        call    inp
        inc     dl
        int     21h
        call    inp
        inc     dl
        int     21h
        call    inp
        fxch    st(2)
        ftst
        fstsw   ax
        sahf
        jnz     short @20
        fstp    st(0)
        ftst
        fstsw   ax
        sahf
        jnz     short @21
        fstp    st(0)
        ftst
        fstsw   ax
        sahf
        mov     ah, 02h
        mov     dl, 21h
        jz      short @22
        mov     dl, 3Fh
@22:    int     21h
        fstp    st(0)
        jmp     @5
@21:    fdivp   st(1), st
        fchs
        mov     ah, 02h
        mov     dl, 78h
        int     21h
        clc
        call    outp
        jmp     @5
@20:    fdiv    st(2), st
        fdivp   st(1), st
        fld1
        fadd    st(0), st
        fdivp   st(1), st
        fchs
        fst     st(2)
        fmul    st(0), st
        fsubrp  st(1), st
        ftst
        fstsw   ax
        sahf
        mov     ah, 02h
        mov     dl, 78h
        ja      short @11
        jb      short @12
        fstp    st(0)
        int     21h
        clc
        call    outp
        jmp     @5
@11:    fsqrt
        fsub    st(1), st
        fadd    st(0), st
        fadd    st, st(1)
        int     21h
        clc
        call    outp
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     dl, 78h
        int     21h
        clc
        call    outp
        jmp     @5
@12:    fchs
        fsqrt
        fxch    st(1)
        fld     st(1)
        fchs
        fld     st(1)
        int     21h
        clc
        call    outp
        stc
        call    outp
        mov     ah, 02h
        mov     dl, 69h
        int     21h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     dl, 78h
        int     21h
        clc
        call    outp
        stc
        call    outp
        mov     dl, 69h
        int     21h
        jmp     @5
cseg    ends
sseg    segment use16 stack
        db      0400h dup (?)
sseg    ends
        end     @



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Гениальный123Робот
Дата 4.5.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое. Придет время, буду разбираться! И спрошу... 
PM MAIL   Вверх
Faraon_nick
Дата 27.11.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



JAPH  можешь прокаментировать написанное тобою плз.
PM MAIL   Вверх
JAPH
Дата 27.11.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
        .486C
cseg    segment use16
        assume  cs: cseg, ds: nothing, ss: sseg
; Процедура вывода числа на вершине стэка FPU. Число после вывода выталкивается
outp:   push    ax
        push    cx
        push    dx
        push    bp
        mov     bp, sp
        push    000Ah        ; Основание нашей системы счисления
        push    0000h        ; Ячейка для передачи цифр из FPU в CPU
        setc    cl        ; CL = 1 для вывода ' +' или ' -' перед числом, CL = 0 для вывода ' = ' или ' = -'
        ftst
        fstsw   ax
        sahf
        setc    ch        ; CH = 1 if ST(0) < 0
        mov     ah, 02h    ; Выводим пробел
        mov     dl, 20h
        int     21h
        test    cl, cl
        jnz     short @13
        mov     dl, 3Dh        ; '='
        int     21h
        mov     dl, 20h
        int     21h
@13:    test    ch, ch
        jz      short @14
        mov     dl, 2Dh        ; '-'
        int     21h
        jmp     short @15
@14:    test    cl, cl
        jz      short @15
        mov     dl, 2Bh        ; '+'
        int     21h
@15:    fabs            ; Со знаком разобрались, выводим модуль числа
        fld1            ; Сначала отделим целую и дробную части
        fld     st(1)
        fprem
        fsub    st(2), st
        fxch    st(2)        ; ST(0) = целая часть, ST(1) = 1, ST(2) = дробная часть
        fild    word ptr [bp - 2]
        xor     cx, cx        ; ST(0) = 10, ST(1) = целая часть, ST(2) = 1, ST(3) = дробная часть
        fld     st(1)
@16:    fprem            ; Получаем последнюю цифру ST(0)
        fist    word ptr [bp - 4]    ; Сохраняем её в стэке, так как цифры получаются справа налево,
        push    word ptr [bp - 4]    ; а выводить их надо слева направо
        inc     cx        ; Увеличиваем счётчик цифр целой части
        fsubp   st(2), st    ; Сдвигаем ST(0) на одну цифру вправо
        fdiv    st(1), st
        fld     st(1)
        ftst            ; Если ST(0) = 0, то целую часть разобрали
        fstsw   ax
        sahf
        jnz     short @16    ; ST(0) = 0, ST(1) = 10, ST(2) = 0, ST(3) = 1, ST(4) = дробная часть
        fstp    st(0)
        fstp    st(1)        ; ST(0) = 10, ST(1) = 1, ST(2) = дробная часть
        mov     ah, 02h
@17:    pop     dx        ; Выводим цифры целой части на экран
        add     dl, 30h
        int     21h
        loop    @17
        fxch    st(2)        ; ST(0) = дробная часть, ST(1) = 1, ST(2) = 10
        ftst
        fstsw   ax
        sahf
        jz      short @18    ; Если дробная часть ноль, выводить её не будем
        mov     ah, 02h        ; Иначе начинаем с точки
        mov     dl, 2Eh
        int     21h
        mov     cx, 0006h    ; Выведем не более шести цифр
@19:    fmul    st, st(2)    ; Сдвигаем дробную часть на одну цифру влево, получаем a.bcd... Выделим a
        fxch    st(1)        ; ST(0) = 1, ST(1) = a.bcd..., ST(2) = 10
        fld     st(1)        ; ST(0) = a.bcd, ST(1) = 1, ST(2) = a.bcd..., ST(3) = 10
        fprem            ; ST(0) = 0.bcd, ST(1) = 1, ST(2) = a.bcd..., ST(3) = 10
        fsubr   st, st(2)    ; ST(0) = a, ST(1) = 1, ST(2) = a.bcd..., ST(3) = 10
        fsub    st(2), st    ; ST(0) = a, ST(1) = 1, ST(2) = 0.bcd..., ST(3) = 10
        fistp   word ptr [bp - 4]
        mov     dl, [bp - 4]    ; Выводим очередную цифру дробной части
        add     dl, 30h
        mov     ah, 02h
        int     21h
        fxch    st(1)
        ftst
        fstsw   ax
        sahf
        loopnz  @19        ; Если дробная часть ноль, или уже выведено шесть цифр, закругляемся
@18:    fstp    st(0)        ; Очистка стэка сопроцессора
        fstp    st(0)
        fstp    st(0)
        leave
        pop     dx
        pop     cx
        pop     ax
        ret
; Процедура ввода числа. Введённое число сохраняется на вершине стэка
inp:    push    ax
        push    dx
        push    bp
        mov     bp, sp
        push    000Ah        ; Инициализируем кадр стэка
        push    0000h
        mov     ah, 02h        ; Выводим ' = '
        mov     dl, 20h
        int     21h
        mov     dl, 3Dh
        int     21h
        mov     dl, 20h
        int     21h
        fld1            ; Знак числа
@10:    mov     ah, 01h        ; Вводим символ
        int     21h
        cmp     al, 2Dh        ; '-'
        jne     short @2
        fchs            ; Если введён минус, меняем +1 на -1
        jmp     short @10    ; и вводим следующий символ
@2:     fldz            ; Будущее число
@7:     cmp     al, 0Dh        ; <Enter> - конец ввода
        je      short @3
        cmp     al, 2Eh        ; '.' - переход к вводу дробной части
        je      short @4
        sub     al, 30h
        jb      short @5    ; < '0' или > '9' - ошибка
        cmp     al, 09h
        jbe     short @6
@5:     mov     ax, 4C00h    ; При ошибке молча завершаемся
        int     21h
@6:     fimul   word ptr [bp - 2]
        mov     [bp - 4], al    ; Иначе ST(0) = 10 * ST(0) + введённая цифра
        fiadd   word ptr [bp - 4]
        mov     ah, 01h
        int     21h
        jmp     short @7
@4:     fld1            ; Ввод дробной части. 1 суть 10 в степени 0
@9:     mov     ah, 01h
        int     21h
        cmp     al, 0Dh        ; <Enter> - конец ввода
        je      short @8
        sub     al, 30h
        jb      short @5    ; < '0' || > '9' - ошибка
        cmp     al, 39h
        ja      short @5
        fidiv   word ptr [bp - 2]
        fld     st(0)        ; Формируем 10 в следующей степени и дублируем её
        mov     [bp - 4], al    ; Умножаем на введённую цифру, тем самым получая её на нужном месте
        fimul   word ptr [bp - 4]
        faddp   st(2), st    ; И добавляем к числу
        jmp     short @9
@8:     fstp    st(0)        ; Убираем 10 в степени
@3:     fmulp   st(1), st    ; Вспоминаем про знак
@1:     mov     ah, 02h        ; Допереводим строку
        mov     dl, 0Ah
        int     21h
        leave
        pop     dx
        pop     ax
        ret
; Точка входа
@:      mov     ah, 02h        ; Вводим коэффициенты квадратного уравнения
        mov     dl, 61h        ; 'a'
        finit
        int     21h
        call    inp
        inc     dl        ; 'b'
        int     21h
        call    inp
        inc     dl        ; 'c'
        int     21h
        call    inp
        fxch    st(2)
        ftst            ; Проверяем a == 0
        fstsw   ax
        sahf
        jnz     short @20
        fstp    st(0)        ; Проверяем a == 0 && b == 0
        ftst
        fstsw   ax
        sahf
        jnz     short @21
        fstp    st(0)        ; Проверяем a == 0 && b == 0 && c == 0
        ftst
        fstsw   ax
        sahf
        mov     ah, 02h
        mov     dl, 21h        ; Если все коэффициенты ноль, бесконечно много решений
        jz      short @22
        mov     dl, 3Fh        ; Иначе нет решений
@22:    int     21h
        fstp    st(0)        ; Очистка стэка сопроцессора
        jmp     @5
@21:    fdivp   st(1), st    ; Решаем линейное уравнение ST(0) x + ST(1) = 0, получаем x = - ST(1) / ST(0)
        fchs
        mov     ah, 02h
        mov     dl, 78h        ; 'x'
        int     21h
        clc            ; Выводим ' = ' и решение
        call    outp
        jmp     @5
@20:    fdiv    st(2), st    ; Решаем квадратное уравнение axx + bx + c = 0, a = ST(0), b = ST(1), c = ST(2)
        fdivp   st(1), st    ; Приводим его к виду xx + b/a x + c/a = 0
        fld1
        fadd    st(0), st
        fdivp   st(1), st
        fchs            ; Вычислили -b/2a
        fst     st(2)        ; ST(0) = ST(2) = -b/2a, ST(1) = c/a
        fmul    st(0), st    ; ST(0) = bb/4aa, ST(1) = ac/aa, ST(2) = -b/2a
        fsubrp  st(1), st    ; ST(0) = (bb-4ac)/4aa, ST(1) = -b/2a
        ftst            ; Проверка на знак дискриминанта, совпадающий со знаком ST(0)
        fstsw   ax
        sahf
        mov     ah, 02h
        mov     dl, 78h        ; 'x'
        ja      short @11
        jb      short @12
        fstp    st(0)        ; Дискриминант равен 0, оба корня суть -b/2a
        int     21h
        clc
        call    outp        ; Ну, выводим
        jmp     @5
@11:    fsqrt            ; Дискриминант > 0. ST(0) = sqrt(bb-4ac)/2a, ST(1) = -b/2a (в случае a > 0)
        fsub    st(1), st    ; ST(0) = sqrt(bb-4ac)/2a, ST(1) = -b/2a - sqrt(bb-4ac)/2a
        fadd    st(0), st    ; ST(0) = 2sqrt(bb-4ac)/2a, ST(1) = -b/2a - sqrt(bb-4ac)/2a
        fadd    st, st(1)    ; ST(0) = -b/2a + sqrt(bb-4ac)/2a, ST(1) = -b/2a - sqrt(bb-4ac)/2a (Для a < 0 корни получаются в обратном порядке)
        int     21h
        clc
        call    outp
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     dl, 78h
        int     21h
        clc
        call    outp
        jmp     @5
@12:    fchs            ; Дискриминант < 0. Корни суть (-b + i sqrt(4ac-bb))/2a и (-b - i sqrt(4ac-bb))/2a
        fsqrt            ; ST(0) = sqrt(4ac-bb)/2|a|, ST(1) = -b/2a
        fxch    st(1)
        fld     st(1)
        fchs
        fld     st(1)
        int     21h
        clc            ; Выводим корни - сначала действительную часть, потом мнимую,
        call    outp
        stc
        call    outp
        mov     ah, 02h
        mov     dl, 69h        ; потом 'i'
        int     21h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     dl, 78h
        int     21h
        clc
        call    outp
        stc
        call    outp
        mov     dl, 69h
        int     21h
        jmp     @5
cseg    ends
sseg    segment use16 stack
        db      0400h dup (?)
sseg    ends
        end     @



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
galerts
Дата 24.11.2012, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



A mozhno li etot kod napisatj po proshe? 

gde a , b, c vvoditsa s klaviatury

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

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


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

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

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

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


 




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


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

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