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
Используя GCC
__asm__("movl %edx, %eax\n\t"
"addl $2, %eax\n\t");
Используя VC ++
__asm {
mov eax, edx
add eax, 2
}
В GCC, существует больше к нему, чем это. В инструкции необходимо сказать компилятор, что изменилось, так, чтобы его оптимизатор не завинчивал. Я не эксперт, но иногда это выглядит примерно так:
asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");
Это - хорошая идея записать некоторый пример кода в C, затем попросить, чтобы GCC произвел протокол ассемблирования, затем изменил тот код.
Хорошее начало прочитало бы эту статью, которые говорят о встроенном ассемблерном коде в 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 ;
}
Компиляторы Non-x86 Microsoft не поддерживают встроенный ассемблерный код. Необходимо определить целую функцию в отдельном исходном файле блока и передать ее ассемблеру.
Вы очень вряд ли будете в состоянии звонить в BIOS под операционной системой защищенного режима и должны использовать любые средства, доступны в той системе. Даже если Вы находитесь в привилегированном режиме, это, вероятно, небезопасно - BIOS не может правильно синхронизироваться относительно состояния ОС, если Вы делаете так.