рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди - рд╕рдВрдЪрд╛рд▓рди рдЬреЛ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ / рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рджреВрд╕рд░реЗ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрд╢рди рдкрд░рдорд╛рдгреБ рд╣реЛрдЧрд╛ред рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдорд╛рдВрдбреНрд╕ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рдорд╛рдгреБрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд▓реЛрдб-рд▓рд┐рдВрдХ рдФрд░ рд╕реНрдЯреЛрд░-рд╕рд╢рд░реНрдд (
рдПрд▓рдПрд▓ / рдПрд╕рд╕реА ), рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк (
рд╕реАрдПрдПрд╕ ) рдФрд░ рдЕрдиреНрдпред
1. рдПрд▓рдПрд▓ / рдПрд╕рд╕реА
LL / SC рдХрдорд╛рдВрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг:
ldl_l / stl_c рдФрд░ ldq_l / stq_c (рдЕрд▓реНрдлрд╛), lwarx / stwcx (PowerPC), ll / sc (MIPS), рдФрд░ ldrex / strex (ARM 6 рдФрд░ рдКрдкрд░)ред
рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓рд╛ рдСрдкрд░реЗрдВрдб рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдпрд╛ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реНрдерд╛рди рдкрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдСрдкрд░реЗрдВрдб рдореЗрдВ рдирдП рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдСрдкрд░реЗрдВрдб 1 рдФрд░ 2 рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд╕рд╛рде рдореЗрдВ, рд╡реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд╕рднреА рдХрдорд╛рдВрдб рдСрдкрд░реЗрдиреНрдб рдХреЗ рдЙрд╕реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрд▓рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, lwarx / stwcx (PowerPC) рдпреБрдЧреНрдо рд▓реЗрдВ:
void atomic_incr(int * operand, int incr) { asm volatile ( "loop:\n\t" "lwarx 6,0,%0\n\t" "add 6,6,%1\n\t" "stwcx. 6,0,%0\n\t" "bne- loop" : : "r" (operand), "r" (incr) : "r6" ); }
рдпрд╣рд╛рдВ рд╕реЗ рдХреЛрдб рд▓рд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИредрдСрдкрд░реЗрдВрдб рд╕реЗ рдбреЗрдЯрд╛ 6 рд╡реЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ (рдСрдкрд░реЗрдВрдб) рдЖрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ 6 рд╡реАрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╣рдореЗрдВ рдСрдкрд░реЗрдВрдб рдФрд░ рдЗрдВрдХреНрд░реА рдХрд╛ рдпреЛрдЧ рдорд┐рд▓рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд░рд╛рд╢рд┐ рдХреЛ рдСрдкрд░реЗрдВрдб рдореЗрдВ рдЕрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдСрдкрд░реЗрдВрдб рдХреЗ рдЖрд░рдХреНрд╖рдг рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╡рд░реНрддрдорд╛рди рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд╣реАрдВ рдФрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рднрд▓реЗ рд╣реА рд╡рд╣реА рдореВрд▓реНрдп рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдкрд░реЗрдВрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рдпрд╣ 5 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдЕрд╕реЗрдВрдмрд▓реА рдкреИрд░рд╛рдореАрдЯрд░рдПрдХ рдЙрджрд╛рд╣рд░рдг:
: "= рдЖрд░" (рд╡реИрд▓), "= рдПрдо" (* рдореЗрдо)
: "0" (рд╡реИрд▓), "рдПрдо" (* рдореЗрдо)
: "рдореЗрдореЛрд░реА", "рд╕реАрд╕реА");
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред
"" рдЖрд░ "(рд╡реИрд▓) -% 0 рдПрдХ рд╕реНрдерд┐рд░ рдпрд╛ рдСрдкрд░реЗрдВрдб рд╣реИред gcc рдХреЛ% 0 рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
"" рдореА "(* рдореЗрдо) -% 1 рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореЗрдо рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реИ)ред
рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред
"0" (рд╡реИрд▓) - 0 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЙрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЪрд░ рд╕реЗ рдорд╛рди рдХреЛ рдЗрд╕рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
"рдПрдо" (* рдореЗрдо) - "рдПрдо" рдХрд╛ рдЕрд░реНрде "= рдПрдо" рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ "=" рдЪрд┐рд╣реНрди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╣рддреА рд╣реИ рдХрд┐ рдкрдврд╝рдирд╛ рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред
рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╡рд╣ рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджреА рдЬрд╛рдПрдЧреАред
"рдореЗрдореЛрд░реА" - рдореЗрдореЛрд░реА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
"Cc" - "рдХрдВрдбреАрд╢рди рдХреЛрдб рд░рдЬрд┐рд╕реНрдЯрд░"ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЭрдВрдбреЗ рдмрджрд▓ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг
рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
2. рдХреИрд╕
рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд╣реИ - рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдВрдб рдореЗрдВ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдирдП рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:
int compare_and_swap (int* reg, int oldval, int newval) { int old_reg_val = *reg; if (old_reg_val == oldval) *reg = newval; return old_reg_val; }
рдХреИрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди - рдбрдмрд▓ рддреБрд▓рдирд╛ рдФрд░ рд╕реНрд╡реИрдк (
CAS2 )ред рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдЪрд░ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХреНрд░рдорд╢рдГ рдПрдХ рдХреЗ рдмрдЬрд╛рдп, рджреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рджреЛ рдирдП рдорд╛рди рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯреАрдореЛрдВ рдХрд╛ рдпрд╣ рд╕рдореВрд╣ рдЕрдзрд┐рдХ "рдХрдордЬреЛрд░" рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ:
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЗрдВ: рддреБрд▓рдирд╛_рдФрд░_рд╕реНрд╡рд╛рдк (reg, 5, 7) рдФрд░ * reg = 5;
1) int old_reg_val = * reg; (old_reg_val = 5)
2) рдПрдХ рдФрд░ рдСрдкрд░реЗрд╢рди * рд░реЗрдЧ = 42 рдХрд░рддрд╛ рд╣реИ; funny_stuff; * рд░реЗрдЧ = 5;
3) рдпрджрд┐ (old_reg_val == oldval) - рдХрдерди рд╕рддреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЪрд░ рдХреЗ рдорд╛рди рдореЗрдВ рджреЛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рд╣реИрдВред рдпрд╣реА рд╣реИ, рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ
ABA рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВред рдореБрдЭреЗ рдбрдмрд▓-рд╡рд░реНрдб рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк рджрд┐рд▓рдЪрд╕реНрдк (рдЕрдХреНрд╕рд░ рдбрдмрд▓ рддреБрд▓рдирд╛ рдФрд░ рд╕реНрд╡реИрдк рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдорд┐рд▓реАред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
static inline char DWCAS(volatile DWORD *mem, DWORD old, DWORD new) { char r = 0; unsigned long old_h = old >> SHIFT, old_l = old; unsigned long new_h = new >> SHIFT, new_l = new; __asm__ __volatile__("lock; " CMPXCHGxB " (%6);" "setz %7; " : "=a" (old_l), "=d" (old_h) : "0" (old_l), "1" (old_h), "b" (new_l), "c" (new_h), "r" (mem), "m" (r) : "cc", "memory"); return r; }
рдпрд╣рд╛рдВ рд╕реЗ рдХреЛрдб рд▓рд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИредрдЙрдкрд╕рд░реНрдЧ "рд▓реЙрдХ;" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдмрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░реЗрд╖рд┐рдд рд╢рдмреНрдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдПрдмреАрдП рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕реЗ
рдкреЗрдЯреЗрдВрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛)ред
3. рд╕рд░рд▓ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рдиред
рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЬреЛрдбрд╝ рдпрд╛ рд╡реГрджреНрдзрд┐ рд╣реИред
рдЖрджреЗрд╢реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг: addl (i386), xaddl (x86)ред
рдпрд╣рд╛рдБ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдкрд░рдорд╛рдгреБ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ:
void atomic_add(int * operand, int incr) { asm volatile ( "lock; xaddl %1, (%0)\n"
рдХреБрдЫ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░, "рд▓реЙрдХ;" рдЙрдкрд╕рд░реНрдЧ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрдЯреЗрдирд┐рдпрдо рдкрд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ (
рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ ):
void atomic_oneup(int * operand) { uint64_t res;
рд╡реИрд╕реЗ, рд╡реЗрддрди рд╡реГрджреНрдзрд┐, рдХрдореА, + =, - = C ++ рдореЗрдВ рдкрд░рдорд╛рдгреБ (рдХрдо рд╕реЗ рдХрдо x86 рдФрд░ x86_64 рдкрд░) рд╣реИрдВред рдХреЛрдИ рдЙрдкрд╕рд░реНрдЧ "рд▓реЙрдХ" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдкрд░рдорд╛рдгреБ рднреА рдирд╣реАрдВ рд╣реИред рд╕реА ++ 11 рдореЗрдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред
int a =0; ++a;
рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ
c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 83 45 fc 01 addl $0x1,-0x4(%rbp)
рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдмрд▓ рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдкреНрд░рд╢реНрди: рдпрд╣ рд╣рд░ рдЫрд╛рддреНрд░ рдХреЛ рдкрддрд╛ рд╣реИ! рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ?
A: рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдХрд▓реНрдкрдирд╛ рдХреА рдереА рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд▓реЗ рдереЗред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред
рдкреНрд░рд╢реНрди: рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЧрд▓рддрд┐рдпрд╛рдВ рд╣реИрдВред
рдПрдХ: рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред
рдкреНрд░рд╢реНрди: рдХреНрдпрд╛? рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖? рд▓реЗрдЦ рд╣реА рдХрд╣рд╛рдБ рд╣реИ?
MSI ,
рдХреИрд╢ рдХреЛрд╣рд░реЗрдВрд╕ рдФрд░ %_with_smart_words% рдХрд╣рд╛рдВ рд╣реИрдВ?
A: рдореИрдВрдиреЗ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдирд╣реАрдВ рдХреАред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрди рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред
UPD: рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
lesha_penguin рдФрд░
TheShade ред