Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2010, 21:06   #1
askerpro
Новичок
Джуниор
 
Регистрация: 17.09.2009
Сообщений: 45
По умолчанию из C++ в асм) как вытащить нужный фрагмент?

Доброго времени суток.
Стоит задача
5.1. Написать процедуру, для определения, находится точка внутри окружности или вне ее. Координаты точки и радиус окружности вводятся с клавиатуры.
в ассемблере я примерно большой ноль, т.к. прогулял все лекции, но на с++ могу быстренько решить данную задачу.
а теперь вопрос.
можно ли из откомпилированного кода с++ достать нужный (чистый) фрагмент ассемблера?

или если сможете помочь с ассемблером, объясню алгоритм решения)
Берем круг с центром в точке C(x0,y0) и с радиусом R.
берем точку X(x1,y1).
чтобы определить, входит ли точка в окружность, нужно узнать
расстояние между C И Х и сравнить с R
если больше R - то не входит
если меньше - то входит
если равно - то точка лежит на окружности.

if ((x1-x0)^2+(y1-y0)^2<=R^2)
printf("Точка входит");
else
printf("Точка не входит)";

вот и весь код на с++

у меня есть образец кода ассемблера, для подобной задачи, но многие операнды мне не понятны и много коротких вставок, если кто-то мог в онлайне ответить на парочку вопросов, был бы очень признателен)

Последний раз редактировалось askerpro; 27.12.2010 в 21:10.
askerpro вне форума Ответить с цитированием
Старый 27.12.2010, 21:24   #2
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию

Я знаю как импортировать функции си для ассемблера. А чтоб чисто уже кусок воткнуть, по моему нельзя.
Вот пример:

Код:
section '.idata' import data readable writeable ; Секция импорта данных

library kernel32,'kernel32.dll',\ ; Подключаем динамические библиотеки
user32, 'user32.dll',\
msvcrt, 'msvcrt.dll'

include 'C:\fasmw16925\INCLUDE\api\kernel32.inc' ; Подключение kernel32
include 'C:\fasmw16925\INCLUDE\api\user32.inc' ; Подключение user32

import msvcrt,\ ; Импортируем функции си
printf, 'printf',\
scanf, 'scanf'
Devil21RUS вне форума Ответить с цитированием
Старый 27.12.2010, 21:39   #3
askerpro
Новичок
Джуниор
 
Регистрация: 17.09.2009
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Devil21RUS Посмотреть сообщение
Я знаю как импортировать функции си для ассемблера. А чтоб чисто уже кусок воткнуть, по моему нельзя.
Вот пример:

Код:
section '.idata' import data readable writeable ; Секция импорта данных

library kernel32,'kernel32.dll',\ ; Подключаем динамические библиотеки
user32, 'user32.dll',\
msvcrt, 'msvcrt.dll'

include 'C:\fasmw16925\INCLUDE\api\kernel32.inc' ; Подключение kernel32
include 'C:\fasmw16925\INCLUDE\api\user32.inc' ; Подключение user32

import msvcrt,\ ; Импортируем функции си
printf, 'printf',\
scanf, 'scanf'
спасибо за ответ)
но вы меня не много не поняли)
я запустил прогу на с++
можно ли как то дизассемблировать получившийся экзешник, и вытащить оттуда нужный код?
askerpro вне форума Ответить с цитированием
Старый 27.12.2010, 22:22   #4
Devil21RUS
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 13
По умолчанию

Ну чисто по моему вроде нельзя.
Насколько я знаю код только переделывают для другого языка. так невозможно из екзешника в другой язык программирования переделать.
Devil21RUS вне форума Ответить с цитированием
Старый 28.12.2010, 04:41   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Код:
if ((x1-x0)^2+(y1-y0)^2<=R^2)
printf("Точка входит");
else
printf("Точка не входит)";
с переводом на ассемблер выглядит так
Код:
.data
x1 dd число
x0 dd число
y1 dd число
y0 dd число
R dd число
.code
mov eax,x1
sub eax,x0; eax=x1-x0
imul eax; edx:eax=(x1-x0)^2
mov ecx,edx
mov ebx,eax
mov eax,y1
sub eax,y0; eax=y1-y0
imul eax; edx:eax=(y1-y0)^2
add ebx,eax
adc ecx,edx; ecx:ebx=(x1-x0)^2+(y1-y0)^2
mov eax,R
mul eax; edx:eax=R*R
sub ebx,eax
sbb ecx,edx; ecx:ebx=(x1-x0)^2+(y1-y0)^2 - R^2
test ecx,ecx
jns @1
 printf("Точка не входит") // ((x1-x0)^2+(y1-y0)^2 - R^2) > 0
goto @exit
@1: printf("Точка входит") // ((x1-x0)^2+(y1-y0)^2 - R^2) <= 0
@exit:
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать таблицу с полями в асм Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 01.12.2010 19:11
Как вывести информацию при нажатии на ссылку в нужный div ??? 333_org_ua HTML и CSS 1 13.11.2010 13:51
Как в Excel удалить\копировать фрагмент текста до определенного символа? Vatrolf Microsoft Office Excel 2 15.07.2010 14:24
Как программно выделить нужный RadioButton? bafy Компоненты Delphi 1 17.02.2009 11:38