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