Assembler lernen (Buch)



  • Hallo,
    würde auch mal gerne Assembler lernen, finde aber kein "gutes" Buch, das auch aktuell ist. Bis jetzt habe ich nur "Assembler - eine strukturierte Einführung" gelesen, aber das ist recht alt und es steht nicht viel drin...
    Wäre nett, wenn mir jemand ein Buch empfehlen kann (Tuts stehen ja schon in der FAQ).
    Danke.



  • Also, dass das Buch alt ist macht nichts 😃 An den grundsaetzlichen Befehlen, die man in Assembler so benutzt hat sich die letzten 10 Jahre eigentlich nix grossartig geaendert.
    Ausserdem kann dir ein dicker Waelzer ueber Assembler wohl kaum irgendwelche besonderen Geheimnisse enthuellen, die nicht auch in den Tutorials in der FAQ stuenden. Ueber die Sprache Assembler an sich gibt es einfach lange nicht so viel zu sagen, wie zB. ueber C++.
    Also als "Buch" kann ich dir wirklich bloss eine Befehls- und Syntaxuebersicht, wie die "Quick Reference", die mit TASM geliefert wird empfehlen...
    Um Assembler richtig zu lernen taugen eigentlich nur Tuts und vor allem: selber ausprobieren! 😉



  • Original erstellt von Nobuo T:
    Also, dass das Buch alt ist macht nichts 😃 An den grundsaetzlichen Befehlen, die man in Assembler so benutzt hat sich die letzten 10 Jahre eigentlich nix grossartig geaendert.

    Da kamen aber einige hinzu, vor 10 Jahren war doch der 486 gerade die PC CPU und jetzt gibt es ja schon 686 + zusätzliche Dinge, wie MMX, 3dNow, ISSE uvm.

    @Black Shadow
    ich geh mal davon aus, dass du dich für x86 Assembler interessierst, oder?



  • @Kingruedi:
    Richtig. Aber diesen 586+Klimbin, MMX etc. zaehle ich mal nicht zu den "grundsaetzlichen Befehlen" 😉



  • Zurück zum Thema: Ein Buch!
    Ich lese derzeit "Das Assembler Buch". Ich finde es ziemlich gut strukturiert und verständlich. Preis: ca 50€ und ca 800 Seiten (400 Seiten Referenz)



  • von peter monadjemi gibt/gab es ein sehr gutes assemblerbuch ( mal in der bibliothek nachschauen, buch ist von ca 1990), ansonsten gibts noch das assemblerbuch von trutz eyke podschun imho nicht zum lerne ehr zum nachschlagen geeignet



  • Original erstellt von Nobuo T:
    @Kingruedi:
    Richtig. Aber diesen 586+Klimbin, MMX etc. zaehle ich mal nicht zu den "grundsaetzlichen Befehlen" 😉

    okay, da hast du recht. Aber das Buch was Black Shadow meint, behandelt nur den 8086 und Real Mode DOS. Das ist schon ein bisschen veraltet. Ausserdem lernt man in dem Buch kein Tricks und Kniffe!



  • Hui, ganz schön kompliziert, welches Assembler sollte man denn am besten lernen?Ich hab da ja so gut wie keine Ahnung, ich weis nur das es irgendwie so Prozessorspezifisch oder so ist.Stimmt doch oder?
    Aber kann mir das jemand genauer erklären?Heißt das jetzt ich schreib nen Programm auf nem P3 und dann funktioniert es aufm P4 nich mehr, oder wie?



  • Hehe. waer ja noch schoener. Selbst die Programme fuer die ersten 8086CPUs laufen auf dem P3 und P4 noch, also das mit der Abwaertskompatibilitaet ist kein Problem (oder doch, weils teilweise umstaendlich ist - ein Beispiel: A20 😃 )
    Hauptsaechlich verwendet man im praktischen gebrauch eh nur die 486-OPCodes. (Und die gibts bekanntlich schon recht lange). Bevor man spezielle 3DNow oder MMX Befehle benutzen kann muss man natuerlich erstmal checken, was fuer ein CPU installiert ist.
    Aber darueber solltest du dir erstmal wirklich keine Gedanken machen.
    Deine ersten Programme werden auf jeden Fall von deinem Prozessor unterstuetzt 😉



  • Da fällt mir grad ne Frage ein!

    gibt es ne Möglichkeit mit den Grund-OP-Codes aus dem Programm abzufragen was für ein Prozessor installiert ist?

    Oder kann man höchstens über das scheitern neuerer OP-Codes auf ältere/andere Prozessoren schliessen?



  • Bis zum Pentium geht das eigentlich nur so. Danach gibts den tollen Befehl cpuid 😉



  • Zumindest haben die älteren CPUs vorm Pentium in manchen Dingen ein geringfügig anderes Verhalten..mit bestimmten tests kommt man also noch an infos üebr die CPU 🙂



  • http://www.mitp.de/progra/0786/0786.htm <--- dieses buch find ich einfach klasse 😃 alle befehle bis P4 inc opcodes... ein besseres nachschlagewerk für asm kenne ich nicht.
    zu dem thema wie erkenne ich welche befehle formahden sind steht da auch ne ganze menge drinn...

    [ Dieser Beitrag wurde am 30.05.2002 um 21:42 Uhr von japro editiert. ]



  • @ Nabou T: Ich hab derzeit leider keinen laufenden Compiler zum testen aber kannst du mir vielleicht sagen in welcher Form cpuid die ID zurückgibt? gibts da ne ID-Nummer oder so? und wenn Du sagst seit Pentium ist da AMD auch inbegriffen und (ganz exotisch) wie verhält es sich da mit Macs?

    @TriPhoenix: Kennst Du ne Quelle wo dieses geringfügig andere Verhalten der einzelnen CPUs aufgelistet ist?

    @japro: Dein Link führt für mich nirgends hin kannst Du da bitte noch mal Titel, Autor, oder gar isbn angeben?

    @all: thx a lot!



  • Keiner kann sich wirklich meinen Namen merken. 😞 :p
    Was solls. Zurueck zu CPUID.
    Wenn cpuid mit eax=0 ausgefuehrt wird steht anschliessend in eax der hoechste Wert, der von cpuid in eax ekzeptiert wird (eigentlich immer 1)
    in ebx, ecx und edx steht dann die Prozessor ID. Bei meinem AMD steht da folgendes:
    ebx=68747541 (Auth)
    edx=69746E65 (enti)
    ecx=444D4163 (cAMD)
    => also Authentic AMD
    Beim Intel Pentium sollte da dies hier stehen:
    ebx=756E6547 (Genu)
    edx=49656E69 (ineI)
    ecx=6C65746E (ntel)
    => also Genuine Intel

    wird cpuid mit eax=1 ausgefuehrt, steht in eax etwas ueber die CPU-Version stepping etc und in edx stehen die feature flags:
    eax: bits 0-3=stepping id (?)
    bits 4-7=model (1. model=1)
    bits 8-11=cpu family (pentium = 5 ; bei meinem AMD 6)
    bits 12-31 sind 0
    edx: bit 0=FPU on chip
    bits 1-6=irgendwelche speziellen Infos 😕 sind bei mir aber alle gesetzt
    bit 7=machine check exception (?)
    bit 8=cmpxchg8b instruction vorhanden
    (oehm. ich glaub die Instruction braucht man nicht unbedingt. hab sie zumindest noch nirgendwo gesehen)
    bit 9-31 sind reserved (bei mir aber nicht 0)

    hoffe das stimmt so halbwegs...
    Wie sich das mit Mac verhaelt weiss ich nicht. Ich hatte noch nicht das Vergnuegen mit den Dingern 😃 Denke aber mal, die benutzen volkommen andere Instruction sets. 😕



  • @TriPhoenix: Kennst Du ne Quelle wo dieses geringfügig andere Verhalten der einzelnen CPUs aufgelistet ist?

    leider so nicht...lass mich mal nachdenken....also vom 8086 hab ich gehört, dass der im gegensatz zum rest das incrementieren von SP und aufn stack legen andersrum macht als alle nachfolgenden modelle...müsste sich also per push sp, pop ax oder ählich testen lassen

    Ein Indiz ists immer, flags zu setzen im flags-register, die erst ab nem bestimmten prozi unterstützt werden...setzt man das flag und ists danach trotzdem nicht gesetzt, so hast du einen älteren prozi..ich kann ja nochmal veruschen, auf die jagd zu gehen 🙂



  • ein gutes anfängerbuch ist das von erlenkötter. mir hat es gereicht, um in assembler einen einblick zu gewinnen und kleine programme zu schreiben ... vor allem ist es auch recht billig mit knapp 10 euro *g*



  • Nochmal zum Thema Prozessorerkennung: Hier ein Ausschnitt aus einem Programm, das beim TASM dabei ist:

    ;       8086 CPU check
    ;       Bits 12-15 are always set on the 8086 processor
    ;
    check_8086:
            pushf                           ;save FLAGS
            pop     bx                      ;store FLAGS in BX
            mov     ax, 0fffh               ;clear bits 12-15
            and     ax, bx                  ;  in FLAGS
            push    ax                      ;store new FLAGS calue on stack
            popf                            ;replace current FLAGS value
            pushf                           ;set new flags
            pop     ax                      ;store new flags in AX
            and     ax, 0f000h              ;if bits 12-15 are set, then CPU
            cmp     ax, 0f000h              ;  is an 8086/8088
            mov     cpu_type, 0             ; save the CPU type
            je      end_get_cpuid
    
    ;
    ;       Intel 286 CPU check
    ;       Bits 12-15 are always clear on the Intel processor.
    ;
    check_80286:
    .286
            or      bx, 0f000h              ;try to set bits 12-15
            push    bx
            popf
            pushf
            pop     ax
            and     ax, 0f000h              ; if bits 12-15 are cleared,
                                            ;       CPU=Intel 286
            mov     cpu_type, 2             ; turn on Intel 286 Cpu flag
            jz      end_get_cpuid           ; if CPU is intel 286, check
                                            ; for Intel 287 math coprocessor
    
    ;       Intel386 CPU check
    ;       The AC bit (bit 18), is a new bit introduced in the EFLAGS
    ;       register on the Intel486 DX CPU to generate alignment faults.
    ;       This bit can not be set on the Intel386 CPU.
    ;
    check_intel386:
    .386
            pushfd
            pop     eax                     ;get original EFLAGS
            mov     ecx,eax                 ; save original EFLAGS
            xor     eax,40000h              ;flip AC bit in EFLAGS
            push    eax                     ; save for EFLAGS
            popfd                           ; copy to EFLAGS
            pushfd                          ; push EFLAGS
            pop     eax                     ; get new EFLAGS value
            xor     eax,ecx                 ; can't toggle AC bit, CPU=Intel386
            mov     cpu_type, 3             ; turn on Intel386 CPU flag
            je      end_get_cpuid           ; if CPU is Intel386, now check
                                            ; for an Intel 287 or Intel387 MCP
    
    ;     Intel486 DX CPU, Intel 487 SX MCP, and Intel486 SX CPU checking
    ;
    ;     Checking for the ability to set/clear the ID flag (bit 21) in EFLAGS
    ;     which diferentiates between Pentium (or greater) and the Intel486.
    ;     If the ID flag is set then the CPUID instruction can be used to
    ;     determine the final version of the chip, else it's a 486
    ;
    ;
    check_Intel486:
    .486
            mov     cpu_type, 4             ;turn on Intel486 CPU flag
            pushfd                          ;push original EFLAGS
            pop     eax                     ; get original EFLAGS in eax
            mov     ecx,eax                 ;save original EFLAGS in ecx
            or      eax,200000h             ; flip ID bit in EFLAGS
            push    eax                     ;save for EFLAGS
            popfd                           ;copy to EFLAGS
            pushfd                          ;push EFLAGS
            pop     eax                     ;get new EFLAGS value
            xor     eax,ecx
            je      end_get_cpuid           ;if ID bit cannot be changed,
                                            ;CPU=Intel486 without CPUID
                                            ;instruction functionality
    
    ;       Otherwise, execute CPUID instruction to determine vendor,
    ;       family, model and stepping.
    


  • also ich hab das buch "Das Assembler Buch" und finde das auch ganz gut-jedenfalls reciht das was ich da gelernt habe(ca 300 seiten gelesen) für kleinere porgramme schon aus... die tricks und kniffe könnte ja mal jemand in einem speziellen tut zusammentragen.Apropos tut,malfunction wäre das nich eine lektion indeinem tut wert die ganzen tricks zu erklären??? 🕶



  • Also nun fielen hier ja nun schon öfter die Begriffe "Trick" und "Kniff". Könntet ihr mir mal sagen was ihr im Zusammenhang mit Assembler so darunter versteht? 😕
    Mein Tutorial soll ja für DOS (also nur Realmode) sein. Ansonsten wäre nämlich der einzige "Trick", der mir so einfällt, eine Methode wie man unter Win9X in Ring-0 kommt. Aber falls ihr noch irgendwelche Anregungen für das Tutorial habt, dann immer her damit.


Anmelden zum Antworten