Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler.doc
Скачиваний:
10
Добавлен:
20.04.2019
Размер:
12.47 Mб
Скачать

Void FloatToStr(double число, char * строка)

Пример. Формирование строки, содержащей запись вещественного числа

include masm32.inc

includelib masm32.lib

.data

Chislo dq 12.345

.data?

Stroka db 20 dup (?)

.code

push offset Stroka

push dword ptr Chislo+4

push dword ptr Chislo

call FloatToStr

Пример. Формирование строки с выражением вида число + число = число

.data

Obrazec db "Действие: %s + %s = %s",0

.data?

Stroka db 100 dup (?)

.code

push offset Stroka3

push offset Stroka2

push offset Stroka1

push offset Obrazec

push offset Stroka

call wsprintf

add esp,20

Вычисление сложных арифметических выражений

Любое арифметическое выражение можно вычислить по действиям.

При этом много времени будет затрачено на сохранение промежуточных результатов в памяти и их обратную загрузку для выполнения последующих действий.

Польский математик Ян Лукашевич (1878–1956) предложил простой алгоритм вычисления арифметических выражений, в котором для хранения промежуточных результатов используется стек.

Для определения порядка действий необходимо представить арифметическое выражение в виде дерева, в узлах которого находятся арифметические операции, а листья – операнды.

Например, дерево для выражения для вычисления дискриминанта квадратного уравнения будет иметь вид:

Для определения порядка действий необходимо обойти дерево слева-направо снизу-вверх:

Получим следующую последовательность команд:

1. Занести в стек число b

2. Умножить на число b

3. Занести в стек число 4

4. Умножить на число а

5. Умножить на число с

6. Выполнить реверсивное вычитание

.code

fld koef_B ; b

fmul koef_B ; b*b

fild int_4 ; 4

fmul koef_A ; 4*a

fmul koef_C ; 4*a*c

fsubr ST(0),ST(1) ; b*b-4*a*c

fstp D ; d = ST(0)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]