So, yesterday, I made two rather big achievements. First of all, I changed my compiler so that it can also produce assembly code compatible with GNU Assembler. It should now be relatively easy to add even more assemblers, I made the code significantly more modular in the process.
I also finally managed to make a version that can be run in NodeJS, you can download it here.
Here is an example program targeting GNU Assembler, drawing the Sierpinski triangle:
I also finally managed to make a version that can be run in NodeJS, you can download it here.
Here is an example program targeting GNU Assembler, drawing the Sierpinski triangle:
Code:
Syntax GAS
;So, this is an example of how to target GNU Assembler (GAS) using AEC, and how to target Linux.
AsmStart ;What follows is the assembly code produced by CLANG 9.0 on Linux, I don't understand it either, and it's not important.
.text
.file "sierpinski.c"
.globl main # -- Begin function main
.p2align 4, 0x90
.type main,@function
main: # @main
# %bb.0:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -4(%ebp)
leal .L.str, %eax
movl %eax, (%esp)
calll printf
leal .L.str.1, %ecx
movl %ecx, (%esp)
leal n, %ecx
movl %ecx, 4(%esp)
movl %eax, -8(%ebp) # 4-byte Spill
calll __isoc99_scanf
AsmEnd ;And here goes a program written in AEC, finally.
i:=0
While i<n ;This loop will fill the array "new_array" with zeros, except the point right in the middle, which will be filled with 1.
If i=n/2-mod(n/2,1) ;So, if i=floor(n/2), except that I didn't put "floor" in my programming language, so I need to paraphrase it.
new_array(i):=1
Else
new_array(i):=0
EndIf
i:=i+1
EndWhile
i:=0
While i<n
j:=0
While j<n | j=n ;Printing the current state and the new line.
If j=n
AsmStart
.intel_syntax noprefix #Because I don't know anything about att_syntax assembly.
mov byte ptr [esp+4],'\n' #'\n' is, of course, the new line character (in FlatAssembler, you would need to write 10, the ASCII of '\n').
.att_syntax #Not important here (my compiler switches to Intel Syntax before outputting anything except inline Assembly), but added for consistency.
AsmEnd
ElseIf new_array(j)=1
AsmStart
.intel_syntax noprefix
mov byte ptr [esp+4],'*'
.att_syntax
AsmEnd
Else
AsmStart
.intel_syntax noprefix
mov byte ptr [esp+4],' '
.att_syntax
AsmEnd
EndIf
charSign<="%c\0" ;If you write "'%c',0", as you write that in FlatAssembler, GAS complains.
AsmStart
.intel_syntax noprefix
lea ebx,dword ptr [charSign]
mov dword ptr [esp],ebx
call printf
.att_syntax
AsmEnd
j:=j+1
EndWhile
j:=0
While j<n ;Copying "new_array" into "old_array".
old_array(j):=new_array(j)
j:=j+1
EndWhile
j:=0
While j<n
If j=0 | j=n-1 ;Edges
new_array(j):=0
ElseIf old_array(j-1)=old_array(j+1) ;In other words, each cell in the new line in the Sierpinski triangle is the "xor" of its neighbours in the line above it.
new_array(j):=0
Else
new_array(j):=1
EndIf
j:=j+1
EndWhile
i:=i+1
EndWhile
AsmStart ;Again, assembly code produced by CLANG 9.0 on Linux, I don't understand it either.
xorl %ecx, %ecx
movl %eax, -12(%ebp) # 4-byte Spill
movl %ecx, %eax
addl $24, %esp
popl %ebp
retl
.Lfunc_end0:
.size main, .Lfunc_end0-main
# -- End function
.type .L.str,@object # @.str
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "Enter the number of rows and columns in the Sierpinski triangle.\n"
.size .L.str, 67
.type .L.str.1,@object # @.str.1
.L.str.1:
.asciz "%f"
.size .L.str.1, 3
.type n,@object # @n
.comm n,4,4
.type i,@object # @i
.comm i,4,4
.type j,@object # @j
.comm j,4,4
.type result,@object # @result
.comm result,4,4
.type old_array,@object # @old_array
.comm old_array,320,4
.type new_array,@object # @new_array
.comm new_array,320,4
.ident "clang version 9.0.0 (tags/RELEASE_900/final)"
.section ".note.GNU-stack","",@progbits
.addrsig
.addrsig_sym printf
.addrsig_sym __isoc99_scanf
.addrsig_sym n
AsmEnd