Gnu Assembler/C-Funktionen/Windows



  • Erstmal hallo.
    Ich beschäftige mich im moment mit Assembler, dabei arbeite ich mich entlang des Buches "Professional Assembly Language" voran. Dieses ist eher Linuxorientiert. Unter Linux klappt auch alles wunderbar, nun wollte ich mal versuchen, ein simples Programm unter Windows zu assembilieren. Es klappt auch - ist schließlich cross-platform. Was nicht klappt, ist das linken und zwar: Im programm werden die standard-c-funktionen printf und exit aufgerufen, jetzt würde ich gerne wissen, was ich linken soll, um das Programm auch unter windows ausführen zu können.
    Hier nochmal der code:

    .section .data
        output:
        .asciz "Your processor is a(n) %s\n"
    .section .bss
        .lcomm vid,12
    .section .text
    .globl main
    main:
            mov $0x0,%eax
            cpuid
            movl $output, %edi
            movl %ebx, (%edi)
            movl %edx,4(%edi)
            movl %ecx,8(%edi)
            push $vid
            push $output
            call printf
            add $8,%esp
            pushl $0
            call exit
    

    das mach ich unter linux:

    as -o cpuid.o cpuid.s
    ld --dynamic-linker /lib/ld-linux.so.2 -o cpuid cpuid.o -lc
    

    Zwar werde ich später assembler nur inline verwenden, was unter windows auch einwandfrei klappt, dennoch möchte ich gerne ein GAS programm mit c funktionen auch unter windows zum laufen bringen. Bitte um Hilfe



  • Hallo,

    man muss nicht unbedingt mit dem Linker direkt arbeiten, man kann es auch mit dem gcc machen. Bei mir hat es so funktioniert:

    as cpuid.s -o cpuid.o
    mingw32-gcc cpuid.o -o cpuid.exe
    

    Ich habe deinen Code ein wenig modifiziert, damit es linkbar ist und was sinnvolles macht:

    .section .data
        output:
        .asciz "Your processor is a(n) %s\n"
    .section .bss
        .lcomm vid,12
    .section .text
    .globl _main
    _main:
            mov $0x0,%eax
            cpuid
            movl $vid, %edi
            movl %ebx, (%edi)
            movl %edx,4(%edi)
            movl %ecx,8(%edi)
            push $vid
            push $output
            call _printf
            add $8,%esp
            pushl $0
            call _exit
    

    Alle Funktionsnamen mit einem Unterstrich versehen, und in der Zeile 11 statt Adresse vom output String die Adresse vom vid String eingesetzt (sonst wird ja der output String überschrieben).
    Hier sind meine Werkzeuge:

    > as --version
    GNU assembler 2.17.50 20060824
    > mingw32-gcc --version
    mingw32-gcc.exe (GCC) 3.4.5 (mingw special)
    Copyright (C) 2004 Free Software Foundation, Inc.
    

    Hoffe, es hilft weiter.



  • wheeee, danke, klappt wunderbar. 🙂

    hehe hab die exe auf 3,5 kb kleingeschrumpft. kriegt mans noch kleiner hin? gibts irgendwo gute tutorials zur größenminimalisierung? 🙂



  • Aus reiner Neugier, warum möchtest du die exe unbedingt klein kriegen? Doch nicht etwa aus Platzmangel auf der Festplatte?



  • für asm unter windoofs gibts nur eine vernünftige software: http://www.rosasm.org/
    🙂



  • @abc.w: ne. bin nur von der demoscene etwas begeistert^^. will Crysis in 4 kb xDDDDD

    @fricky: vllt hast du recht. ich versuch aber möglich crossplatform zu bleiben 🙂



  • Kann mir einer sagen wo man den gnu assembler für windows downloaden kann?



  • Was willst Du damit? Um ernsthaft Assembler zu programmieren ist der doch ungeeignet. Besser Du schaust Dich nach NASM um.

    Ansonsten: Der sollte doch bei den GNU Compiler Tools integriert sein und die gibt es ja auch für Windows.



  • lupo1977 schrieb:

    Besser Du schaust Dich nach NASM um.

    oder noch Besser: jWasm


Anmelden zum Antworten