Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка ASM кода в MinGW 
V
    Опции темы
jhonyxakep
  Дата 13.6.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Как вставлять ASM код в код программы? asm ("mov ah,2"); не берёт! Матерится на все команды...
_asm(""); & _asm {} то-же не работают :(
PM MAIL ICQ   Вверх
azesmcar
Дата 13.6.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Код

__asm__ ("movl %eax, %ebx");


Код

asm ("movl %eax, %ebx;");


Это сообщение отредактировал(а) azesmcar - 13.6.2009, 12:12
PM   Вверх
jhonyxakep
Дата 13.6.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



; обязательна?
PM MAIL ICQ   Вверх
azesmcar
Дата 13.6.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(jhonyxakep @  13.6.2009,  12:33 Найти цитируемый пост)
; обязательна? 

нет
PM   Вверх
jhonyxakep
Дата 13.6.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



а %?
PM MAIL ICQ   Вверх
andrew_121
Дата 13.6.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(jhonyxakep @  13.6.2009,  12:42 Найти цитируемый пост)
а %?

Да.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jhonyxakep
Дата 13.6.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Вот ещё проблмеа: при вызове int 21 говорит "suffix apperand invalid for int" 
без вызова, ошибка
PM MAIL ICQ   Вверх
zim22
Дата 13.6.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(jhonyxakep @  13.6.2009,  14:58 Найти цитируемый пост)
Вот ещё проблмеа: при вызове int 21 говорит "suffix apperand invalid for int" 

нет ошибки.
Код

__asm
{ 
  MOV AH,2 
  MOV DL,7 
  INT 21H 
} 



--------------------
PM MAIL   Вверх
andrew_121
Дата 13.6.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



zim22, Простите. Но речь идет о GNU Assembler-е. Синтаксис другой)

Добавлено через 1 минуту и 5 секунд
Цитата(jhonyxakep @  13.6.2009,  14:58 Найти цитируемый пост)
Вот ещё проблмеа: при вызове int 21 говорит "suffix apperand invalid for int" 

Уважаемый. Вы что?!!! smile  Какие прерывания в винде?!!! Это же не DOS!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 13.6.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(andrew_121 @  13.6.2009,  15:36 Найти цитируемый пост)
Простите. Но речь идет о GNU Assembler-е. Синтаксис другой)

извините, не досмотрел  smile 


--------------------
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



PM   Вверх
andrew_121
Дата 13.6.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



azesmcar, За сцылку -  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 13.6.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(andrew_121 @  13.6.2009,  15:36 Найти цитируемый пост)
 Какие прерывания в винде?!!! Это же не DOS!

ну и что, что не дос?  и под DOS, и под Windows, и под Linux - везде прерывания используются.
насколько я помню - прерывание это всего-навсего вызов функции, параметры которой заранее ложатся в регистры.

Это сообщение отредактировал(а) zim22 - 13.6.2009, 16:32


--------------------
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM   Вверх
zim22
Дата 13.6.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(zim22 @  13.6.2009,  16:31 Найти цитируемый пост)
насколько я помню - прерывание это всего-навсего вызов функции, параметры которой заранее ложатся в регистры.

Цитата(azesmcar @  13.6.2009,  16:39 Найти цитируемый пост)
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%...%BD%D0%B8%D0%B5

я не понимаю к чему ссылка? вы со мной не согласны, что прерывания можно интерпретировать как вызов функций?

Пример:
Код

mov ah, 9                       ; Номер функции DOS - в AH
mov dx, offset message ; Адрес строки - в DX
int 21h                           ; Вызов системной функции
ret
message db "Hello World!", 0Dh, 0Ah, '$'

Цитата

Команда INT 21h вызывает системную функцию DOS. 
Вызывается функция DOS номер 9 - вывести строку на экран.
Эта функция выводит строку от начала, адрес которого задается в регистрах DS:DX, до первого встречного символа $
При запуске COM-файла регистр DS автоматически загружается сегментным адресом программы, а регистр DX был подготовлен предыщущей командой.


Это сообщение отредактировал(а) zim22 - 13.6.2009, 16:50


--------------------
PM MAIL   Вверх
andrew_121
Дата 13.6.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



zim22, И часто ты видел чтоб WIN32 приложения использовали прерывания? smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  13.6.2009,  16:48 Найти цитируемый пост)
1:
mov ah, 9                       ; Номер функции DOS - в AH
mov dx, offset message ; Адрес строки - в DX
int 21h                           ; Вызов системной функции
ret
message db "Hello World!", 0Dh, 0Ah, '$'

Ну это дос. Это
Цитата

# Программные — инициируются выполняемой программой явным исполнением специальных инструкций, то есть синхронно, а не асинхронно. Программные прерывания могут служить для вызова сервисов операционной системы.

В виндоуз это API функции а не прерывания. А аппаратные - запрещены в режиме пользователя.
PM   Вверх
zim22
Дата 13.6.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(andrew_121 @  13.6.2009,  16:49 Найти цитируемый пост)
И часто ты видел чтоб WIN32 приложения использовали прерывания?

в силу специфики работы ни разу не видел. видел разве что ассемблерные вставки в критических к быстродейтсвию местах.


--------------------
PM MAIL   Вверх
mes
Дата 13.6.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  13.6.2009,  15:48 Найти цитируемый пост)
вы со мной не согласны, что прерывания можно интерпретировать как вызов функций?

Цитата(zim22 @  13.6.2009,  15:31 Найти цитируемый пост)
прерывание это всего-навсего вызов функции, параметры которой заранее ложатся в регистры.

функция о которой Вы говорите, не прерывание, а обработчик прерывания. smile



--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 13.6.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(mes @  13.6.2009,  16:53 Найти цитируемый пост)
функция о которой Вы говорите, не прерывание, а обработчик прерывания.

Подробней плиз...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  13.6.2009,  16:31 Найти цитируемый пост)
прерывание это всего-навсего вызов функции, параметры которой заранее ложатся в регистры.

по поводу этого, может вы спутали с __fastcall? Этот calling convention применяется как рекомендация к передаче первых двух параметров функции через регистры ECX и EDX.

Цитата(andrew_121 @  13.6.2009,  17:13 Найти цитируемый пост)
Подробней плиз... 

В ДОС существует таблица векторов прерываний, на самом деле это просто область памяти в которой записан обработчик каждого прерывания ДОС. ДОС совершенно незащищенная ОС и потому она позволяет изменять таблицу. В ней можно переназначить вектор на свой обработчик. Так в ДОС перехватывают нажатие клавишы к примеру. Разумеется испортить таблицу - плевое дело. Один неверный шаг и вся ОС умрет. Вот такие дела. Кстати win98 далеко не ушел от ДОС, т.е. это была всего лишь графическая оболочка над ДОС.

Это сообщение отредактировал(а) azesmcar - 13.6.2009, 17:24
PM   Вверх
zim22
Дата 13.6.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  13.6.2009,  17:19 Найти цитируемый пост)
по поводу этого, может вы спутали с __fastcall? 

я не силён в ассемблере, поэтому признаЮ свою неправоту, если она была. 
просто помню ещё с института преподаватель твердил: прерывание - это функция, в которую передаются параметры из регистров. smile

Это сообщение отредактировал(а) zim22 - 13.6.2009, 17:37


--------------------
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  13.6.2009,  17:37 Найти цитируемый пост)
просто помню ещё с института преподаватель твердил: прерывание - это функция, в которую передаются параметры из регистров

Он ошибался smile Тоже самое если сказать
Событие это функция. Функция может быть вызвана в результате события, но событие это не функция. Приравнивать их не стоит.

Вот тут неплохо описано
http://dklab.ru/doc/int.html#cont0

А может он просто пытался обяснить максимально ясно, типа
Цитата(Цитата из книги по C++)

Переменная - это такой "ящичек" с именем,
в котором может храниться некое ЗНАЧЕНИЕ.

вот только по моему опыту, хорошему такие книги не учат.
PM   Вверх
andrew_121
Дата 13.6.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(azesmcar @  13.6.2009,  17:19 Найти цитируемый пост)
Кстати win98 далеко не ушел от ДОС, т.е. это была всего лишь графическая оболочка над ДОС.

А win95, milenium ?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 13.6.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(andrew_121 @  13.6.2009,  17:53 Найти цитируемый пост)
А win95, milenium ? 

ну про 95-ый я даже забыл smile с ленолиум-ом сильно не знаком, но вроде одна хрень, что он, что 98-ой.
в NT и его потомках (2000, XP, Vista) это дело исправили.
PM   Вверх
jhonyxakep
Дата 14.6.2009, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Divide Et Impera
**


Профиль
Группа: Участник
Сообщений: 983
Регистрация: 7.4.2009
Где: Что, Когда?

Репутация: 1
Всего: 8



Цитата

Какие прерывания в винде?!!! Это же не DOS!


без вызова 21 прерывания, код не работает

_asm{} вообе не работает :(

раз-уж так пошло: может кто-нибудь подсказать другой способ выводить один писель на экран в MinGW? Из этого и получилась заворуха :(
PM MAIL ICQ   Вверх
azesmcar
Дата 14.6.2009, 10:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(jhonyxakep @  14.6.2009,  07:00 Найти цитируемый пост)
без вызова 21 прерывания, код не работает

прерывания использовать можно, если программа пишется для ДОС, т.е. работает под эмуляцией.
вообще это вопрос по ассемблеру, для вывода пикселей надо сперва установить графический режим монитора.
Есть же турбо ассемблер который запускается под виндоуз. Вообще стоило бы почитать
http://forum.vingrad.ru/index.php?showtopic=34

Это сообщение отредактировал(а) azesmcar - 14.6.2009, 10:51
PM   Вверх
xvr
Дата 15.6.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(jhonyxakep @ 14.6.2009,  07:00)
Цитата

Какие прерывания в винде?!!! Это же не DOS!


без вызова 21 прерывания, код не работает

_asm{} вообе не работает :(

Ага, а с вызовом 21го прерывания программа будет работать, но недолго - до появления таблички 'Программа выполнила некоректную операцию и будет закрыта' (или как то так).
Цитата

раз-уж так пошло: может кто-нибудь подсказать другой способ выводить один писель на экран в MinGW? 
Если это 'способ выводить пиксель на экран' - то я Папа Римский.
Про графику в консоли можете смело забыть - ну не поддерживает Винда графику в консоли для Win32 приложений, а MingW не умеет делать ДОС приложения  smile 
PM MAIL   Вверх
andrew_121
Дата 15.6.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(xvr @  15.6.2009,  18:07 Найти цитируемый пост)
ну не поддерживает Винда графику в консоли для Win32 приложений, а MingW не умеет делать ДОС приложения

Долго я пытался это объяснить smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zedx
Дата 15.8.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Подскажите, а как ЦЕЛИКОМ функцию на ассемблере вставить?
В делфях это было так:
Код

procedure someproc; assembler;
asm
// код
end;


в Си делаю:
Код

void someproc()
{
  asm
      {
       // код
       }
}


Из-за того, что компилятор считает процедуру сишной, при входе в неё он самостоятельно сохраняет регистры в стек, а это нарушает работоспособность основного кода. Как его заставить делать только то, что указано в коде, т.е. как объявить чисто ассемблеровскую процедуру? 
PM MAIL   Вверх
andrew_121
Дата 15.8.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



zedx, В gcc так нельзя.
http://www.opennet.ru/docs/RUS/gas/

Добавлено через 6 минут и 32 секунды
так вот же!
Цитата(azesmcar @  13.6.2009,  15:47 Найти цитируемый пост)
http://www.ibiblio.org/gferg/ldp/GCC-Inlin...mbly-HOWTO.html 




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zedx
Дата 15.8.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Цитата
zedx, В gcc так нельзя.

Как так? Сделать процедуру полностью ассемблерной?
И кто такой gcc? 
PM MAIL   Вверх
andrew_121
Дата 15.8.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(zedx @  15.8.2009,  16:38 Найти цитируемый пост)
И кто такой gcc?  

Ты запостил в тему про Mingw. Mingw - это GCC для виндавз.

Так под какой компилятор тебе нужно?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zedx
Дата 15.8.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Цитата
Так под какой компилятор тебе нужно?

Borland C++ 6.0

PM MAIL   Вверх
GoldFinch
Дата 15.8.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



для бормана отдельный раздел
а вообще пиши на msvc2008
PM MAIL ICQ   Вверх
andrew_121
Дата 15.8.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(zedx @  15.8.2009,  17:30 Найти цитируемый пост)
Borland C++ 6.0

http://forum.vingrad.ru/forum/borland-c++builder.html


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zedx
Дата 15.8.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



А вообще, какая разница какой компилятор? Си он и в Африке Си.
Или как поставить вопрос: в каком сишном компиляторе возможно поключить процедуру на чистом асме и как это будет выглядить (код)?

Всего-то и надо - объяснить компилятору, что в стек ничего пихать не надо, за него уже всё сделано. В делфях это делалось записью assembler, а как это сделать в Си?  smile  
PM MAIL   Вверх
nerezus
Дата 15.8.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

А вообще, какая разница какой компилятор? Си он и в Африке Си.
 Перепиши на с асмовый код и вставляй "в африке с".



--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
GoldFinch
Дата 15.8.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



zedx, в msvc это
Код

__declspec(naked)
T foo()
{__asm{

}}

__declspec(naked) убирает стандартные пролог и эпилог 
PM MAIL ICQ   Вверх
xvr
Дата 15.8.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(zedx @ 15.8.2009,  18:14)
А вообще, какая разница какой компилятор? 

Получение функции БЕЗ стандартного стекового фрейма (и вообще без чего то) целиком зависит от используемого компилятора
Цитата

Си он и в Африке Си.
Си, который в Африке, не специфицирует как управлять компилятором.
Цитата

Или как поставить вопрос: в каком сишном компиляторе возможно поключить процедуру на чистом асме и как это будет выглядить (код)?

В MSVC и BCB 6.0 это __declspec( naked ) перед определение функции (см тут)
В gcc это #define + asm

PM MAIL   Вверх
andrew_121
Дата 15.8.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(zedx @  15.8.2009,  18:14 Найти цитируемый пост)
А вообще, какая разница какой компилятор? Си он и в Африке Си.

Про Си вопроса не было! Ты хочешь вставлять ассемблерный код, а это другое!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zedx
Дата 15.8.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Цитата(xvr @  15.8.2009,  18:37 Найти цитируемый пост)
В MSVC и BCB 6.0 это __declspec( naked ) перед определение функции (см тут)

Во! Именно это мне и было нужно. Спасибо. smile
PM MAIL   Вверх
DiGGeRR
Дата 15.8.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.5.2009

Репутация: нет
Всего: нет



Цитата
В MSVC и BCB 6.0 это __declspec( naked ) перед определение функции (см тут)
В gcc это #define + asm


а как же __attribute__((naked))?
PM MAIL   Вверх
zedx
Дата 23.3.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Простите, что не по теме, но продолжу уже здесь.

Цитата(xvr @  15.8.2009,  18:37 Найти цитируемый пост)
В gcc это #define + asm

Понадобилось мне тот же код перенести и в Linux (компилятор gcc 4.4.1).

Правильно ли я сделал объявление и вызов процедуры sub_proc_1:

Код
#define sub_proc_1()
    asm volatile (    
    "movl    8(%esp),%ecx;"
    "movl    4(%esp),%edx;"
    "subl    $0x88,%esp;"
    "leal    0x88-0x44(%esp),%eax;"
    "pushl    %eax;"
    "pushl    %ecx;"
    "pushl    %edx;"
    "call    sub_proc_2;"
    "addl    $0x98,%esp;"
    "ret"    
    );

void fn(unsigned char* dString, unsigned char* CRC, int StringSize)
{
  asm volatile (    "movl    $CRC,%eax;"
        "pushl    %EAX;"
        "movl    $StringSize,%eax;"
        "pushl    %EAX;"
        "movl    $dString,%eax;"
        "pushl    %EAX;"
        "call    sub_proc_1;"
        "addl    $0x0C,%esp" );
}


Просто, пришлось переводить ассемблер из Intel в AT&T и ещё не до конца перевёл и работоспособность проверить не могу, а компилятор вообще никак не возражает даже на отсутствие sub_proc_1, хотя в коде есть call sub_proc_1.



Это сообщение отредактировал(а) zedx - 23.3.2010, 00:07
PM MAIL   Вверх
xvr
Дата 23.3.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата

Правильно ли я сделал объявление и вызов процедуры sub_proc_1:
Нет. Это получился голый define (без тела) и отдельно стоящий asm (уж не знаю как gcc это трактовал)
Под define+asm я имел в виду inline вставку asm в место вызова, а не стандартный call. Для нормальной процедуры надо использовать функцию с атрибутом __attribute__((naked)) (как DiGGeRR сказал) и asm вставку внутри нее

Цитата

а компилятор вообще никак не возражает даже на отсутствие sub_proc_1, хотя в коде есть call sub_proc_1.
На это будет возражать линкер

PM MAIL   Вверх
zedx
Дата 23.3.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Взял код из примера:
Код

__attribute__((naked)) void foobar(int a)
{
  asm volatile ("nop; ret r12");
}



...и ошибка:
Код
sudo gcc -o test test.c
test.c:4: warning: ‘naked’ attribute directive ignored
test.c: Assembler messages:
test.c:5: Error: suffix or operands invalid for `ret'


Что не так? И чем ему атрибут ret-а не понравился?
PM MAIL   Вверх
bsa
Дата 23.3.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zedx, если не секрет, а у операции RET какие могут быть операнды?
PM   Вверх
xvr
Дата 23.3.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(zedx @ 23.3.2010,  11:55)
Взял код из примера:
Код

__attribute__((naked)) void foobar(int a)
{
  asm volatile ("nop; ret r12");
}



...и ошибка:
Код
sudo gcc -o test test.c
test.c:4: warning: ‘naked’ attribute directive ignored


Облом -

Цитата

`naked'
     Use this attribute on the ARM, AVR, C4x and IP2K ports to indicate
     that the specified function does not need prologue/epilogue
     sequences generated by the compiler.  It is up to the programmer
     to provide these sequences.


Цитата

test.c: Assembler messages:
test.c:5: Error: suffix or operands invalid for `ret'

Что не так? И чем ему атрибут ret-а не понравился?
А что такое rl2 в ret?


Это сообщение отредактировал(а) xvr - 23.3.2010, 12:07
PM MAIL   Вверх
bsa
Дата 23.3.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zedx, и еще. Скажи пожалуйста, зачем тебе это? Тебе не кажется, что секса от этого ассемблера слишком много? Может быть стоит немного подумать и отказаться от него вообще? А если вообще нельзя, то использовать маленькие вставки внутри процедур. Или ты пишешь ядро операционной системы?
PM   Вверх
zedx
Дата 23.3.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Цитата(bsa @  23.3.2010,  12:06 Найти цитируемый пост)
 если не секрет, а у операции RET какие могут быть операнды?

Видимо, на AVR архитектуре какие-то могут быть... сорри, взял пример, не поглядевши.
Цитата(xvr @  23.3.2010,  12:06 Найти цитируемый пост)
Облом -

И как быть? Я так понял нас интересует архитектура x86? Может другой компилятор попробовать?
Цитата(bsa @  23.3.2010,  12:07 Найти цитируемый пост)
Скажи пожалуйста, зачем тебе это?

Компилирую своё расширение для php. Ассемблеровский код - 50k строк - перевести его на вменяемый язык не представляется возможным. Под виндой скомпилировал - работает замечательно.
PM MAIL   Вверх
bsa
Дата 23.3.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zedx, дизассемблировал закрытый код?  smile 

Если на ассемблере написано конечное приложение, то запустить на другой платформе будет очень затруднительно, так как есть привязка к системным вызовам и функциям конкретной ОС.
PM   Вверх
zedx
Дата 23.3.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Цитата(bsa @  23.3.2010,  12:55 Найти цитируемый пост)
дизассемблировал закрытый код?

Ага smile
Нет, никаких привязок к системе нету. Алгоритм полностью автономен с кучей арифметических операций внутри (mov,xor, not, imul) - достаточно запустить и забрать результат. Задача только не допустить самодетельности от компилятора, ну и правильно перевести его в AT&T синтаксис (нашёл ta2at - она мне его автоматом почти без ошибок перевела)... 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.