
ã¯ããã¯ããããã¯ããã€ããã§ãããã€ã³ãèªïŒã€ã³ãã§ã¯ãªãïŒã§ãã é çªã«å§ããŸãããã æè¿ãHabréã§ããã€ãã³ãŒãã«é¢ããèšäºãç»å Žãå§ããŸããã ããããããããã©ãŒãã·ã¹ãã ãæžãã®ã¯æ¥œããã£ãã§ãã ãã¡ãããã¢ã»ã³ãã©ãŒã§ã 16ãããã§ããã x86-64ã§ããã°ã©ã ããããšã¯ãããŸããã 32ã§ããã¬ã€ã§ããŸããã§ããã ããã§ãèããæ¥ãŸãã-ãªãã§ããïŒ 64ãããã®ç ŠãããããŠãã€ãã³ãŒãã§ãããæªæããŠã¿ãŸãããïŒ ã¯ããLinuxã§ã¯ãã·ã¹ãã ãäœæããŠããŸããã
LinuxãæèŒããããŒã ãµãŒããŒããããŸãã äžè¬ã«ãç§ã¯å°ãã°ãŒã°ã«ã§èª¿ã¹ãŠãLinuxã®ã¢ã»ã³ãã©ãŒã¯GASãšåŒã°ããasã³ãã³ãã§ããããšãããããŸããã ç§ã¯SSHçµç±ã§ãµãŒããŒã«æ¥ç¶ããŠããŸãã ãã§ã«ã€ã³ã¹ããŒã«ããŠããŸãã ããã§ããªã³ã«ãŒãå¿
èŠã§ããldãšå
¥åããŠãã ãã-ã¯ãïŒ ããã§ãã¢ã»ã³ãã©ã§äœãé¢çœãããšãæžããŠã¿ãŠãã ããã ææããªããã°ãæ¬ç©ã®ã€ã³ã人ã®ãããªæ£®ã ãããããŸã:)éçºç°å¢ããªããã°ãã³ãã³ãã©ã€ã³ãšããããã€ãã³ãã³ããŒã®ã¿ã ãšãã£ã¿ãŒã¯Nanoã§ãmcã®F4ã«ãã³ã°ã¢ããããŸãã ã°ã«ãŒãããŒããã®æã¯ã©ãã§ããïŒ çã®ã€ã³ã人ã«å¿
èŠãªãã®ã¯1ã€ã ãã§ãã ãã¡ããããããã¬ãŒã ãgdb-isïŒããšå
¥åããŸãã ããŠãShift + F4ãæŒããŠãã ããïŒ
建ç¯
æå§ãã«ãã¢ãŒããã¯ãã£ã決ããŸãããã 64ãããã®ããã深床ãæ¢ã«æ±ºå®ããŠããŸãã åŸæ¥ã®Fortå®è£
ã§ã¯ãããŒã¿ãšã³ãŒãã»ã°ã¡ã³ãã¯åãã§ãã ããããç§ãã¡ã¯ãããæ£ããããããšããŸãã ã³ãŒãã»ã°ã¡ã³ãã«ã¯ã³ãŒããããŒã¿ã»ã°ã¡ã³ãã«ã¯ããŒã¿ã®ã¿ãå«ãŸããŸãã ãã®çµæããã©ãããã©ãŒã ã®ã«ãŒãã«ãšããã©ãããã©ãŒã ã«å®å
šã«äŸåããªããã€ãã³ãŒããååŸããŸãã
æéã®ã¹ã¿ãã¯ããã€ããã·ã³ïŒJITãªãïŒãäœæããŠã¿ãŸãããã ãããã£ãŠã256åã®ã¢ãã¬ã¹ãå«ãããŒãã«ãäœæãããŸãïŒãã€ãã³ãã³ãããšã«1ã€ïŒã äœãããå°ãªã-è¿œå ã®ãã§ãã¯ãããã¯1-2ããã»ããµåœä»€ã§ãã ãããŠã劥åããããšãªãè¿
éã«å¿
èŠã§ãã
ã¹ã¿ãã¯
éåžžãFortå®è£
ã§ã¯ãããã»ããµãªã¿ãŒã³ã¹ã¿ãã¯ïŒ* SPïŒãããŒã¿ã¹ã¿ãã¯ãšããŠäœ¿çšããããã©ãŒãã·ã¹ãã ãªã¿ãŒã³ã¹ã¿ãã¯ã¯ä»ã®æ段ã䜿çšããŠå®è£
ãããŸãã å®éãç§ãã¡ã®ãã·ã³ã¯ã¹ã¿ãã¯ãããäž»ãªäœæ¥ã¯ããŒã¿ã¹ã¿ãã¯ã§è¡ãããŸãã ãããã£ãŠãåãããšãããŸããã-RSPã¯ããŒã¿ã¹ã¿ãã¯ã«ãªããŸãã ããŠããªã¿ãŒã³ã¹ã¿ãã¯ãRBPãšããŸããããã¯ãããã©ã«ãã§ã¹ã¿ãã¯ã»ã°ã¡ã³ãã§ãæ©èœããŸãã ãããã£ãŠãã³ãŒãã»ã°ã¡ã³ããããŒã¿ã»ã°ã¡ã³ããã¹ã¿ãã¯ã»ã°ã¡ã³ãã®3ã€ã®ã¡ã¢ãªã»ã°ã¡ã³ãããããŸãïŒããŒã¿ã¹ã¿ãã¯ãšãªã¿ãŒã³ã¹ã¿ãã¯ã®äž¡æ¹ããããŸãïŒã
ç»é²
ã¬ãžã¹ã¿ãŒx86-64ã®èª¬æã«å
¥ããŸãã 32ãŸãã¯16ãããã¢ãŒããšæ¯èŒããŠãæ倧8ã€ã®è¿œå ã®æ±çšã¬ãžã¹ã¿ïŒR8-R16ïŒããããŸãã
ãã§ã«RSPãšRBPãå¿
èŠã ãšå€æããŸããã ãã€ãã³ãŒãã³ãã³ãã®ãã€ã³ã¿ãŒïŒã«ãŠã³ã¿ãŒïŒããŸã å¿
èŠã§ãã ãã®ã¬ãžã¹ã¿ã®æäœã®ãã¡ãã¡ã¢ãªã®èªã¿åãã®ã¿ãå¿
èŠã§ãã ã¡ã€ã³ã¬ãžã¹ã¿ïŒRAXãRBXãRCXãRDXãRSIãRDIïŒã¯ããæè»ã§æ±çšçã§ãããå€ãã®ç¹å¥ãªã³ãã³ãããããŸãã ãããã¯ããŸããŸãªã¿ã¹ã¯ã«åœ¹ç«ã¡ãŸãããã€ãã³ãŒãåœä»€ã«ãŠã³ã¿ãŒã«ã¯ãæ°ããã¬ãžã¹ã¿ã®1ã€ã䜿çšããŸãããããR8ãšããŸãã
å§ããŸããããïŒ
Linuxã§ã¢ã»ã³ããªèšèªã§ããã°ã©ãã³ã°ããçµéšã¯ãããŸããã ãããã£ãŠããŸãæåã«ãå®æãããHelloãworldããèŠã€ããŠãããã°ã©ã ã®éå§æ¹æ³ãšããã¹ãã®è¡šç€ºæ¹æ³ãç解ããŸãã äºæ³å€ã«ããœãŒã¹ãšã¬ã·ãŒããŒããåé
眮ãããå¥åŠãªæ§æã®ãªãã·ã§ã³ãèŠã€ããŸããã å€æããããã«ãããã¯ATïŒTæ§æã§ãããäž»ã«GASã§èšè¿°ãããŠããŸãã ãã ããå¥ã®æ§æãªãã·ã§ã³ããµããŒããããŠãããIntelæ§æãšåŒã°ããŸãã èããŠãç§ã¯ããããã¹ãŠåãããã«äœ¿çšããããšã«ããŸããã ããŠã.intel_syntax noprefixã®æåã«æžããŠãã ããã
ãHelloãworldããã³ã³ãã€ã«ããŠå®è¡ãããã¹ãŠãæ©èœããããšã確èªããŸãã ãã«ããšå®éšãèªãããšã§ã次ã®ã³ãã³ãã䜿çšããŠã³ã³ãã€ã«ãéå§ããŸããã
$ as fort.asm -o fort.o -g -ahlsm >list.txt
ããã§ã-oã¹ã€ããã¯çµæãã¡ã€ã«ã瀺ãã-gã¹ã€ããã¯ãããã°æ
å ±ã®çæãæ瀺ãã-ahlsmã¹ã€ããã¯ãªã¹ã圢åŒãèšå®ããŸãã ãããŠããªã¹ãã«åºåãä¿æããŸããããã«ã¯ãå€ãã®æçšãªãã®ã衚瀺ãããŸãã äœæ¥ã®éå§æã«ããªã¹ããäœæããã-gã¹ã€ãããæå®ããŸããã§ããã ãããã¬ãŒã®æåã®äœ¿çšåŸã«-gã¹ã€ããã䜿çšãå§ãããã¯ããã³ãŒãã«çŸããåŸã«ãªã¹ããäœæãå§ããŸãã:)
ãã®åŸããªã³ã«ã䜿çšããŸãããã©ãã«ãç°¡åãªãã®ã¯ãããŸããã
$ ld forth.o -o forth
ãããèµ°ãïŒ
$ ./forth
Hello, world!
åäœããŸãã
ãããæåã®forth.asmã§ããïŒå®éã«ã¯ãHellowãworldïŒãã§ãããã¡ããïŒ .intel_syntax noprefix .section .data msg: .ascii "Hello, world!\n" len = . - msg # len .section .text .global _start # _start: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, OFFSET FLAT:msg # mov edx, len # int 0x80 # mov eax, 1 # â 1 â sys_exit xor ebx, ebx # 0 int 0x80 #
ã¡ãªã¿ã«ãå°ãåŸã§x86-64ã§ã¯ãint 0x80ã§ã¯ãªãã·ã¹ãã ã³ãŒã«ã«syscallã䜿çšããæ¹ãæ£ããããšãããããŸããã 0x80åŒã³åºãã¯ããµããŒããããŠããŸããããã®ã¢ãŒããã¯ãã£ã§ã¯å»æ¢ããããšèŠãªãããŸãã
éå§ãããŸããããããŠä»...
è¡ããïŒ
å°ãªããšãããã€ãã®è©³çŽ°ãååšããããã1ãã€ãã³ãã³ãã®ã³ãŒããèšè¿°ããŸãã ãã©ãŒãã¯ãŒãã0ããšããã¹ã¿ãã¯ã®å
é ã«0ã眮ããŸãã
bcmd_num0: push 0 jmp _next
ãã®ã³ãã³ããå®è¡ãããæç¹ã§ãR8ã¯ãã§ã«æ¬¡ã®ãã€ãã³ãã³ããæããŠããŸãã ããªãã¯ãããèªãã§ãR8ãå¢ããããã€ãã³ãã³ãã®ã³ãŒãã«ãã£ãŠå®è¡å¯èœãªã¢ãã¬ã¹ã決å®ããããã«å¶åŸ¡ã移ãå¿
èŠããããŸãã
ããã...ãã€ãã³ãã³ãã¢ãã¬ã¹ããŒãã«ã¯ã©ã®ããã深床ã«ãªããŸããïŒ ãããããç§ã¯æ°ããx86-64ã³ãã³ãã·ã¹ãã ãããªãæãäžããå¿
èŠããããŸããã æ®å¿µãªãããã¡ã¢ãªå
ã®ãªãã»ããã§ç§»åã§ããã³ãã³ãã¯èŠã€ãããŸããã§ããã ãããã£ãŠãã¢ãã¬ã¹ãèšç®ããããã¢ãã¬ã¹ã®æºåãæŽããŸã-64ãããã§ãã èšç®ããæéããããŸãããã€ãŸãã64ãããã§ãã ãã®å ŽåãããŒãã«ã®ãµã€ãºã¯256 * 8 = 4096ãã€ãã«ãªããŸãã æåŸã«ã_nextåŒã³åºãããšã³ã³ãŒãããŸãã
_next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] # bcmd - -
æªãã¯ãªãããã§ããã1ã€ã®ãã€ãã³ãã³ãããå¥ã®ãã€ãã³ãã³ãã«åãæ¿ãããšããããã»ããµåœä»€ã¯3ã€ãããããŸããã
å®éããããã®ã³ãã³ãã¯ç§ã«ãšã£ãŠããã»ã©ç°¡åã§ã¯ãããŸããã§ããã 0x86-64ã³ãã³ãã·ã¹ãã ãããäžåºŠèª¿ã¹ãŠãæ°ããMOVZXã³ãã³ããèŠã€ããå¿
èŠããããŸããã å®éããã®ã³ãã³ãã¯8ã16ããŸãã¯32ãããã®å€ã64ãããã®ã¬ãžã¹ã¿ã«å€æããŸãã ãã®ã³ãã³ãã«ã¯2ã€ã®ããªã¢ã³ãããããŸããäžäœã®æ¡ã«ãŒããåã蟌ãŸãã笊å·ãªããããã³ç¬Šå·ä»ãã®1ã€ã¯MOVSXã§ãã 笊å·ä»ãããŒãžã§ã³ã§ã¯ã笊å·ãæ¡åŒµãããŸããã€ãŸããæ£ã®æ°å€ã®å ŽåããŒãã¯äžäœã®æ¡ã«ãè² ã®æ°å€ã®å Žåã¯1ã«ãªããŸãã ãã®ãªãã·ã§ã³ã¯ãlit byteã³ãã³ãã«ã圹ç«ã¡ãŸãã
ãšããã§ããã®ãªãã·ã§ã³ã¯æ¬åœã«æéã§ããïŒ ãããã誰ããããã«éãææ¡ããã§ããããïŒ
ããŠãããã§ãã€ãã³ãã³ãã®ã·ãŒã±ã³ã¹ãå®è¡ããŠå®è¡ã§ãããã€ããã·ã³ãã§ããŸããã å°ãªããšã1ã€ã®ããŒã ã匷å¶çã«å®è¡ããã«ã¯ãå®éã«ãã¹ãããå¿
èŠããããŸãã ããããã©ãã§ããïŒ ã¹ã¿ãã¯ã¯ãŒãã§ããïŒ ããããããã§ã¯ããããã¬ãŒã®äžã§ã¹ã¿ãã¯ã確èªããªããšãçµæããããããŸãããããããããã°ã©ã ãéå§ãããå Žåãå®äºã§ããŸã:)
ç¹ã«ãHellowãworldïŒããããã®ã§ãããã°ã©ã ãå®äºããŠããã«ã€ããŠæžãå¥ãã®ã³ãã³ããæžããŸãã
bcmd_bye: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bye # mov edx, msg_bye_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 0 # 0 int 0x80 #
æ®ã£ãŠããã®ã¯ããã€ãã³ãã³ãã¢ãã¬ã¹ã®ããŒãã«ãäœæããã¬ãžã¹ã¿ãåæåãããã€ããã·ã³ãèµ·åããããšã ãã§ãã ãã®ãããããŒãã«ã«ã¯256åã®å€ãããã2ã€ã®ã³ãã³ãããããŸãã ä»ã®ã»ã«ã«ã¯äœããããŸããïŒ
æ®ãã«ã¯ç¡å¹ãªæäœã³ãŒããå«ãŸããŸãã ããããããªãã¯ããããã§ãã¯ããããšã¯ã§ããŸããããããã¯äžå¿
èŠãªããŒã ã§ããç§ãã¡ã¯çŸåš3ã€ããããã§ãã¯ã§ã¯5ã€ã«ãªããŸãã ãã®ããããã®ãããªã¹ã¿ãã³ãã³ããäœæããŸã-æªãããŒã ã§ãã ãŸããããŒãã«å
šäœãåããŠããã䟿å©ãªã³ãã³ãã§ã»ã«ãå æãå§ããŸãã æªãããŒã ã«ã¯ã³ãŒã0x00ããbyeããŒã ã«ã¯ã³ãŒã0x01ããã0ãã«ã¯ã³ãŒã0x02ãæžããŸãã ãããŸã§ã®æªãããŒã ã¯ãå®äºã³ãŒããšããã¹ããç°ãªãã ãã§ãããããªããšåãããšãããŸãïŒããããªããšã»ãŒåãããã«ãã¹ãã€ã©ãŒã«å
¥ããŸããïŒã
bcmd_bad bcmd_bad: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bad_byte # mov edx, msg_bad_byte_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 1 # 1 int 0x80 #
次ã«ãã¢ãã¬ã¹ããŒãã«ãæç»ããŸãã 䟿å®äžãåè¡ã«8åãé
眮ãã16åã®è¡ããããŸãããŒãã«ã®ãµã€ãºã¯éåžžã«å€§ãããªããŸãã
ãã€ãã³ãã³ãã¢ãã¬ã¹ããŒãã« bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad
ãã€ãããã°ã©ã ã®æ¬äœãèšè¿°ããŸãã ãããè¡ãã«ã¯ãã³ãã³ãã³ãŒããã¢ã»ã³ãã©å€æ°ã«å²ãåœãŠãŸãã 次ã®å¥çŽãç· çµããŸãã
- ãã€ãã³ãã³ããå®è¡ããããã®ã¢ãã¬ã¹ã¯ãbcmd_ã§å§ãŸããŸãã
- ã³ãã³ãã³ãŒãèªäœã¯ãb_ã§å§ãŸãå€æ°ã«ä¿åãããŸã
ãããã£ãŠããã€ãããã°ã©ã ã®æ¬äœã¯æ¬¡ã®ããã«ãªããŸãã
start: .byte b_bye
ããŒã¿ã¹ã¿ãã¯ã®ãµã€ãºãstack_sizeãšããŠå®£èšããŸãã ãããŸã§ã¯1024ã§ããåæåæã«ãRBP = RSP-stack_sizeãå®è¡ããŸãã
å®éããã®ãããªããã°ã©ã ã³ãŒãïŒforth.asmïŒãååŸããŸã .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte # len msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_bye .section .text .global _start # _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bad_byte # mov edx, msg_bad_byte_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 1 # 1 int 0x80 # b_bye = 0x01 bcmd_bye: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bye # mov edx, msg_bye_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 0 # 0 int 0x80 # b_num0 = 0x02 bcmd_num0: push 0 jmp _next
ã³ã³ãã€ã«ãå®è¡ïŒ
$ as fort.asm -o fort.o -g -ahlsm >list.txt
$ ld forth.o -o forth
$ ./forth
bye!
ããŸãããïŒ 1ãã€ãããã®æåã®ãã€ãã³ãŒãããã°ã©ã ãèµ·åããŸãã:)
ãã¡ããããã¹ãŠãæ£ããè¡ãããŠããã°ãããã¯èµ·ãããŸãã ããã§ãªãå Žåãçµæã¯æ¬¡ã®ããã«ãªããŸãã
$ ./forth
ãã¡ãããä»ã®ãªãã·ã§ã³ãå¯èœã§ãããç§ã¯ããã«æãé »ç¹ã«åºããããŸããã ãããŠããããã¬ãå¿
èŠã§ãã
ãããã¬ãŒã®æè©ãã§ã«è¿°ã¹ãããã«ãç§ã¯GDBã䜿çšããŸããã ããã¯éåžžã«åŒ·åãªãããã¬ã§ãããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãåããŠããŸãã å®è¡ã¯éåžžã«ç°¡åã§ãã
$ gdb ./forth GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./forth...done. (gdb)
次ã«ãã³ãã³ããå
¥åããŠããããã°ããŸãã å¿
èŠãªã³ãã³ããèŠã€ããŠããããã°ã«äœ¿çšããæ¹æ³ãåŠã¶ã®ã«1æéããããŸããã ããã«ãããŸãïŒ
b <label>-ãã¬ãŒã¯ãã€ã³ããèšå®ããŸã
l <label>-ãœãŒã¹ã³ãŒãã衚瀺
r-ããã°ã©ã ãéå§ãŸãã¯åèµ·åããŸã
ir-ããã»ããµã¬ãžã¹ã¿ã¹ããŒã¿ã¹ã®è¡šç€º
s-ã¹ããã
ãšããã§ã-gã¹ã€ããã䜿çšããŠããã°ã©ã ãã³ã³ãã€ã«ããå¿
èŠãããããšãèŠããŠããŸããïŒ ããããªããšãã¿ã°ãšãœãŒã¹ã³ãŒããå©çšã§ããªããªããŸãã ãã®å Žåãéã¢ã»ã³ãã«ãããã³ãŒãã®ã¿ã§ãããã°ããã¡ã¢ãªå
ã®ã¢ãã¬ã¹ã䜿çšããããšãã§ããŸãã ãã¡ãããç§ãã¡ã¯ã€ã³ã人ã§ãããåçšåºŠã§ã¯ãããŸãã...
ããããã©ããããããããã°ã©ã ã¯ã»ãšãã©äœãããŸããã ç§ãã¡ã¯åœŒå¥³ã«ãããã«ã¡ã¯ããšèšãã ãã§ã圌女ã¯ããã«ããã€ïŒããšèšããŸãã ãã€ãã³ãŒãã§å®éã®ãHelloãworldïŒããäœæããŸãããã ãããè¡ãã«ã¯ãã¢ãã¬ã¹ãšæååã®é·ããã¹ã¿ãã¯ã«é
眮ããæååã衚瀺ããã³ãã³ããå®è¡ããŠãããbyeã³ãã³ããå®è¡ããŸãã ããããã¹ãŠè¡ãã«ã¯ãæ°ããã³ãã³ããå¿
èŠã§ããæååãåºåããããã«å
¥åããæååã®ã¢ãã¬ã¹ãšé·ããå
¥åããããã«ç¹ç¯ããŸãã æåã«åãæžãããã®ã³ãŒãã0x80ã«ããŸãã ããã§ããsys_writeåŒã³åºãã§ãã®ã³ãŒããå¿
èŠã§ãã
b_type = 0x80 bcmd_type: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout pop rdx pop rcx push r8 int 0x80 # pop r8 jmp _next
ããã§ã¯ãPOPã³ãã³ãã䜿çšããŠããŒã¿ã¹ã¿ãã¯ããã¢ãã¬ã¹ãšæååã®é·ããååŸããŸãã int 0x80ãåŒã³åºããšãR8ã®ã¬ãžã¹ã¿ãå€æŽãããå¯èœæ§ããããããä¿åããŸãã ããã°ã©ã ãçµäºãããããããã¯ä»¥åã¯è¡ããŸããã§ããã ãããã®ã¬ãžã¹ã¿ã®å
容ã¯æ°ã«ããŸããã§ããã ããã¯éåžžã®ãã€ãã³ãã³ãã§ããããã®åŸã¯ãã€ãã³ãŒãã®å®è¡ãç¶ç¶ããããããèªåã§è¡åããå¿
èŠããããŸãã
ããã§ã¯ãã©ã€ããæžããŸãããã ããã¯ããã©ã¡ãŒã¿ãŒã䜿çšããæåã®ããŒã ã«ãªããŸãã ãã®ã³ãã³ãã®ã³ãŒããå«ããã€ãã®åŸã«ãã¹ã¿ãã¯ã«å
¥ããçªå·ãå«ããã€ãããããŸãã ããã«åé¡ãçºçããŸã-ããã§ã¯ã©ã®ããã深床ãå¿
èŠã§ããïŒ ä»»æã®æ°ãå
¥åããã«ã¯ã64ããããå¿
èŠã§ãã ããããã³ãã³ãã9ãã€ããå æãããã³ã«ãäœã1ã€ã®æ°åã«ãªããŸããïŒ ãã®ããããã€ãã³ãŒãã®äž»èŠãªããããã£ã®1ã€ã§ããã³ã³ãã¯ãããããã³ãã©ãŒãã®ã³ãŒãã倱ãããŸã...
解決çã¯ç°¡åã§ã-ããã深床ãç°ãªãè€æ°ã®ã³ãã³ããäœæããŸãã ãããã¯ãlit8ãlit16ãlit32ãlit64ã«ãªããŸãã å°ããæ°åã«ã¯lit8ãšlit16ã䜿çšãã倧ããæ°åã«ã¯lit32ãšlit64ã䜿çšããŸãã å°ããæ°åãæãé »ç¹ã«äœ¿çšããããããã«ã¯2ãã€ããèŠããæçã®ã³ãã³ãããããŸãã æªããªãïŒ..ãããã®ã³ãã³ãã®ã³ãŒãã0x08-0x0Bã«ããŸãã
b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next
ããã§ã¯ãMOVSXã³ãã³ãã䜿çšããŸããããã¯ãæ¢ç¥ã®MOVZXã³ãã³ãã®ã¢ã€ã³ã³ããŒãžã§ã³ã§ãã R8ãã€ãã³ãã³ãã«ãŠã³ã¿ãŒããããŸãã ç®çã®ãµã€ãºã®å€ãããŒããã次ã®ã³ãã³ãã«ç§»åããŠã64ãããã«å€æãããå€ãã¹ã¿ãã¯ã«é
眮ããŸãã
ããŒãã«å
ã®æ°ããããŒã ã®ã¢ãã¬ã¹ãç®çã®äœçœ®ã«è¿œå ããããšãå¿ããªãã§ãã ãããããã§ãæåã®ããã°ã©ã ãHelloãworldïŒãããã€ãã³ãŒãã§æžãæºåãæŽããŸããã ã³ã³ãã€ã©ãŒã§äœæ¥ããŸãããïŒ :)
start: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_bye
2ã€ã®ç°ãªãlitã³ãã³ãã䜿çšããŸããlit64ã¯æååã®ã¢ãã¬ã¹ãã¹ã¿ãã¯ã«é
眮ããlit8ã¯é·ããã¹ã¿ãã¯ã«é
眮ããŸãã 次ã«ãããã«2ã€ã®ãã€ãã³ãã³ããå®è¡ããŸãïŒtypeãšbyeã
ã³ã³ãã€ã«ãå®è¡ïŒ
$ as fort.asm -o fort.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth Hello, world! bye!
ãã€ãã³ãŒããç²åŸããŸããïŒ ããã¯ããã¹ãŠãæ£åžžãªå Žåã®çµæã§ãã
å®å
šãªãœãŒã¹ .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte # len msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x10 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_bye .section .text .global _start # _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bad_byte # mov edx, msg_bad_byte_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 1 # 1 int 0x80 # b_bye = 0x01 bcmd_bye: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bye # mov edx, msg_bye_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 0 # 0 int 0x80 # b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_type = 0x80 bcmd_type: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout pop rdx pop rcx push r8 int 0x80 # pop r8 jmp _next
ããããå¯èœæ§ã¯ãŸã éåžžã«åå§çã§ãããæ¡ä»¶ããµã€ã¯ã«ãäœãããšã¯ã§ããŸããã
ã©ãããŠäžå¯èœã§ããïŒ ã§ããŸãããã¹ãŠãç§ãã¡ã®æã«ãããŸãïŒ ãã®è¡ãã«ãŒãã§10åå®è¡ããŠã¿ãŸãããã ããã«ã¯ãæ¡ä»¶ä»ãåå²ã³ãã³ããšã¹ã¿ãã¯æŒç®ã®ããããå¿
èŠã«ãªããŸããã¹ã¿ãã¯äžã®å€ã1æžããã³ãã³ãïŒfort "1-"ïŒãšé ç¹è€è£œã³ãã³ãïŒ "dup"ïŒã§ãã
ç®è¡ã§ã¯ããã¹ãŠãç°¡åã§ããç§ãã³ã¡ã³ãããŸããïŒ
b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next
æ¡ä»¶ä»ããžã£ã³ãã æå§ãã«ãã¿ã¹ã¯ãããç°¡åã«ããŸããããç¡æ¡ä»¶ã®ç§»è¡ã§ãã ã¬ãžã¹ã¿R8ã®å€ãå€æŽããã ãã§ããããšã¯æããã§ãã æåã«é ã«æµ®ãã¶ã®ã¯ããã€ãã³ãã³ããšããã«ç¶ããã©ã¡ãŒã¿ãŒã§ããé·ç§»ã¢ãã¬ã¹ã¯64ãããã§ãã åã³9ãã€ãã ãããã®9ãã€ããå¿
èŠã§ããïŒ éåžžãé·ç§»ã¯çè·é¢ã§çºçããå€ãã®å Žåæ°çŸãã€ã以å
ã§ãã ãããã£ãŠãã¢ãã¬ã¹ã§ã¯ãªããªãã»ããã䜿çšããŸãïŒ
ãããæ·±åºŠïŒ å€ãã®å Žåã8ãããïŒåæ¹/åŸæ¹127ïŒã§ååã§ãããå Žåã«ãã£ãŠã¯ããã§ååã§ã¯ãããŸããã ãããã£ãŠãlitã³ãã³ããšåãããã«ã2ã€ã®ãªãã·ã§ã³ãäœæããŸãã8æ¡ãš16æ¡ãã³ãã³ãã³ãŒãã¯0x10ãš0x11ã§ãã
b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next
æ¡ä»¶ä»ãé·ç§»ã®å®è£
ãç°¡åã«ãªããŸããã ã¹ã¿ãã¯ã0ã®å Žåã¯_nextã«é²ã¿ãããã§ãªãå Žåã¯branchã³ãã³ãã«é²ã¿ãŸãïŒ
b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next
ããã§ã«ãŒããäœæããããã®ãã¹ãŠãã§ããŸããã start: .byte b_lit8 .byte 10 # # m0: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye
æåã®2ã€ã®ã³ãã³ã-ã«ãŒãã«ãŠã³ã¿ãŒãã¹ã¿ãã¯ã«é
眮ããŸãã次ã«ãæååHelloãåºåããŸãã次ã«ãã«ãŠã³ã¿ãŒãã1ãæžç®ããè€è£œããŠé·ç§»ãå®è¡ããŸãïŒãŸãã¯å®è¡ããŸããïŒãæ¡ä»¶åå²ã³ãã³ãã¯ã¹ã¿ãã¯ã®å
é ããå€ãååŸãããããè€è£œã³ãã³ããå¿
èŠã§ããããã§ã®é·ç§»ã¯ãè·é¢ãæ°ãã€ããããªãããã8ãããã§ããæ°ããã³ãã³ãã®ã¢ãã¬ã¹ãããŒãã«ã«å
¥ããã³ã³ãã€ã«ããŠå®è¡ããŸããç§ã¯ããããã¿ãã¬ã«å
¥ããŸãããããªããã°ç§ãã¡ã®ããã°ã©ã ã¯åé·ã«ãªããŸãïŒ $ as fort.asm -o fort.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! bye!
ãŸããç§ãã¡ã¯ãã§ã«æ¡ä»¶ãšãµã€ã¯ã«ãè¡ãããšãã§ããŸãïŒå®å
šãªãœãŒã¹ .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte # len msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_branch8, bcmd_branch16, bcmd_qbranch8, bcmd_qbranch16, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x10 .quad bcmd_dup, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_wm, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit8 .byte 10 # # m0: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye .section .text .global _start # _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_bad = 0x00 bcmd_bad: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bad_byte # mov edx, msg_bad_byte_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 1 # 1 int 0x80 # b_bye = 0x01 bcmd_bye: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bye # mov edx, msg_bye_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 0 # 0 int 0x80 # b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_type = 0x80 bcmd_type: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout pop rdx pop rcx push r8 int 0x80 # pop r8 jmp _next b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next
ããããå®æãããã€ããã·ã³ãå¥ã®éåžžã«éèŠãªæ©èœã倱ããŸã§ããã€ãã³ãŒãããå¥ã®ãã®ãåŒã³åºãããšã¯ã§ããŸãããã«ãŒãã³ãããã·ãŒãžã£ãªã©ãšåŒã°ãããã®ã¯ãããŸãããç Šã§ã¯ãããããªããšãäžéšã®åèªã§ã«ãŒãã«åèªä»¥å€ã®åèªã䜿çšã§ããŸãããç§ãã¡ã¯ä»äºãçµããããŸããããã§åããŠããªã¿ãŒã³ã®ã¹ã¿ãã¯ãå¿
èŠã«ãªããŸããcallã³ãã³ããšreturnã³ãã³ãïŒåŒã³åºããšçµäºïŒã®2ã€ã®ã³ãã³ããå¿
èŠã§ããåŒã³åºãã³ãã³ãã¯ãååãšããŠããã©ã³ããšåãããšãè¡ããŸã-å¶åŸ¡ãå¥ã®ãã€ãã³ãŒãã«è»¢éããŸãããã ãããã©ã³ããšã¯ç°ãªãããªã¿ãŒã³ã¹ã¿ãã¯ã«ãªã¿ãŒã³ã¢ãã¬ã¹ãä¿åããŠããªã¿ãŒã³ããŠå®è¡ãç¶ç¶ã§ããããã«ããå¿
èŠããããŸããå¥ã®éãããããŸã-ãã®ãããªåŒã³åºãã¯ãã¯ããã«é·ãè·é¢ã§çºçããå¯èœæ§ããããŸãããããã£ãŠãcallã³ãã³ãã¯ãã©ã³ãã®ããã«ãªããŸããã8ã16ã32ãããã®3ã€ã®ããŒãžã§ã³ã«ãªããŸãã b_call8 = 0x0C bcmd_call8: movsx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next b_call16 = 0x0D bcmd_call16: movsx rax, word ptr [r8] sub rbp, 8 add r8, 2 mov [rbp], r8 add r8, rax jmp _next b_call32 = 0x0E bcmd_call32: movsx rax, dword ptr [r8] sub rbp, 8 add r8, 4 mov [rbp], r8 add r8, rax jmp _next
ã芧ã®ãšãããããã§ã¯ã移è¡ãšã¯ç°ãªãã3ã€ã®ããŒã ãè¿œå ãããŠããŸãããã®ãã¡ã®1ã€ã¯R8ã次ã®ãã€ãã³ãã³ãã«åé
眮ããæ®ãã®2ã€ã¯åä¿¡ããå€ããªã¿ãŒã³ã¹ã¿ãã¯ã«æ ŒçŽããŸãããšããã§ãããã§ã¯ãããã»ããµãã€ãã©ã€ã³ãã³ãã³ãã䞊åã«å®è¡ã§ããããã«ãããã»ããµåœä»€ãäºãã«äŸåãããªãããã«ããŸããããããããããã©ãã»ã©ã®å¹æããããããã¯ããããŸãããå¿
èŠã«å¿ããŠããã¹ãã確èªã§ããŸããcallã³ãã³ãã®åŒæ°ã®åœ¢æã¯ããã©ã³ãã®åŒæ°ã®åœ¢æãšã¯å€å°ç°ãªãããšã«çæããŠãã ãããåå²ã®å Žåããªãã»ããã¯åå²ã¢ãã¬ã¹ãšãã€ãã³ãã³ãã«ç¶ããã€ãã®ã¢ãã¬ã¹ãšã®å·®ãšããŠèšç®ãããŸãã callã³ãã³ãã®å Žåãããã¯ãžã£ã³ãã¢ãã¬ã¹ãšæ¬¡ã®ã³ãã³ãã®ã¢ãã¬ã¹ã®å·®ã§ãããªããããå¿
èŠãªã®ã§ããïŒ
ããã«ãããããã»ããµãŒåœä»€ãå°ãªããªããŸãã次ã«returnã³ãã³ããå®éã圌女ã®ä»äºã¯ããªã¿ãŒã³ã¹ã¿ãã¯ããR8ã埩å
ããå¶åŸ¡ããã€ããã·ã³ã«ããã«è»¢éããããšã ãã§ãã b_exit = 0x1F bcmd_exit: mov r8, [rbp] add rbp, 8 jmp _next
ãããã®ã³ãã³ãã¯éåžžã«é »ç¹ã«äœ¿çšããããããæ倧éã«æé©åããå¿
èŠããããŸããexit byteã³ãã³ãã¯ã3ã€ã®ãã·ã³åœä»€ãå æããŸããããã§äœããæžããããšã¯å¯èœã§ããïŒããã¯ããªããã§ããããšãå€æããŸããïŒ
åã«ç§»è¡ã³ãã³ããåé€ã§ããŸã:)ãããè¡ãã«ã¯ã_nextãã€ããã·ã³ã®ãšã³ããªãã€ã³ãã®äžã«é
眮ããŸãã b_exit = 0x1F bcmd_exit: mov r8, [rbp] add rbp, 8 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8]
ãšããã§ãã³ã³ãã€ã©ãçããžã£ã³ãã³ãã³ãã圢æã§ããããã«ãæãéèŠã§é »ç¹ã«äœ¿çšãããã³ãã³ãïŒããšãã°ãåŒã³åºããªã©ïŒããã€ããã·ã³ã®è¿ãã«é
眮ããå¿
èŠããããŸããããã¯ãªã¹ãã«ã¯ã£ãããšè¡šç€ºãããŸãã以äžã«äŸã瀺ããŸãã
262 0084 490FBE00 bcmd_lit8: movsx rax, byte ptr [r8] 263 0088 49FFC0 inc r8 264 008b 50 push rax 265 008c EB90 jmp _next 266 267 b_lit16 = 0x09 268 008e 490FBF00 bcmd_lit16: movsx rax, word ptr [r8] 269 0092 4983C002 add r8, 2 270 0096 50 push rax 271 0097 EB85 jmp _next 272 273 b_lit32 = 0x0A 274 0099 496300 bcmd_lit32: movsx rax, dword ptr [r8] 275 009c 4983C004 add r8, 4 276 00a0 50 push rax 277 00a1 E978FFFF jmp _next 277 FF 278
ããã§ã265è¡ç®ãš271è¡ç®ã§ã¯ãjmpã³ãã³ãã¯ãããã2ãã€ãã䜿çšãã277è¡ç®ã§ã¯ããžã£ã³ãè·é¢ãçãã³ãã³ãã®é·ããè¶
ããŠãããããåãã³ãã³ãããã§ã«5ãã€ãã«ã³ã³ãã€ã«ãããŠããŸãããããã£ãŠãbadãbyeãtypeãªã©ã®ãã€ãã³ãã³ãã¯ããã«åé
眮ãããcallãbranchãlitãªã©ã¯ããè¿ãã«åé
眮ãããŸããæ®å¿µãªããã127ãã€ãã®é·ç§»ã«é©åããããšã¯ããŸããããŸãããã³ãŒãã«åŸã£ãŠãã³ãã³ãã¢ãã¬ã¹ã®ããŒãã«ã«æ°ããã³ãã³ããè¿œå ããŸããã ãããç§ãã¡ã¯ä»ææŠãšåŸ©åž°ãæã£ãŠããŸããç§ãã¡ã¯ãããããã¹ãããŸãïŒãããè¡ãã«ã¯ãå¥ã®æé ã§ã©ã€ã³ããªã³ããéžæããã«ãŒãã§2ååŒã³åºããŸãããããŠããµã€ã¯ã«ã®ç¹°ãè¿ãåæ°ã¯3åã«æžããŸãã start: .byte b_lit8 .byte 3 # # m0: .byte b_call16 .word sub_hello - . - 2 .byte b_call16 .word sub_hello - . - 2 .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye sub_hello: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_exit
ããã§ã¯Call8ã䜿çšã§ããŸãããæããã䜿çšããããã®ãšããŠcall16ã䜿çšããããšã«ããŸãããå€2ã¯ãç§ãæžããcall byteã³ãã³ãã®ã¢ãã¬ã¹ãèšç®ããç¹æ§ã®ããã«å·®ãåŒãããŸããcall8ã®å Žåãcall32ã®å Žåããããã1ãããããå·®ãåŒãããŸãã4ãã³ã³ãã€ã«ããŠåŒã³åºããŸãã $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth Hello, world! Bad byte code!
ãã£ãš...圌ããèšãããã«ãäœããããŸããããªãã£ã:)ããŠãç§ãã¡ã¯GDBãèµ·åããããã§äœãèµ·ãããèŠãŠã¿ãŸããããsub_helloåŒã³åºããééããããã·ãŒãžã£ã®æ¬äœãå®è¡ãããŠããããšã¯æããã§ãããããbcmd_exitã«ãã¬ãŒã¯ãã€ã³ããããã«èšå®ããŸãã... ããã«ãã€ãã³ãã³ãã³ãŒãã®çãããããŸããããããŠã確ãã«ããã®çç±ã¯åœŒã«ãããŸãããb_exitå€0x1fãå²ãåœãŠãã¢ãã¬ã¹èªäœã¯ããŒãã«ã»ã«çªå·0x17ã«é
眮ãããŸãããããã§ã¯ãb_exitã®å€ã0x17ã«ä¿®æ£ããŠãåè©Šè¡ããŸãã $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! Hello, world! bye!
äžåºŠ6åã®æšæ¶ãšãããããªããããã¹ãã§ã:)å®å
šãªãœãŒã¹ .intel_syntax noprefix stack_size = 1024 .section .data msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte # len msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye msg_hello: .ascii "Hello, world!\n" msg_hello_len = . - msg_hello bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_call8, bcmd_call16, bcmd_call32, bcmd_bad .quad bcmd_branch8, bcmd_branch16, bcmd_qbranch8, bcmd_qbranch16, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_exit # 0x10 .quad bcmd_dup, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_wm, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x20 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x30 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x40 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad start: .byte b_lit8 .byte 3 # # m0: .byte b_call16 .word sub_hello - . - 2 .byte b_call16 .word sub_hello - . - 2 .byte b_wm .byte b_dup .byte b_qbranch8 .byte m0 - . .byte b_bye sub_hello: .byte b_lit64 .quad msg_hello .byte b_lit8 .byte msg_hello_len .byte b_type .byte b_exit .section .text .global _start # _start: mov rbp, rsp sub rbp, stack_size lea r8, start jmp _next b_exit = 0x17 bcmd_exit: mov r8, [rbp] add rbp, 8 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_call8 = 0x0C bcmd_call8: movsx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next b_call16 = 0x0D bcmd_call16: movsx rax, word ptr [r8] sub rbp, 8 add r8, 2 mov [rbp], r8 add r8, rax jmp _next b_call32 = 0x0E bcmd_call32: movsx rax, dword ptr [r8] sub rbp, 8 add r8, 4 mov [rbp], r8 add r8, rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_dup = 0x18 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next b_bad = 0x00 bcmd_bad: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bad_byte # mov edx, msg_bad_byte_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 1 # 1 int 0x80 # b_bye = 0x01 bcmd_bye: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout mov ecx, offset msg_bye # mov edx, msg_bye_len # int 0x80 # mov eax, 1 # â 1 â sys_exit mov ebx, 0 # 0 int 0x80 # b_type = 0x80 bcmd_type: mov eax, 4 # â 4 â sys_write mov ebx, 1 # â 1 â stdout pop rdx pop rcx push r8 int 0x80 # pop r8 jmp _next
çµæã¯äœã§ãã
å®å
šãã€ããªãé«éãª64ãããã¹ã¿ãã¯ãã€ããã·ã³ããã¹ãããŸãããé床ã«ãããŠã¯ããããããã®ãã€ããã·ã³ã¯ã¯ã©ã¹ã§æéã®ãã·ã³ã®1ã€ïŒJITãæããªãã¹ã¿ãã¯ãã€ããã·ã³ïŒã§ãã圌女ã¯ãã³ãã³ããé çªã«å®è¡ããæ¡ä»¶ä»ããžã£ã³ããšç¡æ¡ä»¶ãžã£ã³ããè¡ããããã·ãŒãžã£ãåŒã³åºãããããããæ»ãæ¹æ³ãç¥ã£ãŠããŸããåæã«ã䜿çšããããã€ãã³ãŒãã¯ããªãã³ã³ãã¯ãã§ããåºæ¬çã«ããã€ãã³ãã³ãã¯1ã3ãã€ãããããŸããããã以äžã¯éåžžã«ãŸãã§ãïŒå€§ããªæ°åã®ã¿ã§ãéåžžã«é ãããã·ãŒãžã£ã³ãŒã«ïŒããã€ãã³ãã³ãã®å°ããªã»ãããã¹ã±ãããããŠãããç°¡åã«æ¡åŒµã§ããŸããã¹ã¿ãã¯ãæäœããããã®ãã¹ãŠã®åºæ¬çãªã³ãã³ãïŒãããããã¹ã¯ããããªãŒããŒãã«ãŒããªã©ã20åã§æžãããšãã§ããåãéãç®è¡æŽæ°ã³ãã³ãã«éããããšä»®å®ããŸãïŒãããäžã€ã®éèŠãªãã€ã³ãããã€ãã³ãŒãã¯ãåŸæ¥ã®ãã©ãŒãã®çŽæ¥çž«è£œã³ãŒããšã¯ç°ãªããæ©æ¢°èªåœä»€ãå«ãŸãªããããåã³ã³ãã€ã«ããã«å¥ã®ãã©ãããã©ãŒã ã«è»¢éã§ããŸããã«ãŒãã«ãæ°ããããã»ããµã®åœä»€ã·ã¹ãã ã«äžåºŠæžãæããã°ååã§ãããããã¯éåžžã«è¿
éã«è¡ãããšãã§ããŸãããã€ããã·ã³ã®çŸåšã®ããŒãžã§ã³ã¯ãç¹å®ã®èšèªã«åºæã®ãã®ã§ã¯ãããŸãããããããç§ã¯ããã䜿ã£ãŠFortèšèªã®å®è£
ãäœããããšæã£ãŠããŸããç§ã¯ããã䜿ã£ãçµéšãããããã®ããã®ã³ã³ãã€ã©ã¯éåžžã«è¿
éã«è¡ãããšãã§ããŸããããã«èå³ãããã°ããã®ãã·ã³ã«åºã¥ããŠã次ã®èšäºã§ãæååãšæ°åãç ŠèŸæžãããã³ã€ã³ã¿ããªã¿ã®å
¥åºåãè¡ããŸããæã§ããŒã ã«ã觊ãããããšãã§ããŸããããŠã3çªç®ã®èšäºã§ã¯ã³ã³ãã€ã©ãŒãäœæããã»ãŒå®å
šãªç Šã·ã¹ãã ãååŸããŸãããã®åŸãããã€ãã®æšæºã¢ã«ãŽãªãºã ãäœæããã³ã³ã³ãã€ã«ããããã©ãŒãã³ã¹ãä»ã®èšèªããã³ã·ã¹ãã ãšæ¯èŒããããšãå¯èœã«ãªããŸããããšãã°ããšã©ãã¹ããã¹ã®ãµãããªã©ã䜿çšã§ããŸãããªãã·ã§ã³ãè©ŠããŠã¿ãã®ã¯é¢çœãã§ããããšãã°ãã³ãã³ãããŒãã«ã16ãããã«ãããããããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ãããã確èªããŸãã_nextãšã³ããªãã€ã³ãããã¯ãã«å€æŽããããšãã§ããŸãããã®å Žåãåãã€ãã³ãã³ãã®ãã·ã³ã³ãŒãã¯ã2ã€ã®ã³ãã³ãïŒé·ç§»ãš_nextããã®3ã€ã®ã³ãã³ããé€ãïŒã®ãµã€ãºãå¢å ããŸããã€ãŸããæåŸã«ã¯_nextãžã®é·ç§»ã¯ãããŸãããã_nextã®å
容èªäœã¯ïŒããã¯14ãã€ãã§ãïŒããããããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããããç¥ãããšã¯èå³æ·±ãã§ããã¬ãžã¹ã¿ã䜿çšããŠæé©åãè©Šã¿ãããšãã§ããŸããããšãã°ãç Šã«ã«ãŠã³ã¿ãŒãããæšæºã«ãŒãã¯ãã«ãŠã³ã¿ãŒããªã¿ãŒã³ã¹ã¿ãã¯ã«æ ŒçŽããŸããç»é²ããŒãžã§ã³ãäœæãããã¹ãããããšãã§ããŸããå€å
žçãªåœ¢åŒïŒããšãã°ãA = 5 +ïŒB + C * 4ïŒïŒã§èšè¿°ãããåŒã®ã³ã³ãã€ã©ãŒãäœæããããšãã§ããŸããäžè¬çã«ãå®éšã®äœå°ããããŸãïŒ :)
ç¶ãïŒãã€ãã£ãã¢ã¡ãªã«ã³ã®ç Šã®ãã€ããã·ã³ïŒã ãã§ãªãïŒïŒããŒã2ïŒ