[TASM] Не работает процедура вывода на экран - Assembler

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

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

Помогите пожалуйста в процедурой вывода. Моя процедура не выводит значение
; masm dos exe #
.286
.model   small
.stack 100h
.data
X dw ?
Y dw ?
mess1 db "Input number X: $"
mess2 db 10,13,"Input number Y: $"
mess3 db 10,13,"Result : ",'$'
stroka  db  10 dup (?),'$'
floatingPoint   db  ','
integral dw ?
fractional dw ?
F   dd  ?
.code
 
;Функция ввода числа
input PROC
next:
    mov ah,01h
    int 21h
    cmp al,2fh
    jl output
    sub al,30h
    xor ah,ah
    xchg ax,bx
    mov dx,0Ah
    mul dx
    add bx,ax
    jmp next
output:
    ret
input ENDP
 
;Функция вывода результата на экран
output1 proc
        ; помещаем в стек bx, cx и dx, чтобы потом вернуть первоначальные значения
        push    bx
        push    cx
        push    dx
        push    ax
        ; Проверяем число на знак.
        test    ax, ax
        jns     short unsigned
        ; Если оно отрицательное, выведем минус и оставим его модуль.
        mov     ah, 02h
        mov     dl, '-'
        int     21h
        pop     ax
        push    ax
        neg     ax
        ; Количество цифр будем держать в CX.
    unsigned:   
        xor     cx, cx
        mov     bx, 10
    count:   
        xor     dx, dx
        div     bx
        ; Делим число на десять. В остатке получается последняя цифра.
        ; Сразу выводить её нельзя, поэтому сохраним её в стэке.
        push    dx
        inc     cx
        ; А с частным повторяем то же самое, отделяя от него очередную
        ; цифру справа, пока не останется ноль, что значит, что дальше
        ; слева только нули.
        test    ax, ax
        jnz     short count
        ; Теперь приступим к выводу.
        mov     ah, 02h
    outLoop:   pop     dx
        ; Извлекаем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
        ; Повторим ровно столько раз, сколько цифр насчитали.
        loop    outLoop
        pop     ax
        pop     dx
        pop     cx
        pop     bx
        ret
output1 endp

start:  
    mov ax,@data
    mov ds,ax
    ;-----------------------------------------------------------------------------
    ;F = (12563h - 78) / Х + (Y * 2852)
    ;Вывод строки mess1 на экран
    mov ah,09
    lea dx,mess1
    int 21h
    ;Ввод числа X
    call input
    mov X,bx
    xor bx,bx
    ;Вывод строки mess2 на экран
    mov ah,09
    lea dx,mess2
    int 21h
    ;Ввод числа Y
    call input
    mov Y,bx
    
    ;-----------------------------------------------------------------------------
    mov dx,1
    mov ax,2563h
    sub ax,78h ;2563h - 78
    sbb dx,0
        div X ; (12563 - 78) / X
    mov cx,ax
    mov ax,2852h
    mul Y     ; (Y * 2852) = 37B4
        add ax,cx  ; (12563 - 78) / X + (Y * 2852)
        adc dx,0
    mov word ptr F,ax ;F=(12563h - 78) / X + (Y * 2852) 
    mov word ptr F+2,dx
    
    mov integral,ax
    mov fractional,dx
    ;-----------------------------------------------------------------------------
    mov ah,09
    lea dx,mess3
    int 21h
    
    mov ax,integral
    call output1
    
    mov ah,09
    lea dx,floatingPoint
    int 21h
    
    mov ax,fractional
    call output1

    ;Выход из программы
    mov ah,4Ch
    int 21h
end start

Решение задачи: «[TASM] Не работает процедура вывода на экран»

textual
Листинг программы
  finit               ;инициализация FPU
    fild    F
    fbstp   z           ;результат в упакованном BCD-формате в z
    cmp byte ptr [bx-1+z],0

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

  1. [finit] - Инициализация FPU
  2. [fild F] - Загрузка числа в FPU
  3. [fbstp z] - Вычисление числа в упакованном BCD-формате и результат в z
  4. [cmp byte ptr [bx-1+z],0] - Сравнение значения в памяти с 0 Недостаточно информации о коде, чтобы понять, что происходит после этого шага.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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