Ассемблерная вставка

Всем исключительно доброго времени дня или ночи :).
Захотелось мне попробовать ассемблерные вставки в C++, так же потренироваться в битовых операциях. В качестве практики решил написать программу, которая выводит содержимое РОН. Порылся в инете на счёт ассемблерных вставок и нашёл, что в gcc используется AT&T синтаксис. Написал код:

#include <iostream>

using namespace std;

const unsigned long _16_mask = 0x0000FFFF;
const unsigned long _8_high_mask = 0x0000FF00;
const unsigned long _8_low_mask = 0x000000FF;

int main()
{
    unsigned long eax, ebx, ecx, edx;
    asm volatile ( "movl %eax, eax" );
    asm volatile ( "movl %ebx, ebx" );
    asm volatile ( "movl %ecx, ecx" );
    asm volatile ( "movl %edx, edx" ); 
    cout << hex << uppercase 
         << "eax = " << eax 
         << "\n\tax = " << ( eax & _16_mask )
         << "\n\tah = " << ( eax & _8_high_mask )
         << "\n\tal = " << ( eax & _8_low_mask );
    cout << hex << uppercase
         << "\nebx = " << ebx 
         << "\n\tbx = " << ( ebx & _16_mask )
         << "\n\tbh = " << ( ebx & _8_high_mask )
         << "\n\tbl = " << ( ebx & _8_low_mask ); 
    cout << hex << uppercase
         << "\necx = " << ecx 
         << "\n\tcx = " << ( ecx & _16_mask )
         << "\n\tch = " << ( ecx & _8_high_mask )
         << "\n\tcl = " << ( ecx & _8_low_mask ); 
    cout << hex << uppercase
         << "\nedx = " << edx 
         << "\n\tdx = " << ( edx & _16_mask )
         << "\n\tdh = " << ( edx & _8_high_mask )
         << "\n\tdl = " << ( edx & _8_low_mask );
    return 0;
}

Код не компилируется с ошибками:

In function `main':
undefined reference to `eax'
undefined reference to `ebx'
undefined reference to `ecx'
undefined reference to `edx'
[Error] ld returned 1 exit status

Ругается на:

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

Я так понял, что переменные eax, ebx и т.д. не видно в этих вставках. Как сделать так, что бы переменные стало видно, и компилятор смог переварить этот код без проблем?

Перенеси определение переменных unsigned long eax, ebx, ecx, edx; из функции в глобальную область.

Не помогло, даже ещё хуже стало:

undefined reference to `eax'
undefined reference to `ebx'
undefined reference to `ecx'
undefined reference to `edx'
bad reloc address 0x16 in section `.text$_ZStoRRSt13_Ios_FmtflagsS_[__ZStoRRSt13_Ios_FmtflagsS_]'
final link failed: Invalid operation
[Error] ld returned 1 exit status

У меня такая же ерунда вылезает при компиляции в 32-битное приложение. При 64-битах — всё нормально компилится и работает.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.