tinycc-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]