_RUNDUDE.ASM - Assembler

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

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

Всем привет! Нужна помощь с программой! Она запускается и сразу же вылетает. Естественно, я как ламер где-то наделал ошибок, НО ГДЕ?! Вот код программы:

P.S.:

И да, это тестовая версия программы, "чувак" пока может бегать только вверх и вниз
TITLE       RUNDUDE_by_DedSec
;------------------------------------------------------
.model      small
.stack      100h
.386
 
V_MOD = 0Dh
;------------------------------------------------------
.data
saveMode    db     ?
currX       dw     100
currY       dw     100
color       db     1
;------------------------------------------------------
.code
            mov    ax, @data
            mov    ds, ax
MAIN        proc   near
            mov    ah, 0
            mov    al, V_MOD
            int    10h
            call   VID_REST
            mov    ah, 0Ch
            mov    al, color
            mov    bh, 0
            mov    cx, currX
            mov    dx, currY
            int    10h
            call   KEY_LIST         
MAIN        endp            
VID_REST    proc   near
            mov    saveMode, al
            ret
VID_REST    endp
KEY_LIST    proc   near
            mov    ah, 10h
            int    16h
            cmp    ah, 50h
            je     K10
            cmp    ah, 48h
            je     K20
            cmp    al, 1Bh
            je     EXT
K10:
            dec    currY
            call   MAIN
K20:
            inc    currY
            call   MAIN
EXT:
            mov    ax, 4c00h
            int    21h
KEY_LIST    endp
end         MAIN

Решение задачи: «_RUNDUDE.ASM»

textual
Листинг программы
DECLARE FUNCTION ARCSIN! (x!)
 
CLS
CONST pi = 3.141593
CONST k = pi / 180
 
INPUT "A = "; a
INPUT "N = "; n
 
sinG = SIN(k * a) / n
g = ARCSIN(sinG)
 
SCREEN 11
WINDOW (-40, 30)-(40, -30)
 
yA = 30
xA = -30 * TAN(k * a)
yB = -30
xB = 30 * TAN(g)
FUNCTION ARCSIN (x)
   IF ABS(x) = 1 THEN
      ARCSIN = SGN(x) * pi / 2
   ELSE
      ARCSIN = ATN(x / SQR(1 - x ^ 2))
   END IF
END FUNCTION 
LINE (-40, 0)-(40, 0)
LINE (0, 0)-(xA, yA)
LINE (0, 0)-(xB, yB)
END

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

  1. Объявляется функция ARCSIN!, которая принимает аргумент x и возвращает значение типа вещественного числа.
  2. Очищается экран командой CLS.
  3. Устанавливаются значения констант pi и k через оператор CONST. Значение pi равно 3.141593, а k равно pi / 180.
  4. С помощью команды INPUT запрашивается у пользователя значения переменных A и N. Значения сохраняются в переменных a и n соответственно.
  5. Вычисляется значение sinG путем нахождения синуса угла a в радианах, умноженного на k, и деления результата на n.
  6. Вычисляется значение g путем нахождения обратного синуса sinG с помощью функции ARCSIN.
  7. На экране выводится графика с помощью команды SCREEN 11, которая устанавливает графический режим, и команды WINDOW, которая определяет размеры окна для рисования.
  8. Задаются значения переменных yA, xA, yB и xB. Значение yA равно 30, xA равно -30 умноженное на тангенс угла a в радианах, yB равно -30, а xB равно 30 умноженное на тангенс угла g.
  9. Определяется функция ARCSIN, которая принимает аргумент x и возвращает значение. Если абсолютное значение x равно 1, ARCSIN присваивает значение pi / 2 с противоположным знаком от x. В противном случае ARCSIN вычисляет арктангенс отношения x к квадратному корню из разности 1 и x в квадрате.
  10. С помощью команды LINE рисуются линии на графике. Линиями соединяются точки (-40, 0) и (40, 0), (0, 0) и (xA, yA), а также (0, 0) и (xB, yB).
  11. Код завершается.

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

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