[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Tinycc-devel] (no subject)
From: |
ANDY TAKKER |
Subject: |
[Tinycc-devel] (no subject) |
Date: |
Fri, 10 May 2019 19:30:24 +0300 |
The originality of the TCC is inspiring. Here is the simplest program.
//d.c (c) Tereshkov_OE
//sites.google.com/site/excelmidi
int printf();
void bb(void){
asm (".byte 49,49,49,49,49,49,10,0");
}
int aa (void)
{
int cc; cc=bb; cc=cc+3;
printf(cc);
}
int main(void){
gg:
aa();
goto gg;
return 0;}
A lot of words are said about compatibility and portability, but GCC
and PCC bring one result, and TCC is completely different. Here is
another interesting link closely related to the TCC.
https://forum.nasm.us/index.php?topic=2524.0
nop&double jump:
int printf(const char *, ...);
unsigned long long factorial(unsigned long long n)
{
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
_start(void)
{
int n;
printf("\n");
for (n = 0; n <= 16; n++) {
printf("%i! = %lld\n", n, factorial(n));
}
return 0;
}
---------------------------------------------------
public factorial
public _start
extrn printf
.text segment
factorial:
push EBP
mov EBP,ESP
sub ESP,018h
nop <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
mov EAX,0Ch[EBP]
cmp EAX,0
jne L36
mov EAX,8[EBP]
cmp EAX,0
jne L36
mov EAX,1
mov EDX,0
jmp L8D <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
jmp L8D <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
L36: mov EAX,8[EBP]
sub EAX,1
mov ECX,0Ch[EBP]
sbb ECX,0
push ECX
push EAX
call factorial
add ESP,8
mov -4[EBP],EAX
mov EAX,8[EBP]
mov ECX,-4[EBP]
mov -8[EBP],EDX
mul ECX
mov ECX,8[EBP]
mov -0Ch[EBP],EAX
mov EAX,-8[EBP]
imul ECX,EAX
mov EAX,0Ch[EBP]
mov -010h[EBP],EDX
mov EDX,-4[EBP]
imul EAX,EDX
add ECX,EAX
mov EAX,-010h[EBP]
add EAX,ECX
mov ECX,-0Ch[EBP]
mov -018h[EBP],ECX
mov -014h[EBP],EAX
mov EAX,-018h[EBP]
mov EDX,-014h[EBP]
jmp L8D
L8D: leave
ret
_start:
push EBP
mov EBP,ESP
sub ESP,4
nop <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
mov EAX,offset FLAT:L.0
push EAX
call printf
add ESP,4
mov EAX,0
mov -4[EBP],EAX
LAF: mov EAX,-4[EBP]
cmp EAX,010h
jg LF3
jmp LCB
LC0: mov EAX,-4[EBP]
mov ECX,EAX
inc EAX
mov -4[EBP],EAX
jmp short LAF
LCB: mov EAX,-4[EBP]
mov ECX,EAX
sar ECX,01Fh
push ECX
push EAX
call factorial
add ESP,8
push EDX
push EAX
mov EAX,-4[EBP]
push EAX
mov EAX,offset FLAT:L.1
push EAX
call printf
add ESP,010h
jmp short LC0
LF3: mov EAX,0
leave
ret
.text ends
.data segment
L.0:
db 00ah,000h ;..
L.1:
db 025h,069h,021h,020h,03dh,020h ;%i! =
db 025h,06ch,06ch,064h,00ah,000h ;%lld..
.data ends
.bss ends
end
- [Tinycc-devel] (no subject),
ANDY TAKKER <=