Software > Coding

Erste Assembler-Gehversuche

<< < (2/5) > >>

czietz:
Natürlich ist es kein Problem für gcc etwas als "-mshort" zu compilieren. Ich schrieb ja bloß: Vorsicht beim Linken gegen MiNTLib.

Und was EmuTOS und Assembler-Routinen angeht: Beachte, dass EmuTOS auch auf ColdFire funktionieren muss. Somit hast Du in Assembler eigentlich immer #ifdef-Strecken, die die Wartbartkeit des Codes reduzieren.

Thorsten Otto:

--- Zitat von: czietz am Mo 27.06.2022, 08:24:09 ---PS: Vorsicht mit -mshort. Die Standard-MiNTLib ist nicht damit compiliert. Eventuell weiß @Thorsten Otto, ob es eine MiNTLib dafür gibt. (libcmini kann man als "mshort"-Version bauen.)

--- Ende Zitat ---

Nein, mintlib gibt es nicht (mehr) für -mshort. Theoretisch könnte man die wohl bauen, aber das würde vermutlich nur zu noch mehr  Verwirrung führen, und auch wenig bringen, weil sie ja hauptsächlich zum port von unix-tools verwendet wird, und die würden mit 16bit-ints sowieso i.d.R nicht klar kommen. Auch müsste man dann alle anderen verwendeten Bibliotheken auch mit -mshort kompilieren.

Gemlib gibt es allerdings noch für -mshort.

Thorsten Otto:

--- Zitat von: Mado am Mo 27.06.2022, 09:18:52 ---Ah, jetzt funktioniert es. So habe ich jetzt den Code angepasst:


--- Code: ---       .text
        .global _asmmul
_asmmul:
        clr.l   d1
        clr.l   d0
        move.w  4(sp),d1
        move.w  6(sp),d0
        muls    d1,d0

        rts
        .end

--- Ende Code ---

--- Ende Zitat ---

Das wäre immer noch falsch. Der erste Parameter is bei 4(sp), aber das low-word davon is bei 6(SP). Der zweite Parameter ist bei 8(sp), das low-word davon bei 10(sp).

Im Zweifelsfall einmal kurz anschauen was GCC damit macht:


--- Code: ---int asmmul(short x, short y)
{
return x * y;
}
$ m68k-atari-mint-gcc -fomit-frame-pointer -S -o - -O2 bla.c
       .text
        .even
        .globl  _asmmul
_asmmul:
        move.w 6(%sp),%d0
        muls.w 10(%sp),%d0
        rts

--- Ende Code ---

Wie man daran auch schön sieht, nutzt auch ein explizites "short" nichts, der Compiler pusht immer ein int auf den Stack.

Das ist auch der Grund für die ganzen komischen macros in osbind.h von GCC. Ohne die wäre GCC (ohne -mshort) nicht in der Lage, das für GEMDOS-Calls nötige Stack-layout zu erzeugen.

Thorsten Otto:

--- Zitat von: Mado am Mo 27.06.2022, 10:08:56 ---Ich habe mir mal einige Routinen als Assembly angeschaut und nur die Hände über dem Kopf zusammen geschlagen. Was der C-Compiler da baut, scheint mir nicht die vollen CISC-Features bzw. besonders leistungsfähige Kommandos des Prozessors auszunutzen.

--- Ende Zitat ---

Ja, manchmal sieht der Code schon komisch aus. Aber insgesamt macht er schon einen ganz guten Job. Kannst ja mal probeweise ein paar benchmarks einmal mit Pure-C und einmal mit gcc übersetzen. I.d.R. ist da nicht viel Unterschied.

czietz:

--- Zitat von: Thorsten Otto am Mo 27.06.2022, 13:43:27 ---Das wäre immer noch falsch. Der erste Parameter is bei 4(sp), aber das low-word davon is bei 6(SP). Der zweite Parameter ist bei 8(sp), das low-word davon bei 10(sp).

--- Ende Zitat ---

Siehe oben: Martin baut mit "-mshort". Da sind die Parameter auf dem Stack tatsächlich 16-bit aligned.


--- Zitat von: Thorsten Otto am Mo 27.06.2022, 13:51:48 --- Kannst ja mal probeweise ein paar benchmarks einmal mit Pure-C und einmal mit gcc übersetzen. I.d.R. ist da nicht viel Unterschied.

--- Ende Zitat ---

??? Im Vergleich zwischen Pure-C und gcc gewinnt gcc meilenweit.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln