Вывод сообщения - Assembler
Формулировка задачи:
После вывода вещественного числа, не могу вывести сообщение. TASM
.286C
.model small
.data
flt_num dq -324.7341234781
x dq 5.5
y dq 1.1
m1 DB 'Hello World',13,10,'$'
.code
start:
mov ax, @data
mov ds, ax
finit
fld x
fld y
fadd
push 10
call outfloat
.exit
length_frac equ [bp+4]
ten equ word ptr [bp-2]
temp equ word ptr [bp-4]
OutFloat proc near
enter 4, 0
mov ten, 10
ftst
fstsw ax
sahf
jnc @positiv
mov al, '-'
int 29h
fchs
@positiv:
fld1
fld st(1)
fprem
fsub st(2), st
fxch st(2)
xor cx, cx
@1:
fidiv ten
fxch st(1)
fld st(1)
fprem
fsub st(2), st
fimul ten
fistp temp
push temp
inc cx
fxch st(1)
ftst
fstsw ax
sahf
jnz @1
@2:
pop ax
add al, '0'
int 29h
loop @2
fstp st
fxch st(1)
ftst
fstsw ax
sahf
jz @quit
mov al, '.'
int 29h
mov cx, length_frac
@3:
fimul ten
fxch st(1)
fld st(1)
fprem
fsub st(2), st
fxch st(2)
fistp temp
mov ax, temp
or al, 30h
int 29h
fxch st(1)
ftst
fstsw ax
sahf
loopne @3
@quit:
fstp
fstp st
leave
ret 2
OutFloat endp
mov ax, @data
mov ds, ax
mov dx,offset m1
mov ah,9
int 21h
mov ax,4c00h
int 21h
end startРешение задачи: «Вывод сообщения»
textual
Листинг программы
.286C .model small .stack .data flt_num:dq -324.7341234781 x: dq 5.5 y: dq 1.1 m1: DB 13,10,'Hello World',13,10,'$' .code start: mov ax, @data mov ds, ax finit fld x fld y fadd push 10 call outfloat mov dx,offset m1 mov ah,9 int 21h mov ax,4c00h int 21h length_frac equ [bp+4] ten equ word ptr [bp-2] temp equ word ptr [bp-4] OutFloat proc near enter 4, 0 mov ten, 10 ftst fstsw ax sahf jnc @positiv mov al, '-' int 29h fchs @positiv: fld1 fld st(1) fprem fsub st(2), st fxch st(2) xor cx, cx @1: fidiv ten fxch st(1) fld st(1) fprem fsub st(2), st fimul ten fistp temp push temp inc cx fxch st(1) ftst fstsw ax sahf jnz @1 @2: pop ax add al, '0' int 29h loop @2 fstp st fxch st(1) ftst fstsw ax sahf jz @quit mov al, '.' int 29h mov cx, length_frac @3: fimul ten fxch st(1) fld st(1) fprem fsub st(2), st fxch st(2) fistp temp mov ax, temp or al, 30h int 29h fxch st(1) ftst fstsw ax sahf loopne @3 @quit: fstp fstp st leave ret 2 OutFloat endp end start
Объяснение кода листинга программы
Список элементов кода:
- Переменные flt_num, x, y, m1, являются переменными типа double и содержат числа с плавающей точкой.
- Код начинается с вызова функции outfloat, которая принимает на вход число типа double, обрабатывает его и выводит в консоль.
- Затем код выводит строку
Hello Worldс символом доллара в конце. - Далее происходит попытка вывода числа с плавающей точкой в консоль. Функция outfloat обрабатывает число, преобразуя его в строку, используя арифметические операции для получения цифр после запятой.
- Для вывода цифр после запятой используется цикл, который повторяется до тех пор, пока не будут выведены все цифры числа.
- В конце кода происходит возврат в основную программу.