[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 Недостаточно информации о коде, чтобы понять, что происходит после этого шага.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д