# Postfix calculator
31 ED # ebp = 0 xor r/m32, r32 31 /r 11 101 101
31 FF # edi = 0 (lenArr) xor r/m32, r32 31 /r 11 111 111
E9 800- # jump WORD jmp rel32 E9 cd
200: # Show #
31 DB # ebx = 0 (index) xor r/m32, r32 31 /r 11 011 011
E9 300- # jump .number jmp rel32 E9 cd
300: # .number #
3B DF # cmp ebx, edi cmp r32, r/m32 3B /r 11 011 111
7C 01 # jump +1 if < jl rel8 7C cb
C3 # return ret C3
8B 04 9D B04+ # eax = [4*ebx+Arr] mov r32, r/m32 8B /r 00 000 100 10 011 101
50 # push eax push r32 50+rd S: num
85 C0 # cmp eax, 0 test r/m32, r32 85 /r 11 000 000
0F 8D 400- # jump .space if >= jge rel32 0F 8D cd
F7 D8 # eax *= -1 neg r/m32 F7 /3 11 011 000
E9 400- # jump .space jmp rel32 E9 cd
400: # .space #
B9 EE00+ # ecx = nbuf-1 mov r32, imm32 B8+rd id
C6 01 20 # [ecx] = ' ' mov r/m8, imm8 C6 /0 ib 00 000 001
E9 500- # jump .numeral jmp rel32 E9 cd
500: # .numeral # div r/m32: Unsigned divide EDX:EAX by r/m32 -- EAX=quot EDX=rem
31 D2 # edx = 0 xor r/m32, r32 31 /r 11 010 010
F7 35 B00+ # divide by base div r/m32 F7 /6 00 110 101
8A 92 A00+ # dl = [edx+Ascii] mov r8, r/m8 8A /r 10 010 010
49 88 11 # [--ecx] = dl dec; mov r/m8, r8 88 /r 00 010 001
85 C0 # cmp eax, 0 test r/m32, r32 85 /r 11 000 000
0F 85 500- # jump .numeral if != jne rel32 0F 85 cd
# .sign:
58 # pop eax pop r32 58+rd S:
85 C0 # cmp eax, 0 test r/m32, r32 85 /r 11 000 000
0F 8D 600- # jump .write if >= jge rel32 0F 8D cd
49 # ecx-- dec r32 48+rd
C6 01 2D # [ecx] = '-' mov r/m8, imm8 C6 /0 ib 00 000 001
E9 600- # jump .write jmp rel32 E9 cd
600: # .write #
BA EE01+ # edx = nbuf mov r32, imm32 B8+rd
29 CA # edx -= ecx sub r/m32, r32 29 /r 11 001 010
53 # push ebx push r32 50+rd S: index
E8 54- # call PutOut call rel32 E8 cd
0F 8C 7F- # jump Exit+1 if < jl rel32 0F 8C cd
5B # pop ebx pop r32 58+rd S:
43 # ebx++ inc r32 40+rd
E9 300- # jump .number jmp rel32 E9 cd
A00: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 # numeral to Ascii
A30: 0 1 2 3 4 5 6 7 8 9 A41: A B C D E F A61: A B C D E F # Ascii to numeral
B00: 10 # base
B04: # Arr
800: # WORD #
BB 00 00 00 80 # ebx = null (acc) mov r32, imm32 B8+rd id
E9 900- # jump CHAR jmp rel32 E9 cd
900: # CHAR #
B9 FF00+ # ecx = ibuf mov r32, imm32 B8+rd id
BA 00 01 00 00 # edx = count mov r32, imm32 B8+rd id
53 # push ebx push r32 50+rd S: acc
E8 67- # call TakeIn call rel32 E8 cd
0F 8C 7F- # jump Exit+1 if < jl rel32 0F 8C cd
0F 8E 7A- # jump Exit if <= jle rel32 0F 8E cd
5B # pop ebx pop r32 58+rd S:
31 C0 # eax = 0 xor r/m32, r32 31 /r 11 000 000
8A 06 # al = [esi] mov r8, r/m8 8A /r 00 000 110
8A 80 C00+ # al = [eax+Char>Act] mov r8, r/m8 8A /r 10 000 000
FF A0 D00+ # jump [eax+Act>Doer] jmp r/m32 FF /4 10 100 000
# C00: Char>Act D00: Act>Doer
D00: E00+ # numeral
C09: 04 # TAB whSpace
C0A: 04 # LF whSpace
C20: 04 D04: E20+ # SPACE whSpace
C23: 08 D08: E60+ # #
C2A: 0C D0C: EC0+ # *
C2B: 10 D10: E90+ # +
C2D: 14 D14: EA0+ # -
C2F: 18 D18: EE0+ # /
C68: 1C D1C: F60+ # h
C74: 20 D20: F20+ # t
C78: 24 D24: F40+ # x
C7E: 28 D28: F00+ # ~
E00: # Do numeral
31 C0 # eax = 0 xor r/m32, r32 31 /r 11 000 000
8A 06 # al = [esi] mov r8, r/m8 8A /r 00 000 110
8A 80 A00+ # al = [eax+Ascii] mov r8, r/m8 8A /r 10 000 000
0F AF 1D B00+ # ebx *= base imul r32, r/m32 0F AF /r 00 011 101
01 C3 # ebx += eax add r/m32, r32 01 /r 11 000 011
E9 900- # jump CHAR jmp rel32 E9 cd
E20: # Do whSpace
85 DB # cmp ebx, 0 test r/m32, r32 85 /r 11 011 011
0F 8C E40- # jump .show if < jl rel32 0F 8C cd
89 1C BD B04+ # [4*edi+Arr] = ebx mov r/m32, r32 89 /r 00 011 100 10 111 101
47 # edi++ inc r32 40+rd
E9 E40- # jump .show jmp rel32 E9 cd
E40: # .show: # (if end of line)
80 3E 0A # cmp [esi], '\n' cmp r/m8, imm8 80 /7 ib 00 111 110
0F 85 800- # jump WORD if != jne rel32 0F 85 cd
E8 200- # call Show call rel32 E8 cd
E9 800- # jump WORD jmp rel32 E9 cd
E60: # Do # (drop)
4F # edi-- dec r32 48+rd
E9 800- # jump WORD jmp rel32 E9 cd
E70: # Pop # y z -- y EBX=z ECX=&y
4F # edi-- dec r32 48+rd
8D 0C BD B04+ # ecx = 4*edi+Arr lea r32, m 8D /r 00 001 100 10 111 101
8B 19 # ebx = [ecx] (=z) mov r32, r/m32 8B /r 00 011 001
83 E9 04 # ecx -= 4 sub r/m32, imm8 83 /5 ib 11 101 001
C3 # return ret C3
E90: # Do + #
E8 E70- # call Pop call rel32 E8 cd
01 19 # [ecx] += ebx add r/m32, r32 01 /r 00 011 001
E9 800- # jump WORD jmp rel32 E9 cd
EA0: # Do - #
E8 E70- # call Pop call rel32 E8 cd
29 19 # [ecx] -= ebx sub r/m32, r32 29 /r 00 011 001
E9 800- # jump WORD jmp rel32 E9 cd
EC0: # Do * #
E8 E70- # call Pop call rel32 E8 cd
0F AF 19 # ebx *= [ecx] imul r32, r/m32 0F AF /r 00 011 001
89 19 # [ecx] = ebx mov r/m32, r32 89 /r 00 011 001
E9 800- # jump WORD jmp rel32 E9 cd
EE0: # Do / # IDIV: Signed divide EDX:EAX by r/m32 -- EAX=quot EDX=rem
E8 E70- # call Pop call rel32 E8 cd
8B 01 # eax = [ecx] mov r32, r/m32 8B /r 00 000 001
99 # signExtend EAX to EDX cdq 99
F7 FB # signed div by ebx idiv r/m32 F7 /7 11 111 011
89 01 # [ecx] = eax mov r/m32, r32 89 /r 00 000 001
E9 800- # jump WORD jmp rel32 E9 cd
F00: # Do ~ #
F7 1C BD B00+ # [4*edi+Arr-4] *= -1 neg r/m32 F7 /3 00 011 100 10 111 101
E9 800- # jump WORD jmp rel32 E9 cd
F20: # Do t #
C6 05 B00+ 02 # base = 2 (two) mov r/m8, imm8 C6 /0 ib 00 000 101
E9 800- # jump WORD jmp rel32 E9 cd
F40: # Do x #
C6 05 B00+ 0A # base = A (X Roman) mov r/m8, imm8 C6 /0 ib 00 000 101
E9 800- # jump WORD jmp rel32 E9 cd
F60: # Do h #
C6 05 B00+ 10 # base = 10 (hexadec.) mov r/m8, imm8 C6 /0 ib 00 000 101
E9 800- # jump WORD jmp rel32 E9 cd