Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ассемблерный код в программе c++


Автор: fullnull 21.7.2008, 21:15
Всем привет!
Проблемка: нужно вставить asm-код в программу на cpp

TASM программа:
Код

    .model small
    .stack 100h
    .data
message    db    'Hello World!', '$'
    .code
main_proc       proc far
    mov ax,@data
    mov ds,ax
    mov ah,09h
    lea dx,message
    int 21h
                           mov ax,4C00h
    int 21h
    ret
main_proc endp
    end main_proc


Нужно выполнить то же самое в программе на C++:
Код

int main()
{
       char *message = "Hello World!$";
       asm {
                 mov ah,09h
                 lea dx,message
                 int 21h
       }
      return 0;
}


Программа не компилиться, куча ошибок. Слышал, что gcc не дружит с таким способом вставки asm-кода. Но как это сделать?

Автор: SABROG 21.7.2008, 21:49
Учи синтаксис AT&T

gcc использует компилятор ассемблера gas

Первое что выдал гугл:

http://sig9.com/articles/att-syntax
http://ru.wikipedia.org/wiki/AT&T_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

А теперь насчет самого ассемблерного кода. Если программа будет собираться под линуксом, то она работать не будет, там совершенно другие прерывания.

Кстати вот еще что. У gcc есть опция -masm-compat, но нигде нет информации о том как с ней работать.

Автор: fullnull 24.7.2008, 20:39
Я сделал все, чтобы не учить этот непривлекательный для меня синтаксис. Вот что я нашел:
http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gcc/invoking-gcc.html

Цитата

-masm=dialect
Output asm instructions using selected dialect. Supported choices are intel or att (the default one). 


Автор: xvr 25.7.2008, 11:28
Цитата(fullnull @ 24.7.2008,  20:39)
Я сделал все, чтобы не учить этот непривлекательный для меня синтаксис. 

А придется  smile 

Цитата

Вот что я нашел:
http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gcc/invoking-gcc.html

Цитата

-masm=dialect
Output asm instructions using selected dialect. Supported choices are intel or att (the default one). 

Это опция, которая заставляет gcc генерировать на выходе ассемблер в другом формате, но она не сможет научить gas понимать его  smile 
Кстати, совершенно непонятно, для чего этот ассемблер нужен - получить GPF (и аварийное завершение программы) можно и гораздо более простыми срособами  smile 

Автор: nerezus 27.7.2008, 13:07
fullnull, код на асме должен быть для целевой платформы. А синтаксис - для конкретного компилятора.

Автор: jonie 27.7.2008, 23:59
можно скомпилить отдельные части ассемблером, что понимает синтаксис intel и прилинковать эту функциональность при линковке частей из cpp ... незнаю как это сделать с gcc, но уверен что такое возможно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)