ãã®èšäºã¯ã€ã³ã¹ãã¬ãŒã·ã§ã³ãšããŠåœ¹ç«ã¡ãŸããïŒ
ã¢ã»ã³ãã©ãŒãå匷ããŠ
ããCã
çè§£ããŠããŸãã ãããã¯ã¯è峿·±ããã®ã®ãç¶ç¶ã¯ããŸããããŸããã§ããã å€ãã®äººãã³ãŒããæžãããããã©ã®ããã«æ©èœããããçè§£ããããšæã£ãŠããŸãã ãã®ãããã³ãŒãã®åºæ¬æ§é ã®åæãšãšãã«ãCã³ãŒããéã³ã³ãã€ã«åŸã«ã©ã®ããã«èŠãããã«é¢ããäžé£ã®èšäºãéå§ããŸãã
èªè
ã«ã¯ãå°ãªããšã以äžã®åºæ¬çãªç¥èãå¿
èŠã§ãã
- ããã»ããµã¬ãžã¹ã¿
- ã¹ã¿ãã¯
- ã³ã³ãã¥ãŒã¿ãŒå
ã®æ°åã®è¡šçŸ
- ã¢ã»ã³ããªãšCæ§æ
ããããããããªããããããæã£ãŠããªããŠãããªãããã®ãããã¯ã«èå³ããããªããèšäºãèªãéçšã§ããããã¹ãŠãçŽ æ©ãã°ãŒã°ã«ã«ããããšãã§ããŸãã ãã®èšäºã¯åå¿è
ã察象ãšãããã®ã§ã¯ãããŸããããåå¿è
ãäœããå§ããããšãã§ããããã«ãç§ã¯å€ãã®ç°¡åãªããšãæ³šææ·±ãåã¿ãŸããã
äœã䜿çšããŸããïŒ
- ææ°ã®æšæºããµããŒãããCã³ã³ãã€ã©ãå¿
èŠã§ãã ideone.comã®ãªã³ã©ã€ã³ã³ã³ãã€ã©ã䜿çšã§ããŸãã
- ãŸããéã³ã³ãã€ã©ãå¿
èŠã§ããåã³ã godbolt.orgã®ãªã³ã©ã€ã³éã³ã³ãã€ã©ã䜿çšã§ããŸãã
- ãŸããã¢ã»ã³ãã©ãŒçšã®ã³ã³ãã€ã©ãŒã䜿çšããããšãã§ããŸããããã¯äžèšã®ãªã³ã¯ããå
¥æã§ããŸãã
ãªããã¹ãŠããªã³ã©ã€ã³ã«ãªã£ãŠããã®ã§ããïŒ ç°ãªãããŒãžã§ã³ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«èµ·å ããçŽäºã解決ããã®ã«äŸ¿å©ã ããã§ãã å€ãã®ã³ã³ãã€ã©ãŒããããååãªéã³ã³ãã€ã©ãŒããããŸããè°è«ã®äžã§ããããã®æ©èœãèæ
®ããããããŸããã
åŠç¿ãžã®ãã培åºçãªã¢ãããŒãã§ã¯ãã³ã³ãã€ã©ã®ãªãã©ã€ã³ããŒãžã§ã³ã䜿çšããããšããå§ãããŸããçŸåšã®gccãOlyDbgãããã³NASMã®æãååŸã§ããŸãã éãã¯æå°éã§ãªããã°ãªããŸããã
æãåçŽãªããã°ã©ã
ãã®èšäºã¯ãåé ã§åŒçšãããã®ãç¹°ãè¿ãããšãç®çãšããŠããŸããã ãã ããæåããå§ããå¿
èŠãããããããããªã¢ã«ã®äžéšã¯åŒ·å¶çã«äº€å·®ããŸãã çè§£ãé¡ã£ãŠããŸãã
æåã«åŠã¶ã¹ãããšã¯ãã³ã³ãã€ã©ãŒã¯ããŒãã¬ãã«ïŒ-O0ïŒãæé©åãããšãã§ãããããã°ã©ããŒã«ãã£ãŠæžãããã³ãŒããåæžã§ããããšã§ãã ãããã£ãŠãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
int main(void) { 5 + 3; return 0; }
以äžãšå€ãããŸããïŒ
int main(void) { return 0; }
ãããã£ãŠãéã³ã³ãã€ã«æã«ã³ãŒããæå³ã®ãããã®ã«å€æãããã®ã確èªã§ããããã«èšè¿°ããå¿
èŠããããããäŸã¯å°ãªããšãå¥åŠã«èŠãããããããŸããã
次ã«ãã³ã³ãã€ã«ãã©ã°ãå¿
èŠã§ãã
-O0ãš
-m32ã® 2ã€ã§ååã§ãã ããã«ããããŒãæé©åã¬ãã«ãš32ãããã¢ãŒããèšå®ãããŸãã æé©åãè¡ããšãæãããªã¯ãã§ããã³ãŒãã®è§£éãasmã§èŠããã¯ãããŸããããæé©åãããŠããŸããã ã¢ãŒãã§ã¯ãã¬ãžã¹ã¿ãŒãå°ãªã-ãšãã»ã³ã¹ãžã®æ³šç®åºŠãé«ãããšãæããã§ãã ç§ã¯å®æçã«ãããã®ãã©ã°ã倿ŽããŠãçŽ æãããæ·±ãæãäžããŠãããŸãã
ãããã£ãŠãgccã䜿çšããå Žåãã³ã³ãã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
gcc source.c -O0 -m32 -o source
ãããã£ãŠãgodboltã䜿çšããå Žåã¯ãã³ã³ãã€ã©ãŒã®éžæã®æšªã«ããå
¥åè¡ã§ãããã®ãã©ã°ãæå®ããå¿
èŠããããŸãã ïŒç§ãgcc 4.4.7ã§ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ããæåã®äŸã¯ãåŸã§å€æŽããŸãïŒ
ããã§ãæåã®äŸãèŠãããšãã§ããŸãïŒ
int main(void) { register int a = 1;
ãããã£ãŠã次ã®ã³ãŒãã¯ããã«äžèŽããŸãã
push ebp mov ebp, esp push ebx mov ebx, 1 mov eax, ebx pop ebx pop ebp ret
æåã®2è¡ã¯é¢æ°ã®ããããŒã°ïŒããæ£ç¢ºã«ã¯3è¡ã§ããã3è¡ç®ã説æããŸãïŒã«å¯Ÿå¿ããŠããã颿°ã®èšäºã§ããããåæããŸãã ä»ã¯æ³šæããªãã§ãã ãããæåŸã®3è¡ã«ãåãããšãåœãŠã¯ãŸããŸãã asmãããããªãå Žåã¯ããããã®ã³ãã³ãã®æå³ãèŠãŠã¿ãŸãããã
ã¢ã»ã³ãã©ãŒã®æç€ºã¯æ¬¡ã®ãšããã§ãã
ããŒã¢ããã¯dst src
ã€ãŸã
æç€ºåä¿¡è
ããœãŒã¹
ããã§ãATïŒTæ§æã®é åºãç°ãªãããšãäºçŽããå¿
èŠããããŸãããã®åŸãããã«æ»ããŸãããNASMã«äŒŒãæ§æã«èå³ããããŸãã
movåœä»€ããå§ããŸãããã ãã®åœä»€ã¯ãã¡ã¢ãªããã¬ãžã¹ã¿ããŸãã¯ã¬ãžã¹ã¿ããã¡ã¢ãªã«ç§»åããŸãã ãã®äŸã§ã¯ãçªå·1ãebxã¬ãžã¹ã¿ã«ç§»åããŸãã
ã¬ãžã¹ã¿ãŒãç°¡åã«èŠãŠã¿ãŸããããx86ã¢ãŒããã¯ãã£ãŒã«ã¯ã8ã€ã®32ãããæ±çšã¬ãžã¹ã¿ãŒããããŸããã€ãŸãããããã®ã¬ãžã¹ã¿ãŒã¯ãããã°ã©ããŒïŒãã®å Žåã¯ã³ã³ãã€ã©ãŒïŒãããã°ã©ã ãäœæãããšãã«äœ¿çšã§ããŸãã ã³ã³ãã€ã©ã¯ãç¹å¥ãªå Žåã«ebpãespãesiãããã³ediã¬ãžã¹ã¿ã䜿çšããŸãããããã«ã€ããŠã¯åŸã§æ€èšããã³ã³ãã€ã©ã¯ä»ã®ãã¹ãŠã®ããŒãºã«eaxãebxãecxãããã³edxã¬ãžã¹ã¿ã䜿çšããŸãã
ãããã£ãŠã
mov ebxã1ã¯ã
ã¬ãžã¹ã¿register int a = 1ã«çŽæ¥å¯Ÿå¿ã
ãŸãããããŠãå€1ãebxã¬ãžã¹ã¿ã«ç§»åãããããšãæå³ããŸãã
è¡
mov eax ebxã¯ãebxã¬ãžã¹ã¿ããã®å€ãeaxã¬ãžã¹ã¿ã«ç§»åãããããšãæå³ããŸãã
push ebxãš
pop ebxã® 2ã€ã®è¡ããããŸãã ãã¹ã¿ãã¯ãã®æŠå¿µã«ç²ŸéããŠããå Žåãã³ã³ãã€ã©ã¯æåã«ebxãã¹ã¿ãã¯ã«é
眮ããããã«ãã£ãŠã¬ãžã¹ã¿ã®å€ãå€ãèšæ¶ããããã°ã©ã ãçµäºããåŸããã®å€ãã¹ã¿ãã¯ããebxã¬ãžã¹ã¿ã«æ»ããããšã«æ°ä»ããŸãã
ã³ã³ãã€ã©ãŒãebxã¬ãžã¹ã¿ãŒããå€1ãeaxã«å
¥ããã®ã¯ãªãã§ããïŒ ããã¯ãC颿°åŒã³åºãã®èŠåã«ãããã®ã§ãã ããã€ãã®ãã€ã³ãããããŸããããããã¯ãã¹ãŠä»ç§ãã¡ã«èå³ããããŸããã éèŠãªããšã¯ãå¯èœã§ããã°çµæãeaxã§è¿ãããããšã§ãã ãããã£ãŠããŠããããeaxã§çµããçç±ã¯æããã§ãã
ãããä»ãè«ççãªè³ªåã¯ããªãebxãå¿
èŠãªã®ã§ããïŒ ãªã
mov eaxã1ããã«æžãããšãã§ããªãã£ãã®ã§ããïŒ æé©åã®ã¬ãã«ããã¹ãŠã§ãã ç§ã¯èšã£ãïŒã³ã³ãã€ã©ã¯ç§ãã¡ã®ã³ãŒããã«ãããã¹ãã§ã¯ãªããç§ãã¡ã¯
return 1ãæžãããã¬ãžã¹ã¿å€æ°ã䜿çšããŸããã ã€ãŸããã³ã³ãã€ã©ãŒã¯æåã«å€ãã¬ãžã¹ã¿ãŒã«å
¥ããŠãããèŠåã«åŸã£ãŠçµæãè¿ããŸããã æé©åã¬ãã«ãä»ã®ã¬ãã«ã«å€æŽãããšãebxã¬ãžã¹ã¿ã¯å®éã«ã¯å¿
èŠãªãããšãããããŸãã
ã¡ãªã¿ã«ãgodboltã䜿çšããå ŽåãCã®è¡ã«ããŠã¹ãåããããšããã®è¡ã匷調衚瀺ãããŠããã°ãasmã®ãã®è¡ã«å¯Ÿå¿ããã³ãŒãã匷調衚瀺ãããŸãã
ã¹ã¿ãã¯
äŸãè€éã«ããŠãã¬ãžã¹ã¿å€æ°ã®äœ¿çšã忢ããŸãããïŒããŸã䜿çšããŸãããïŒïŒã ãã®ã³ãŒããã©ããªããèŠãŠã¿ãŸãããïŒ
int main(void) { int a = 1;
ASMïŒ
push ebp mov ebp, esp sub esp, 16 mov DWORD PTR [ebp-8], 1 mov eax, DWORD PTR [ebp-8] add eax, 5 mov DWORD PTR [ebp-4], eax mov eax, DWORD PTR [ebp-4] leave ret
ç¹°ãè¿ããŸãããäžã®3è¡ãšäžã®2è¡ãã¹ãããããŸããããŒã«ã«å€æ°ãã§ããã®ã§ãã¹ã¿ãã¯äžã®ã¡ã¢ãªã«ã¡ã¢ãªãå²ãåœãŠãããŸãã ãããã£ãŠã次ã®éæ³ããããŸãïŒ
DWORD PTR [ebp-8] ãããã¯ã©ãããæå³ã§ããïŒ DWORD PTRã¯ããã«ã¯ãŒã倿°ã§ãã ã¯ãŒãã¯16ãããã§ãã ãã®çšèªã¯16ãããããã»ããµã®æä»£ã«åºãŸããæ£ç¢ºã«16ããããã¬ãžã¹ã¿ã«é
眮ãããŸããã ãã®ãããªå€§éã®æ
å ±ã¯èšèãšåŒã°ããããã«ãªããŸããã ã€ãŸãããã®å ŽåãdwordïŒããã«ã¯ãŒãïŒ2 * 16 = 32ããã= 4ãã€ãïŒéåžžã®intïŒã§ãã
ebpã¬ãžã¹ã¿ã«ã¯ãçŸåšã®é¢æ°ã®ã¹ã¿ãã¯ã®æäžéšã®ã¢ãã¬ã¹ãå«ãŸããŠããŸãïŒåŸã§ããã«æ»ããŸãïŒããããã£ãŠãã¢ãã¬ã¹èªäœãäžæžãããªãããã«4ãã€ãã·ããããã倿°ã®å€ã远å ããŸãã ãã®å Žåã倿°
aã«å¯ŸããŠ8ãã€ãã ãã·ãããããŸãã ããããæ¬¡ã®ã³ãŒããèŠããšã倿°
bã4ãã€ãã®ãªãã»ããã§ããããšãããããŸãã è§æ¬åŒ§ã¯äœæã瀺ããŸãã ã€ãŸãããã®è¡ã¯æ¬¡ã®ããã«æ©èœããŸããebpã«æ ŒçŽãããŠããã¢ãã¬ã¹ã«åºã¥ããŠãã³ã³ãã€ã©ã¯å€1ããµã€ãº4ãã€ãã®ebp-8ã¢ãã¬ã¹ã«é
眮ããŸãã ãªããã©ã¹8ã§ã¯ãªããã€ãã¹8ã ãã®é¢æ°ã«æž¡ããããã©ã¡ãŒã¿ãŒã¯ãã©ã¹ã«å¯Ÿå¿ãããããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
次ã®è¡ã¯ãå€1ãeaxã¬ãžã¹ã¿ã«ç§»åããŸãã 詳现ãªèª¬æã¯å¿
èŠãªããšæããŸãã
次ã«ã远å ïŒè¿œå ïŒããæ°ãã
addã¹ããŒãã¡ã³ãããããŸãã ã€ãŸããeaxïŒ1ïŒã®å€ã«5ãå ç®ãããå€6ãeaxã«ãªããŸãã
ãã®åŸãå€6ã倿°
bã«ç§»åããå¿
èŠããããŸããããã¯æ¬¡ã®è¡ã§è¡ãããŸãïŒå€æ°bã¯ã¹ã¿ãã¯äžã®ãªãã»ãã4ã«ãããŸãïŒã
æåŸã«ã倿°bã®å€ãè¿ãå¿
èŠããããããç§»åããå¿
èŠããããŸã
eaxã¬ãžã¹ã¿ã®å€ïŒ
mov eaxãDWORD PTR [ebp-4] ïŒã
åã®ãã®ã§ãã¹ãŠãæç¢ºã§ããã°ãããè€éãªãã®ã«é²ãããšãã§ããŸãã
è峿·±ããããŸãæçœã§ã¯ãªããã®ã
次ã®ããã«æžããšã©ããªããŸããïŒint var = 2.5;
ã¿ãªããã¯ãvarã«ã¯2ã®å€ããããšæ£ããçãããšæããŸãããå°æ°éšã¯ã©ããªããŸããïŒ ããã¯ç Žæ£ãããç¡èŠãããå倿ãè¡ãããŸããïŒ èŠãŠã¿ãŸãããïŒ
ASMïŒ
mov DWORD PTR [ebp-4], 2
ã³ã³ãã€ã©èªäœã¯ãå°æ°éšåãäžèŠãªãã®ãšããŠç Žæ£ããŸããã
ãã®ããã«æžããšã©ããªããŸããïŒint var = 2 + 3;
ASMïŒ
mov DWORD PTR [ebp-4], 5
ãããŠãã³ã³ãã€ã©èªäœã宿°ãèšç®ã§ããããšãåŠã³ãŸãã ãããŠãã®å ŽåïŒ2ãš3ã¯å®æ°ãªã®ã§ããããã®åèšã¯ã³ã³ãã€ã«æ®µéã§èšç®ã§ããŸãã ãããã£ãŠããã®ãããªå®æ°ã®èšç®ã«ç
©ããããããšã¯ãããŸãã;ã³ã³ãã€ã©ãããªãã®ããã«ä»äºãããããšãã§ããŸãã ããšãã°ãæéããç§ãžã®å€æã¯ãæé* 60 * 60ãšæžãããšãã§ããŸããããããããã§ã®äŸã¯ãã³ãŒãã§å®£èšãããŠãã宿°ã«æäœã眮ãããšã§ãã
ãã®ã³ãŒããæžããšã©ããªããŸããïŒ
int a = 1; int b = a * 2;
mov DWORD PTR [ebp-8], 1 mov eax, DWORD PTR [ebp-8] add eax, eax mov DWORD PTR [ebp-4], eax
é¢çœãã§ããã ã³ã³ãã€ã©ãŒã¯ä¹ç®ã®æŒç®ã䜿çšããªãããšã«ããŸãããã2ãä¹ç®ãã2ã€ã®æ°å€ãåçŽã«å ç®ããŸããïŒãããã®è¡ã«ã€ããŠã¯è©³ãã説æããŸãããåã®è³æããçè§£ããå¿
èŠããããŸãïŒ
ãªãã¬ãŒã·ã§ã³ãä¹ç®ãã¯ãªãã¬ãŒã·ã§ã³ãå ç®ããããæéãããããšèããããšããããããããŸããã ãããã®çç±ã«ãããã³ã³ãã€ã©ã¯ãã®ãããªåçŽãªããšãæé©åããŸãã
ããããç§ãã¡ã¯åœŒã®ããã«ä»äºãè€éã«ãããããæžããŸãïŒ
int a = 1; int b = a * 3;
ASM
mov DWORD PTR [ebp-8], 1 mov edx, DWORD PTR [ebp-8] mov eax, edx add eax, eax add eax, edx mov DWORD PTR [ebp-4], eax
æ°ããedxã¬ãžã¹ã¿ã®äœ¿çšã«ã ãŸãããªãã§ãã ãã; eaxãebxã»ã©æªãã¯ãããŸããã å°ãæéãããããããããŸãããããŠããããedxã¬ãžã¹ã¿ã«å
¥ããæ¬¡ã«eaxã¬ãžã¹ã¿ã«å
¥ãããã®åŸeaxå€ãããèªäœã§è¿œå ããããã®åŸedxããå¥ã®ãŠããããæ¢ã«è¿œå ãããŠããããšãããããŸãã ãããã£ãŠã1 + 1 + 1ã«ãªããŸããã
ãåç¥ã®ããã«ã圌ã¯ãããééãªãè¡ãããšã¯ãããŸããããã§ã«* 4ã§ãã³ã³ãã€ã©ãŒã¯ä»¥äžãçæããŸãã
mov DWORD PTR [ebp-8], 1 mov eax, DWORD PTR [ebp-8] sal eax, 2 mov DWORD PTR [ebp-4], eax mov eax, 0
ããã§ãæ°ãã
salåœä»€ããããŸããããã¯äœãããŸããïŒ ããã¯å·Šãžã®ãã€ããªã·ããã§ãã æ¬¡ã®Cã³ãŒããšåçïŒ
int a = 1; int b = a << 2;
ãã®æŒç®åãã©ã®ããã«æ©èœãããæ¬åœã«çè§£ããŠããªã人ã®ããã«ïŒ
0001ã¯ã2ã€ã®ãŒãã«ãã£ãŠå·Šã«ã·ããïŒãŸãã¯å³ã«è¿œå ïŒãããŸãïŒ0100ïŒã€ãŸãã10çªç®ã®æ°å€ã·ã¹ãã ã§ã¯4ïŒã ãã®äžå¿ã§ã¯ãå·Šãžã®2æ¡ã®ã·ããã¯4ã®ä¹ç®ã§ãã
5ãæãããšãã³ã³ãã€ã©ã1ã€ã®salãš1ã€ã®addãäœæããç°ãªãæ°å€ãèªåã§ãã¹ãã§ããããšã¯é¢çœãã§ãã
22æã«godbolt.orgã®ã³ã³ãã€ã©ãŒã¯éäŒããŠä¹ç®ã䜿çšããŸããããã®æ°ãŸã§ããŸããŸãªæ¹æ³ã§æãåºãããšããŠããŸãã æžç®ã§ãããŸã 説æããŠããªãããã€ãã®åœä»€ã䜿çšããŸãã
ããŠããããã¯è±ã§ãããæ¬¡ã®ã³ãŒãã«ã€ããŠã©ãæããŸããïŒ
int a = 2; int b = a / 2;
ããªããæžç®ãæåŸ
ãããªããæ²ããããªããããã ã³ã³ãã€ã©ã¯ãããæŽç·Žãããã¡ãœãããçæããŸãã æŒç®ãé€ç®ãã¯ä¹ç®ãããããã«é
ããããã³ã³ãã€ã©ãŒãããããŸãã
mov DWORD PTR [ebp-4], 2 mov eax, DWORD PTR [ebp-4] mov edx, eax shr edx, 31 add eax, edx sar eax mov DWORD PTR [ebp-8], eax
ãã®ã³ãŒãã§ã¯ãgcc 4.4.7ãäŸãšããŠãããåã«ãããªãæ°ããããŒãžã§ã³ïŒgcc 7.2ïŒã®ã³ã³ãã€ã©ãŒãéžæãããšèšããªããã°ãªããŸããã åæã®äŸã«ã¯å€§ããªéãã¯ãããŸããã§ãã;ãã®äŸã§ã¯ã5è¡ç®ã®ã³ãŒãã§ç°ãªãåœä»€ã䜿çšããŠããŸãã ãããŠã7.2ã«ãã£ãŠçæãããäŸã¯ãç§ã«ãšã£ãŠèª¬æãããããªããŸããã
倿°
aã8ã§ã¯ãªããªãã»ãã4ã§ã¹ã¿ãã¯äžã«ããããã®ããããªéããããã«å¿ããããšã«æ³šæããŠãã ããã ããŒãã€ã³ãã¯
mov edxãeaxã§å§ãŸããŸãã ãã ããçŸæç¹ã§ã¯ããã®è¡ã®å€ãã¹ãããããŸãã
shråœä»€ã¯ãå³ãžã®ãã€ããªã·ãããå®è¡ããŸãïŒã€ãŸãã
shr edxããã£ãå Žåã¯2ã§é€ç®ããŸã
ã1 ïŒã ãããŠãããã§ãäžéšã®äººãèããããšãã§ããã§ãããããªãå®éã«
shr edxã1ãæžããŠã¯ãããªãã®ã§ããïŒ ããããããã»ã©åçŽã§ã¯ãããŸããã
å°ãæé©åããŠããããäœã«åœ±é¿ããããèŠãŠã¿ãŸãããã å®éãã³ãŒãã§æŽæ°é€ç®ãè¡ããŸãã 倿°ãaãã¯æŽæ°åã§ããã2ã¯intåã®å®æ°ã§ãããããCããžãã¯ã«åŸã£ãŠçµæãå°æ°ã«ãªãããšã¯ãããŸããã æŽæ°ã®é€ç®ã¯ããé«éã§ç°¡åãªã®ã§ãããã¯è¯ãããšã§ããã笊å·ä»ãã®æ°å€ããããŸããã€ãŸããshråœä»€ã§é€ç®ãããšãã®è² ã®æ°å€ã¯æ£è§£ãšã¯ç°ãªãå ŽåããããŸãã ïŒããã¯ãã¹ãŠã笊å·ä»ãã¿ã€ãã®ç¯å²ã®äžå€®ã§0ããã¬ãŒã¯ãããšããäºå®ã«ãããã®ã§ãïŒã 眲åãããéšéã眲åãªãã«çœ®ãæããå ŽåïŒ
unsigned int a = 2; unsigned int b = a / 2;
ãã®åŸãæåŸ
ã©ããã«ãªããŸãã godboltã¯shråœä»€ã§ãŠããããçç¥ããããã¯NASMã§ã³ã³ãã€ã«ãããªãããšãèæ
®ãã䟡å€ããããŸãããããã¯ããã§æç€ºãããŠããŸãã 2ã4ã«å€æŽãããšã2çªç®ã®ãªãã©ã³ãã2ãšããŠè¡šç€ºãããŸãã
åã®ã³ãŒããèŠãŠãã ããã
sar eaxãèŠããšãããã¯shrãšåãã§ããã笊å·ä»ãã®æ°å€ã«ã€ããŠã®ã¿ã§ãã æ®ãã®ã³ãŒãã§ã¯ãè² ã®æ°ãé€ç®ãããšãïŒãŸãã¯ã³ãŒãã¯ãããã«å€æŽãããŸãããè² ã®æ°ã§é€ç®ãããšãïŒã«ãã®åäœãåçŽã«èæ
®ããŸãã ã³ã³ãã¥ãŒã¿ãŒäžã§è² ã®æ°å€ãã©ã®ããã«è¡šãããããç¥ã£ãŠããã°ããªã31ããããã€å³ã«ã·ããããŠãã®å€ãå
ã®æ°å€ã«å ç®ããã®ããæšæž¬ããã®ã¯é£ãããããŸããã
倧ããæ°ã§å²ããšãããã«ç°¡åã§ãã ããã§ã¯ãé€ç®ãä¹ç®ã«çœ®ãæãããã宿°ã第2ãªãã©ã³ããšããŠèšç®ãããŸãã ããªãããã®æ¹æ³ã«èå³ããããªããããªãã¯èªåã§é ãæã¡ç Žãããšãã§ããŸããè€éãªããšã¯äœããããŸããã ã¡ã¢ãªã§å®æ°ãã©ã®ããã«è¡šçŸãããããçè§£ããå¿
èŠããããŸãã
ãããã«
æåã®èšäºã§ã¯ããã§ã«ååãªè³æããããŸãã ããã¯åãäžããŠåšåº«ãåãæéã§ãã ã¢ã»ã³ãã©ã®åºæ¬çãªæ§æã«ç²Ÿéããã³ã³ãã€ã©ãèšç®ã§æãåçŽãªæé©åãåŒãåããããšãã§ããããšãããããŸããã ã¬ãžã¹ã¿å€æ°ãšã¹ã¿ãã¯å€æ°ã®éããèŠãŸããã ä»ã«ãããã€ããããŸãã ããã¯å
¥éèšäºã§ãããæãããªããšã«å€ãã®æéãè²»ãããªããã°ãªããŸããã§ãããããããã¯èª°ã«ãšã£ãŠãæçœã§ã¯ãããŸãããå°æ¥ãCèšèªã®ãã埮åŠãªç¹ãçè§£ããã§ãããã
ããŒã2