Нахождение дискриминанта - 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
Объяснение кода листинга программы
- Предполагается, что задача программы - вычисление дискриминанта для квадратного уравнения.
- Используется ассемблерный язык.
- Переменные
D
,x1
,x1o
,x2
,x2o
используются для хранения значений, связанных с решением уравнения. - Код начинается с определения сегментов стека и данных.
- Затем определены процедуры
Show_AX
иBegin
. - Процедура
Show_AX
используется для вывода чисел на экран. - В процедуре
Begin
происходит расчет дискриминанта (D) для уравнения 6x^2+12x=6=0. - Затем происходит расчет корней уравнения (x1, x2).
- После этого корни выводятся на экран с помощью процедуры
Show_AX
. - Программа завершается возвратом в DOS с кодом завершения 4C00h.