![]() |
|
Модераторы: bsa |
![]()
|
|
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: 1 Всего: 8 |
Как вставлять ASM код в код программы? asm ("mov ah,2"); не берёт! Матерится на все команды...
_asm(""); & _asm {} то-же не работают :( |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Это сообщение отредактировал(а) azesmcar - 13.6.2009, 12:12 |
||||
|
|||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: 1 Всего: 8 |
; обязательна?
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: 1 Всего: 8 |
а %?
|
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: 1 Всего: 8 |
Вот ещё проблмеа: при вызове int 21 говорит "suffix apperand invalid for int"
без вызова, ошибка |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
zim22, Простите. Но речь идет о GNU Assembler-е. Синтаксис другой)
Добавлено через 1 минуту и 5 секунд
Уважаемый. Вы что?!!! -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
извините, не досмотрел |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
azesmcar, За сцылку -
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ну и что, что не дос? и под DOS, и под Windows, и под Linux - везде прерывания используются. насколько я помню - прерывание это всего-навсего вызов функции, параметры которой заранее ложатся в регистры. Это сообщение отредактировал(а) zim22 - 13.6.2009, 16:32 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%BD%D0%B8%D0%B5
С прерываниям в виндоуз работает только сам виндоуз, а пользователю предоставляются API функции. В режиме ядра - не уверен. Думаю возможно использование некоторых аппаратных прерываний. Это сообщение отредактировал(а) azesmcar - 13.6.2009, 16:49 |
|||
|
||||
| zim22 |
|
||||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
я не понимаю к чему ссылка? вы со мной не согласны, что прерывания можно интерпретировать как вызов функций? Пример:
Это сообщение отредактировал(а) zim22 - 13.6.2009, 16:50 |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
zim22, И часто ты видел чтоб WIN32 приложения использовали прерывания?
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ну это дос. Это
В виндоуз это API функции а не прерывания. А аппаратные - запрещены в режиме пользователя. |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
функция о которой Вы говорите, не прерывание, а обработчик прерывания. |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Подробней плиз... -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
по поводу этого, может вы спутали с __fastcall? Этот calling convention применяется как рекомендация к передаче первых двух параметров функции через регистры ECX и EDX. В ДОС существует таблица векторов прерываний, на самом деле это просто область памяти в которой записан обработчик каждого прерывания ДОС. ДОС совершенно незащищенная ОС и потому она позволяет изменять таблицу. В ней можно переназначить вектор на свой обработчик. Так в ДОС перехватывают нажатие клавишы к примеру. Разумеется испортить таблицу - плевое дело. Один неверный шаг и вся ОС умрет. Вот такие дела. Кстати win98 далеко не ушел от ДОС, т.е. это была всего лишь графическая оболочка над ДОС. Это сообщение отредактировал(а) azesmcar - 13.6.2009, 17:24 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
я не силён в ассемблере, поэтому признаЮ свою неправоту, если она была. просто помню ещё с института преподаватель твердил: прерывание - это функция, в которую передаются параметры из регистров. Это сообщение отредактировал(а) zim22 - 13.6.2009, 17:37 |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Он ошибался Событие это функция. Функция может быть вызвана в результате события, но событие это не функция. Приравнивать их не стоит. Вот тут неплохо описано http://dklab.ru/doc/int.html#cont0 А может он просто пытался обяснить максимально ясно, типа
вот только по моему опыту, хорошему такие книги не учат. |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
А win95, milenium ? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: 1 Всего: 8 |
без вызова 21 прерывания, код не работает _asm{} вообе не работает :( раз-уж так пошло: может кто-нибудь подсказать другой способ выводить один писель на экран в MinGW? Из этого и получилась заворуха :( |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
прерывания использовать можно, если программа пишется для ДОС, т.е. работает под эмуляцией. вообще это вопрос по ассемблеру, для вывода пикселей надо сперва установить графический режим монитора. Есть же турбо ассемблер который запускается под виндоуз. Вообще стоило бы почитать http://forum.vingrad.ru/index.php?showtopic=34 Это сообщение отредактировал(а) azesmcar - 14.6.2009, 10:51 |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Ага, а с вызовом 21го прерывания программа будет работать, но недолго - до появления таблички 'Программа выполнила некоректную операцию и будет закрыта' (или как то так).
Про графику в консоли можете смело забыть - ну не поддерживает Винда графику в консоли для Win32 приложений, а MingW не умеет делать ДОС приложения |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Долго я пытался это объяснить -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zedx |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Подскажите, а как ЦЕЛИКОМ функцию на ассемблере вставить?
В делфях это было так:
в Си делаю:
Из-за того, что компилятор считает процедуру сишной, при входе в неё он самостоятельно сохраняет регистры в стек, а это нарушает работоспособность основного кода. Как его заставить делать только то, что указано в коде, т.е. как объявить чисто ассемблеровскую процедуру? |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
zedx, В gcc так нельзя.
http://www.opennet.ru/docs/RUS/gas/ Добавлено через 6 минут и 32 секунды так вот же! -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Как так? Сделать процедуру полностью ассемблерной? И кто такой gcc? |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Borland C++ 6.0 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
для бормана отдельный раздел
а вообще пиши на msvc2008 |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
А вообще, какая разница какой компилятор? Си он и в Африке Си.
Или как поставить вопрос: в каком сишном компиляторе возможно поключить процедуру на чистом асме и как это будет выглядить (код)? Всего-то и надо - объяснить компилятору, что в стек ничего пихать не надо, за него уже всё сделано. В делфях это делалось записью assembler, а как это сделать в Си? |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
zedx, в msvc это
__declspec(naked) убирает стандартные пролог и эпилог |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Получение функции БЕЗ стандартного стекового фрейма (и вообще без чего то) целиком зависит от используемого компилятора
В MSVC и BCB 6.0 это __declspec( naked ) перед определение функции (см тут) В gcc это #define + asm |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Про Си вопроса не было! Ты хочешь вставлять ассемблерный код, а это другое! -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
||||
|
||||
| DiGGeRR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 10.5.2009 Репутация: нет Всего: нет |
а как же __attribute__((naked))? |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Простите, что не по теме, но продолжу уже здесь.
Понадобилось мне тот же код перенести и в Linux (компилятор gcc 4.4.1). Правильно ли я сделал объявление и вызов процедуры sub_proc_1:
Просто, пришлось переводить ассемблер из Intel в AT&T и ещё не до конца перевёл и работоспособность проверить не могу, а компилятор вообще никак не возражает даже на отсутствие sub_proc_1, хотя в коде есть call sub_proc_1. Это сообщение отредактировал(а) zedx - 23.3.2010, 00:07 |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Под define+asm я имел в виду inline вставку asm в место вызова, а не стандартный call. Для нормальной процедуры надо использовать функцию с атрибутом __attribute__((naked)) (как DiGGeRR сказал) и asm вставку внутри нее
|
||||
|
|||||
| zedx |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Взял код из примера:
...и ошибка:
Что не так? И чем ему атрибут ret-а не понравился? |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
zedx, если не секрет, а у операции RET какие могут быть операнды?
|
|||
|
||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Облом -
Это сообщение отредактировал(а) xvr - 23.3.2010, 12:07 |
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
zedx, и еще. Скажи пожалуйста, зачем тебе это? Тебе не кажется, что секса от этого ассемблера слишком много? Может быть стоит немного подумать и отказаться от него вообще? А если вообще нельзя, то использовать маленькие вставки внутри процедур. Или ты пишешь ядро операционной системы?
|
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Видимо, на AVR архитектуре какие-то могут быть... сорри, взял пример, не поглядевши. И как быть? Я так понял нас интересует архитектура x86? Может другой компилятор попробовать? Компилирую своё расширение для php. Ассемблеровский код - 50k строк - перевести его на вменяемый язык не представляется возможным. Под виндой скомпилировал - работает замечательно. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
zedx, дизассемблировал закрытый код?
Если на ассемблере написано конечное приложение, то запустить на другой платформе будет очень затруднительно, так как есть привязка к системным вызовам и функциям конкретной ОС. |
|||
|
||||
| zedx |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Ага Нет, никаких привязок к системе нету. Алгоритм полностью автономен с кучей арифметических операций внутри (mov,xor, not, imul) - достаточно запустить и забрать результат. Задача только не допустить самодетельности от компилятора, ну и правильно перевести его в AT&T синтаксис (нашёл ta2at - она мне его автоматом почти без ошибок перевела)... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |