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 Intelwird 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 ungeradean sowas habe ich gedacht,das mit ring 0 wäre auch interessant aber eher für fortgeschrittene oder reverser