- •Программирование
- •Синтаксис языка Ассемблера
- •Xchg Приемник, Источник
- •Inc Операнд
- •Imul eax, b ; возможна потеря !!!
- •Idiv Источник
- •Стек. Команды работы со стеком
- •Подпрограммы
- •Структура приложения Win32 api
- •Функции Windows api Функции Windows api сохраняют значения регистров ebp, ebx, esi, edi и могут модифицировать регистры eax, ecx, edx
- •Int MessageBox (hwnd hWnd, char * сообщение, char * заголовок, int стиль) вывод диалогового окна с текстовым сообщением и одной-двумя-тремя кнопками (см. Тему«Стандартные диалоги»)
- •Int wsprintf (char * строка, char * образец, …) формирование текстовой строки по образцу
- •Int ReleaseDc(hwnd hWnd,hdc hDc) освободить заданный дескриптор контекста устройства, связанный с заданным окном
- •Арифметический сопроцессор
- •Void FloatToStr(double число, char * строка)
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)