Assembler lernen (Buch)



  • @ 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.



  • ich dachte da an sowas wie offset tabellen oder schnelle multiplikationen mit 5 und 9 mit lea.... sowas halt,das weis nich jeder un dda kommt auch nich jeder drauf...



  • Ist ne Idee. Ich hab auch öfters mal was mit Strings gemacht und könnte hier und da kleine Prozeduren präsentieren. Da fällt mir gerade noch was nettes ein. Die einfachste Methode um zu testen, ob das höchstwertigste Bit gesetzt ist (vorausgesetzt wird, dass der Wert nicht mehr gebraucht wird):

    rcl variable
    jc highest_bit_set



  • ja genau sowas!mit rcl kann man auch supergut die zahlen binär darstellen...
    oder wenn man wissen will ob die zahl in eax gerade ist
    test eax,1
    jc ungerade

    an sowas habe ich gedacht,das mit ring 0 wäre auch interessant aber eher für fortgeschrittene oder reverser


Anmelden zum Antworten