Существует ли способ вставить ассемблерный код в C?

id(1)
1923344848  # identity of the location in my memory    
>> a = 1
>> b = a  # or equivalently b = 1, because 1 is immutable
>> id(a)
1923344848
>> id(b)
1923344848

Как вы видите a и b, это просто имена, ссылающиеся на один и тот же объект 1. Если позже вы напишете a = 2, вы переназначите имя a на другой объект 2, но не на b, который будет продолжать ссылаться на 1:

>> id(2)
1923344880
>> a = 2
>> id(a)
1923344880  # same as id(2)
>> id(b)
1923344848  # same as id(1)

Что будет произойдет, если у вас есть изменяемый объект?

>> id([1])
328817608
>> id([1])
328664968  # different
>> a = [1]
>> id(a)
328817800
>> id(a)
328817800  # same as before
>> b = a  # not equivalent to b = [1]
>> id(b)
328817800  # same as id(a)

Теперь вы ссылаетесь на один и тот же объект списка по именам a и b. Вы можете мутировать этот список, но он останется одним и тем же объектом, а a и b будут продолжать ссылаться на него

>> a[0] = 2
>> a
[2]
>> b
[2]
>> id(a)
328817800  # same as before
>> id(b)
328817800  # same as before
54
задан kristianp 1 May 2012 в 20:00
поделиться

4 ответа

Используя GCC

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

Используя VC ++

__asm {
  mov eax, edx
  add eax, 2
}
63
ответ дан Niall 7 November 2019 в 08:03
поделиться

В GCC, существует больше к нему, чем это. В инструкции необходимо сказать компилятор, что изменилось, так, чтобы его оптимизатор не завинчивал. Я не эксперт, но иногда это выглядит примерно так:

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

Это - хорошая идея записать некоторый пример кода в C, затем попросить, чтобы GCC произвел протокол ассемблирования, затем изменил тот код.

13
ответ дан Martin Del Vecchio 7 November 2019 в 08:03
поделиться

Хорошее начало прочитало бы эту статью, которые говорят о встроенном ассемблерном коде в C/C++:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

Пример от статьи:

#include <stdio.h>


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}
5
ответ дан Espo 7 November 2019 в 08:03
поделиться

Компиляторы Non-x86 Microsoft не поддерживают встроенный ассемблерный код. Необходимо определить целую функцию в отдельном исходном файле блока и передать ее ассемблеру.

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

2
ответ дан Spike0xff 7 November 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: