Нахождение дискриминанта - Assembler

Узнай цену своей работы

Формулировка задачи:

написал код программы для нахождения дискриминанта выражения 6x^2+12x=6=0 1. правильно ли я использовал умножение и деление? 2. в строках 46-51 хочу поместить в свою переменную целую часть делителя и остаток. но компилятор ругается на то, что хочу запихнуть регистры al и ah
;6x^2+12x=6=0
 
data segment
    D dw ? 
    buf dw ?
    x1 dw ?
    x1o dw ?
    x2 dw ? 
    x2o dw ?
data ENDS
 
Code segment
    assume cs:code,ds:data
   org 100h
 
Begin:
   ;b^2-4ac
   mov bx, 12
   mov ax, 12
   mul bx
   mov cx, ax
   mov ax, 6
   mov bx, 6
   mul bx
   mov dx, 4
   mul dx
   sub bx, ax
   
   mov D, bx
   
   ;sqrt(D)
    fild D
    fsqrt
    fistp D
    
   ;x1 x2
   mov ax, -12
   mov bx, 12
   mov cx, D
   mov x1, cx
   mov x2, ax
   add x1, ax
   sub x2, cx
   mov ax, x1
   div bx
   mov x1, al
   mov x1o, ah
   mov ax, x2
   div bx
   mov x2, al
   mov x2o, ah
   
   mov ax,4c00h  
   int 21h
   
Code ends
end Begin

Решение задачи: «Нахождение дискриминанта»

textual
Листинг программы
;6x^2+12x=6=0
 
Stk segment para stack 'stack'
    db 1024 dup(?)
Stk ends
 
data segment
    D dw ?
    buf dw ?
    x1 dw ?
    x1o dw ?
    x2 dw ?
    x2o dw ?
data ENDS
 
Code segment
    assume cs:code,ds:data,ss:Stk
 
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        ;mov     cx, 10          ; cx - основание системы счисления
        xor     di, di          ; di - кол. цифр в числе
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
Begin:
   mov ax,data
   mov ds,ax
   ;b^2-4ac
   mov bx, 12
   mov ax, 12
   imul bx
   mov cx, ax
   mov ax, 6
   mov bx, 6
   imul bx
   mov dx, 4
   imul dx
   sub bx, ax
 
   mov D, bx
 
   ;sqrt(D)
    fild D
    fsqrt
    fistp D
 
   ;x1 x2
   mov ax, -12
   mov bx, 12
   mov cx, D
   mov x1, cx
   mov x2, ax
   add x1, ax
   sub x2, cx
   mov ax, x1
 
   idiv bx
   mov x1, ax
   mov x1o, dx
 
   mov ax, x2
   div bx
   mov x2, ax
   mov x2o, dx
 
   ;cout
 
   mov cx, 10
   mov ax, x1
   call Show_AX
   mov ax, x1o
   call Show_AX
   mov ax, x2
   call Show_AX
   mov ax, x2o
   call Show_AX
 
   mov ax,4c00h
   int 21h
 
Code ends
end Begin

Объяснение кода листинга программы

  1. Предполагается, что задача программы - вычисление дискриминанта для квадратного уравнения.
  2. Используется ассемблерный язык.
  3. Переменные D, x1, x1o, x2, x2o используются для хранения значений, связанных с решением уравнения.
  4. Код начинается с определения сегментов стека и данных.
  5. Затем определены процедуры Show_AX и Begin.
  6. Процедура Show_AX используется для вывода чисел на экран.
  7. В процедуре Begin происходит расчет дискриминанта (D) для уравнения 6x^2+12x=6=0.
  8. Затем происходит расчет корней уравнения (x1, x2).
  9. После этого корни выводятся на экран с помощью процедуры Show_AX.
  10. Программа завершается возвратом в DOS с кодом завершения 4C00h.

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы