Задачка по асму

Mar 04, 2013 01:45

Я не сильно искушен в ассемблере. Тут давеча решал задачку, товарищу помогал. Насиделся много, с учетом того, что работа в nasm-e. Я просто оставлю это здесь.


Условие: Даны площади нескольких окружностей. Вывести радиус самой большой.

Решение:

global _main
extern _printf

section .data
arrayS dd 10.0, 144.0, 50.0, 1.0, 20.0 ; массив площадей
arraySize dd 5 ; размер массива
biggestS: dd 0.0 ; будет содержать самую большую площадь
message: db "R for the biggest S is %f", 0 ; форматная строка для printf
R: dq 0.0 ; найденный радиус

; code
section .text
_main:
mov ecx, [arraySize] ; длина массива
L1:
mov eax, [arrayS+ecx*4-4] ; выбираем одно значение из массива
cmp eax, [biggestS] ; сравниваем с наибольшим найденным
jb CONTINUE ; если eax < biggestS - ПРХ CONTINUE
mov [biggestS], eax ; сохраняем новое наибольшее значение площади
CONTINUE:
loop L1 ; идем на следующую итерацию. ecx уменьшается на 1. Цикл выполняется, пока ecx не станет = 0

finit ; инициализируем мат. сопроцессор
fld dword [biggestS] ; укладываем на стек сопроцессора делимое
fldpi ; укладываем на стек делитель (число Пи)
fdivp ; производим деление
fsqrt ; берем квадратный корень
fst qword [R] ; записываем результат в R

output:
mov eax, R ; записываем адрес переменной R в eax
fld QWORD [eax] ; заносим на стек сопроцессора переменную R (берем по адресу их eax)
sub esp,8 ; уменьшаем указатель на стек (обычный) на размер этой переменной (8 байт)
fstp QWORD [esp] ; заносим на обычный стек нашу переменную (стек находится по адресу esp)
push message ; заносим на стек форматную строку для printf
call _printf ; вызов printf
add esp,12 ; подчищаем стек после вызова (8 - число + 4 - указатель на строку)

end:
mov ax, 4C00h
ret
; code end

ассемблер, программирование

Previous post Next post
Up