Алгоритм вычисления объема - Assembler
Формулировка задачи:
На языке Ассемблер реализовать алгоритм вычисления объёма заданной фигуры с использованием математического сопроцессора.
Решение задачи: «Алгоритм вычисления объема»
textual
Листинг программы
global _main extern _ExitProcess@4 extern _printf section .text use32 _main: push dword [h2+4] ; Помещаяем в стек h2 push dword [h2] push dword [h1+4] ; Помещаяем в стек h1 push dword [h1] push dword [a+4] ; Помещаяем в стек a push dword [a] push msg001 ; Помещаяем в стек ссылку на строку call _printf ; Вывод на экран add esp, 4 ; Убираем из стека ссылку на строку call volume ; Вычисляем объём push msg002 ; Помещаяем в стек ссылку на строку call _printf ; Вывод на экран add esp, 12 ; Очистка стека xor eax, eax ; Выход с результатом 0 push eax call _ExitProcess@4 volume: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; input: a, h1, h2 ; output: V ; fld qword [esp+4] fmul st0 fld qword [esp+12] fmul st1 fxch st1 fld qword [esp+20] fmulp st1 fld qword [c3] fdivp st1 faddp st1 fstp qword [esp+20] ret 16 section .data msg001 db "a = %f", 13, 10 db "h1 = %f", 13, 10 db "h2 = %f", 13, 10, 0 msg002 db "V = %f", 13, 10, 0 a dq 10.0 h1 dq 5.0 h2 dq 3.0 c3 dq 3.0
Объяснение кода листинга программы
Список элементов:
- global _main - объявление функции
- extern _ExitProcess@4 - экспортирована функция ExitProcess из библиотеки Windows
- extern _printf - экспортирована функция printf из библиотеки C run-time
- section .text use32 - описание раздела кода
- _main: - начало функции main
- push dword [h2+4] - помещение в стек h2
- push dword [h2] - помещение в стек h2
- push dword [h1+4] - помещение в стек h1
- push dword [h1] - помещение в стек h1
- push dword [a+4] - помещение в стек a
- push dword [a] - помещение в стек a
- push msg001 - помещение в стек ссылки на строку
- call _printf - вызов функции printf для вывода строки на экран
- add esp, 4 - очистка стека
- call volume - вызов функции volume для вычисления объема
- push msg002 - помещение в стек ссылки на строку
- call _printf - вызов функции printf для вывода строки на экран
- add esp, 12 - очистка стека
- xor eax, eax - результат вычисления функции main будет 0
- push eax - помещение в стек результата
- call _ExitProcess@4 - вызов функции ExitProcess с аргументом 0
- volume: - начало функции volume
- fld qword [esp+4] - загрузка в ST0 значения аргумента a
- fmul st0 - умножение значения ST0 на значение h2
- fld qword [esp+12] - загрузка в ST0 значения аргумента h1
- fmul st1 - умножение значения ST1 на значение h2
- fxch st1 - обмен значениями ST0 и ST1
- fld qword [esp+20] - загрузка в ST0 значения аргумента h2
- fmulp st1 - умножение значения ST1 на значение h2
- fld qword [c3] - загрузка в ST0 значения аргумента c3
- fdivp st1 - деление значения ST1 на значение ST0
- faddp st1 - сложение значения ST1 и ST0
- fstp qword [esp+20] - сохранение результата в переменную V
- ret 16 - выход из функции с аргументом 16
- section .data - описание раздела данных
- msg001 db
a = %f
, 13, 10 - определение строки msg001 - db
h1 = %f
, 13, 10 - определение строки h1 - db
h2 = %f
, 13, 10, 0 - определение строки h2 - msg002 db
V = %f
, 13, 10, 0 - определение строки msg002 - a dq 10.0 - определение переменной a
- h1 dq 5.0 - определение переменной h1
- h2 dq 3.0 - определение переменной h2
- c3 dq 3.0 - определение переменной c3
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д