Empfehlung gesucht: Win 32 Bit Assembler Development

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Kurzer »

Hallo zusammen,

aus reinem Interesse, was sich seit meinen alten Amiga-Tagen in den 90ern so getan hat, würde ich mir gern mal Assembler auf dem PC ansehen.

Da bei PB der FASM genutzt wird, dachte ich mir, dass ich mir den für die ersten Schritte gleich mal ansehe.
Also hab ich mir das aktuelle FASM-Paket runtergeladen. Dass er ohne Installer und Registry-Einträge direkt aus dem Programm-Verzeichnis läuft sagt mir schon mal zu. :-)

Leider stellt sich für mich jetzt heraus, dass die meisten Tutorials im Netz auf andere Assembler ausgelegt sind (z.B. MASM, TASM) und ich generell wenig Beispiele finde, die direkt im FASM laufen.

Ich muss gestehen, dass ich aufgrund meiner begrenzten Freizeit etwas suche, was ohne große Vorkenntnisse und Konfiguration läuft.

Bei meinem (erfolglosen) Versuch die RADAsm-Entwicklungsumgebung zur Zusammenarbeit mit FASM zu bewegen, musste ich außerdem lernen, dass heutige Assembler offenbar auch Linker und Ressource-Compiler benötigen. Zumindest unter RADAsm scheint man ohne diesen Workflow nicht assemblieren zu können. -> Leider alles Neuland für mich ewig gestrigen. :-/

Auf der anderen Seite aber vielleicht auch eine Chance für mich sich endlich mal mit diesen Prozessen vertraut zu machen. Früher bei meinem Amiga Assembler (Seka clone und Maxon Assembler) wurden maximal Quellcodes dazu inkludiert und das ganze dann durchassembliert - fertig war die -äh- "exe".

Ich habe mir jetzt die GoTools bzw. den GoAsm heruntergeladen und werde mich daran mal versuchen.
Mir scheint, dass es auf der entsprechenden Webseite (http://www.godevtool.com/) Tutorials und generell viele Informationen zu den Go-Tools gibt und auch reichlich Beispiele passend für diesen Assembler.

Daher meine Frage: Bin ich mit dem GoAsm als Anfänger bzgl. x86 Assembler gut bedient?

Gruß Kurzer

PS: Ja, ich könnte mich auch an einem Assembler-Forum anmelden und da fragen... aber ich fühl mich hier halt zuhause :)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Helle »

Ich empfehle doch FASM. Eine EXE lässt sich sofort aus dem Quell-Code erstellen; ohne (extra) Compiler und Linker. Tests (von Teilstücken) lassen sich bei Bedarf bequem mit PB austesten. Der Quellcode ist mit jedem x-beliebigen Text-Editor erstellbar, wenn die FASM-eigene Umgebung (sehr spartanisch, aber funktionell) nicht zusagt. Und: Der Quellcode sieht mMn wirklich nach Assembler aus :mrgreen: !
Da ich meist auch gern ein Beispiel liefere und Du wohl welche suchst, hier ein etwas älterer Primzahlen-Test mit der Divisions-Methode. Älter, weil ich sonst nur noch 64-Bit-Progs erstelle (Rücksicht auf Dein System).
Ich habe auch die Kommentare nicht verändert; der Code ist verbesserungsbedürftig, aber erfüllt seinen Zweck. Und: Die Exe ist schlappe 3KB groß!
Es ist auch egal, ob dies auf einem 32-oder 64-Bit-System ausgeführt wird; die EXE ist 32-Bit (auch ein Vorteil von FASM!).

Code: Alles auswählen

;Von flatassembler.net die aktuelle Windows-Version herunterladen, entpacken, bei include für "...\Include\win32a.inc" den Pfad anpassen und los gehts!
;Es wird auch unter 64-Bit-Windows eine 32-Bit-Exe erstellt!
;flat assembler 1.70.03
;Kein Multi-Threading
;28.07.2012, Ergebnis für i7-3770K @4.1GHz, Win7/64-Bit, nur Core2: Endwert=100000, Zeit=1310ms
;Viel Spaß wünscht Helle

format PE GUI 4.0

include 'C:\Codes\FAsm\Programm\Include\win32a.inc'   ;Pfad anpassen!

entry start

section '.text' code readable executable

  start:

    invoke GetModuleHandle,0
    mov [hInstance],eax
    invoke RegisterClass,wc
    invoke CreateWindowEx,0,_class,_text1,WS_VISIBLE+WS_OVERLAPPEDWINDOW,100,150,1000,500,NULL,NULL,[hInstance],NULL    ;100=X-Pos., 150=Y-Pos., 1000=Breite, 500=Höhe
    mov [hWnd],eax

;======================================================================================================================
    ;Anfang Test-Code, hier incl. Bildschirm-Ausgabe von unsigned Integers
;======================================================================================================================
    ;hier ist der Bereich für eigenen Test-Code; das Ergebnis steht in EINEM String!
    invoke CreateThread,NULL,0,thread_test,0,0,0 ;für den Testcode wird ein Thread erzeugt
    mov [hThread],eax
;---> CORE-ZUORDNUNG, selber testen!
    invoke SetThreadAffinityMask,[hThread],100b  ;0b=keine Zuordnung, 1b=Core0, 10b= Core1, 100b= Core2 usw. Bei Zuweisung von mehreren (oder keine) Cores verteilt Windows!
;--->
    jmp End_Selbst

proc thread_test
    ;Startzeit nehmen
    invoke QueryPerformanceCounter,Start

    ;hier ein Test für DIV mit Primzahl-Ermittlung
;---> ENDWERT, selber testen!
    mov [Endwert],100000     ;bis dahin Primzahlen ermitteln, ist hier nur ein Testwert
;--->
    invoke VirtualAlloc,0,Endwert/2,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE ;Speicher für die Dezimal-Zahlen der Ausgabe reservieren
    mov [Ergebnis],eax       ;Buffer-Adresse
    invoke VirtualAlloc,0,Endwert+512,MEM_COMMIT+MEM_RESERVE,PAGE_READWRITE    ;Speicher für die Hex-Prim-Zahlen reservieren, 512 als Sicherheits-Buffer für kleinen Endwert; Pi mal Daumen
    mov [AdrPrime],eax       ;Buffer-Adresse

    mov edi,eax              ;AdrPrime, Anfangs-Adresse Buffer Primzahlen
    xor ebx,ebx              ;PrimeCounter, Anzahl Primzahlen
    mov dword[edi],2         ;Startwert muss ungerade sein, deshalb wird vereinfachend "2" direkt in die Primzahl-Liste geschrieben
    inc ebx
    add edi,4                ;es werden Double-Words geschrieben
    mov ecx,3                ;Startwert

  Prim0:                     ;Beginn eigentliche Primzahl-Ermittlung
    mov esi,2                ;Divisor
  @@:
    xor edx,edx              ;reicht für unsigned
    mov eax,ecx              ;Dividend
    div esi
    inc esi
    or edx,edx               ;Divisionsrest Null?
    jnz @b
    cmp esi,ecx
    jb @f                    ;Primzahl ist, die nur durch 1 und sich selbst teilbar ist
    mov [edi],ecx            ;gefundene Primzahl in Speicher schreiben für Anzeige
    add edi,4                ;Double-Words
    inc ebx
  @@:
    add ecx,2
    cmp ecx,[Endwert]
    jb Prim0                 ;Ende eigentliche Primzahl-Ermittlung

    ;Berechnung beendet, Endzeit nehmen
    invoke QueryPerformanceCounter,Ende
    invoke QueryPerformanceFrequency,Freq
    fninit                   ;hier FPU, weil Werte (Integer-)Quads sind
    fild qword[Ende]         ;Zeit = (Ende - Start) / Freq
    fild qword[Start]
    fsubp st1,st0
    fmul qword[Tausend]
    fild qword[Freq]
    fdivp st1,st0
    fistp dword[edi]         ;ist Zeit in ms

    add edi,4
    mov [edi],ebx            ;PrimeCounter
    add edi,4
    mov eax,[Endwert]
    mov [edi],eax
    add ebx,3                ;Zeit, Startwert und PrimeCounter sollen mit in Dezimal umgewandelt werden

    ;Konvertierung Hex in Ausgabe-String, hier eigene Routine, evtl. vorher Abschätzung auf Länge Dezimal-String
    mov [PrimeCounter],ebx
    mov edi,[Ergebnis]       ;Anfangs-Adresse String-Buffer
    mov esi,[AdrPrime]       ;Anfangs-Adresse zu konvertierende Hex-Zahlen
    mov dword[AnzChars],0    ;Zeichenzähler für Zeilenlänge

  Konv0:
    xor edx,edx              ;DL=Ziffer
    xor ebx,ebx              ;Pointer in Dezi-Tabelle
    mov dword[LeadNull],0    ;Merker führende Null(en)
    mov eax,[Dezi+ebx]       ;Wert aus Dezi-Tabelle
    mov [DeziWert],eax
    mov eax,[esi]
    mov ecx,eax
  Konv1:
    sub eax,[DeziWert]
    jc @f
    inc dl
    mov ecx,eax
    jmp Konv1
  @@:
    cmp dl,byte[LeadNull]    ;führende Nullen ausblenden
    je @f
    mov byte[LeadNull],0ffh  ;blöd, mal sehen
    or dl,30h                ;Dezimal-Ziffer schreiben
    mov [edi],dl
    inc dword[AnzChars]      ;Zeichenzähler
    inc edi                  ;Pointer in String-Buffer
  @@:
    add ebx,4
    mov eax,[Dezi+ebx]
    mov [DeziWert],eax
    or eax,eax
    jz @f                    ;Ende erreicht
    mov eax,ecx
    xor edx,edx
    jmp Konv1
  @@:
    or cl,30h                ;letzte Ziffer
    mov [edi],cl
    inc dword[AnzChars]
    dec dword[PrimeCounter]  ;Zähler Hex-Werte
    jz Schluss
    inc edi
    mov byte[edi],20h        ;Leerzeichen schreiben
    cmp dword[AnzChars],135  ;max.Zeichen pro Zeile, je nach Lust und Laune und Fensterbreite (s.o.)
    jb @f
    inc edi                  ;ja, nächste Zeile
    mov byte[edi],0dh
    inc edi
    mov byte[edi],0ah
    mov dword[AnzChars],0
  @@:
    inc dword[AnzChars]
    add esi,4
    inc edi
    jmp Konv0

  Schluss:                   ;fertig mit Konvertierung Hex-Werte -> String

    ;Werte in Windows-Titel schreiben, hier direkt in vorhandenen String reinschreiben
    ;das Ganze ist grauselig schlecht programmiert und nicht weiter vorzeigenswert; es soll hier nur seinen Zweck erfüllen
    lea eax,[_text2]         ;Text mit hoffentlich genügend Freizeichen ;-)
    add eax,75               ;Pi mal Daumen
  @@:
    mov dl,[edi]             ;Endwert
    cmp dl,20h               ;Leerzeichen oder CR/LF
    jbe @f
    dec eax
    mov byte[eax],dl
    mov byte[edi],0
    dec edi
    jmp @b
  @@:
    dec edi
    mov dl,[edi]
    cmp dl,20h               ;Leerzeichen oder CR/LF
    jbe @b

    lea eax,[_text2]
    add eax,87
  @@:
    mov dl,[edi]             ;PrimeCounter
    cmp dl,20h               ;Leerzeichen oder CR/LF
    jbe @f
    dec eax
    mov byte[eax],dl
    mov byte[edi],0
    dec edi
    jmp @b
  @@:

    lea eax,[_text2]
    add eax,115
  @@:
    dec edi
    mov dl,[edi]
    cmp dl,20h               ;Leerzeichen oder CR/LF
    jbe @b
  @@:
    mov dl,[edi]             ;Zeit
    cmp dl,20h               ;Leerzeichen oder CR/LF
    jbe @f
    dec eax
    mov byte[eax],dl
    mov byte[edi],0
    dec edi
    jmp @b
  @@:
    invoke SetWindowText,[hWnd],_text2
    invoke SendMessage,[edithwnd],WM_SETTEXT,0,[Ergebnis]    ;Ausgabe des Ergebnis-Strings

   ret
endp

  End_Selbst:
;======================================================================================================================
    ;Ende Test-Code incl. Bildschirm-Ausgabe von unsigned Integers
;======================================================================================================================

;--------------------------------------------------------------------------
  msg_loop:
    invoke GetMessage,msg,NULL,0,0
    cmp eax,1
    jb end_loop
    jne msg_loop
    invoke TranslateMessage,msg
    invoke DispatchMessage,msg
    jmp msg_loop

  end_loop:
    invoke ExitProcess,[msg.wParam]

proc WindowProc hwnd,wmsg,wparam,lparam
    cmp [wmsg],WM_CREATE
    je .wmcreate

    cmp [wmsg],WM_DESTROY
    je .wmdestroy
  .defwndproc:
    invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    jmp .finish

  .wmcreate:
    invoke GetClientRect,[hwnd],client
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,0,WS_VISIBLE+WS_CHILD+WS_HSCROLL+WS_VSCROLL+ES_AUTOHSCROLL+ES_AUTOVSCROLL+ES_MULTILINE,[client.left],[client.top],[client.right],[client.bottom],[hwnd],0,[hInstance],NULL
    mov [edithwnd],eax
    invoke CreateFont,14,0,0,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH+FF_DONTCARE,NULL
    mov [editfont],eax
    invoke SendMessage,[edithwnd],WM_SETFONT,eax,FALSE
    jmp .finish

  .wmdestroy:
    invoke DeleteObject,[editfont]
    invoke PostQuitMessage,0

  .finish:
    ret
endp

;----------------------------------------------------------------------------------------------------------------------
section '.data' data readable writeable

;======================================================================================================================
    ;Anfang Test-Daten
;======================================================================================================================
Dezi   dd           1000000000    ;für Konvertierung Hex in Dezimal-String für Ausgabe
       dd            100000000
       dd             10000000
       dd              1000000
       dd               100000
       dd                10000
       dd                 1000
       dd                  100
       dd                   10
       dd                    0

  Endwert      dd ?
  AdrPrime     dd ?
  Ergebnis     dd ?
  PrimeCounter dd ?
  AnzChars     dd ?
  LeadNull     dd ?
  DeziWert     dd ?

  _text1 TCHAR 'Warte, warte noch ein Weilchen...',0
  _text2 TCHAR 'CPU-DIV-Test 32-Bit (Primzahl-Ermittlung): Anzahl Primzahlen bis            :           ; Benötigte Zeit :           ms',0
;======================================================================================================================
    ;Ende Test-Daten
;======================================================================================================================

  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

Align 8                           ;muss sein!
  Freq      dq ?                  ;für Zeit-Messung
  Start     dq ?
  Ende      dq ?
  Tausend   dq 1000.0             ;Float DP
  hWnd      dd ?
  hInstance dd ?
  hThread   dd ?
  edithwnd  dd ?
  editfont  dd ?

  msg MSG
  client RECT

  _class TCHAR 'Ausgabe',0
  _edit TCHAR 'edit',0

;----------------------------------------------------------------------------------------------------------------------
section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
         user,'USER32.DLL',\
         gdi,'GDI32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess',\
         SetThreadAffinityMask,'SetThreadAffinityMask',\
         CreateThread,'CreateThread',\
         VirtualAlloc,'VirtualAlloc',\
         QueryPerformanceFrequency,'QueryPerformanceFrequency',\
         QueryPerformanceCounter,'QueryPerformanceCounter'

  import user,\
         RegisterClass,'RegisterClassA',\
         CreateWindowEx,'CreateWindowExA',\
         DefWindowProc,'DefWindowProcA',\
         TranslateMessage,'TranslateMessage',\
         DispatchMessage,'DispatchMessageA',\
         GetClientRect,'GetClientRect',\
         SendMessage,'SendMessageA',\
         PostQuitMessage,'PostQuitMessage',\
         GetMessage,'GetMessageA',\
         SetWindowText,'SetWindowTextA'

  import gdi,\
         CreateFont,'CreateFontA',\
         DeleteObject,'DeleteObject'
                                
Viel Spaß!
Helle
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Kurzer »

Vielen Dank für Deine Empfehlung und den Quellcode, Helle. :allright:

Deine Argumentation bzgl. FASM ist nicht von der Hand zu weisen. FASM hat mir (bis auf die IDE) vom Ansatz her sofort gefallen.

Ich glaube aber, dass ich zweigleisig fahren werde und mir daneben auch einen Assembler zulege, der compiler und linker nutzt (immerhin hängt außer meiner Seligkeit nichts von ab ;-)).
Vermutlich würde das Verständnis von Beispielen im Netz auch nicht besser werden, wenn ich weiterhin keine Ahnung von diesen Dingen haben würde.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Thorium »

Die Frage ist was du in Assembler entwickeln möchtest.
Aus meiner Sicht macht es wenig Sinn einen Assembler direkt zu nutzen, esseiden zu möchtest embedded systems programmieren.
Als inline aus einer Sprache wie z.B. PB ist sehr viel angenehmer. Dort kannst du ganz gezielt die zeitkritischen Codes in Assembler schreiben und musst dich nicht mit Fenstererstellung usw.rumplagen, was sowieso nur WinAPI Aufrufe sind und du keinen Mehrwert hast, wenn du dafür Assembler nutzt.

Beispiele gibt es natürlich im FASM Forum, welches du über deren Website findest und das englische PB Forum hat seid einiger Zeit auch ein Assemblerunterforum: http://www.purebasic.fr/english/viewforum.php?f=35
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Kurzer »

Es ist nicht so, dass ich jetzt zwingend ein Projekt in Assembler realisieren möchte. Dafür fehlt mir nach der langen Zeit der Abstinenz und der beruflichen Entwicklung in eine gänzlich andere (Nicht-EDV-)Richtung auch das know how.

Ich möchte mich aus reinem Interesse mal wieder mit dem Thema beschäftigen. Da ich mich früher lediglich mit 6502 Maschinensprache und 68000/30 Assembler beschäftigt habe (absolut low level, ohne Betriebssystemroutinen), würde es mit dem derzeitigen Wissensstand auf dem PC nicht mal zu einem "Hello World" in Assembler reichen. Also von Programmentwicklung in Assembler bin ich weit entfernt. ;-) Das habe ich auch nicht vor.

Zu meiner aktiven Elektronik-Zeit habe ich zwischendurch Atmel Microcontroller programmiert. Insofern bin ich auch der Meinung, dass Assemblerentwicklung nur noch in bestimmten Bereichen sinnvoll ist.

Ja, Inline-Assembler in PB, das könnte ich mir vorstellen (da fällt mir ein, dass ich noch immer kein "Madelbrotgenerator" in PB geschrieben habe). Aber mich interessieren jetzt halt auch die Prozesse und Workflows drum herum (compiler, linker, make-Datei...).
Ich habe keinerlei Computerspezifische Ausbildung genossen und mir den Stoff in den frühen 80ern autodidaktisch zusammen mit einem Freund angeeignet (das ging auf dem VIC 20 mit Maschinensprache los und endete mit systemnahem Assembler auf dem Amiga Anfang der 90er). Sowas wie das "Amiga-Intern" haben wir uns damals selbst zusammengetragen und unsere eigene "Assembler- und Hardware-Bibel" geschrieben. Ich habe niemals in C programmiert und alles was von "Code in den Editor tippen, evtl. ein paar Includes angeben und ab dafür..." hinaus geht ist spurlos an mir vorbeigegangen. Aus diversen Gründen konnte ich danach nicht mehr wirklich an der Evolution im Bereich Softwareentwicklung teilhaben (Reallife.exe, Family.exe, FuckingWrongJob.exe).

Kurzum: Der alte Mann will einfach mal wieder sein Wissen auffrischen und sich den aktuellen Stand "anschnuppern". ;-)

Aus dieser Sicht finde ich die Tutorials und einführenden Informationen von Jeremy Gordon auf der godevtools.com-Seite übrigens wirklich brilliant.

Danke für den Hinweis auf das Assemblerunterforum im englischen PB-Forum, das ist mir bislang völlig entgangen.

So, ich werde mich mal weiter auf der godevtools.com-Seite umsehen und versuchen die RADAsm-IDE mit dem FASM zu verheiraten. Ich habe mir die GoASM Tools (Linker, Res-Compiler...) aber auch die Tools von Pelles C runtergeladen (ebenfalls Linker, Compiler...), denn ich würde das schon gern (neben dem reinen "flat assemblieren") zum laufen bringen. Einfach nur, um es wirklich mal zu schnallen und live zu erleben wie es abläuft.

Das klingt sicherlich völlig banal für die meisten von euch, aber wenn diese Dinge komplett an einem vorbeigegangen sind, dann ist selbst diese "Alltäglichkeit" eine spannende Neuentdeckung.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Thorium »

Kurzer hat geschrieben: Ich habe keinerlei Computerspezifische Ausbildung genossen und mir den Stoff in den frühen 80ern autodidaktisch zusammen mit einem Freund angeeignet (das ging auf dem VIC 20 mit Maschinensprache los und endete mit systemnahem Assembler auf dem Amiga Anfang der 90er). Sowas wie das "Amiga-Intern" haben wir uns damals selbst zusammengetragen und unsere eigene "Assembler- und Hardware-Bibel" geschrieben. Ich habe niemals in C programmiert und alles was von "Code in den Editor tippen, evtl. ein paar Includes angeben und ab dafür..." hinaus geht ist spurlos an mir vorbeigegangen. Aus diversen Gründen konnte ich danach nicht mehr wirklich an der Evolution im Bereich Softwareentwicklung teilhaben (Reallife.exe, Family.exe, FuckingWrongJob.exe).

Kurzum: Der alte Mann will einfach mal wieder sein Wissen auffrischen und sich den aktuellen Stand "anschnuppern". ;-)
Mach das ruhig, du wirst erstaunt sein wie einfach Assembler heutzutage ist. Zumindest im Usermode. Flache Addressstruktur, keine direkte Hardwareansteurung nötig, mächtige Debugger mit jeder menge Komfortfunktionen.
Ich denke du wirst kein Problem haben mit x86 Assembler unter Windows oder Linux oder MacOS.
Zu Tutorials gibts im englischen Forum einen Thread mit Linksammlung.

Als Debugger unter Windows kann ich dir wärmstens OllyDbg empfehlen: http://www.ollydbg.de/
Läuft im Usermode und ist einfach zu bedienen, bietet aber alles was man braucht.

Kompliziert aber auch interessant wirds dann erst mit den SIMD Instruktionen. Also der Hauptteil den uns MMX, SSE und AVX bringt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Danilo »

Kurzer hat geschrieben:Deine Argumentation bzgl. FASM ist nicht von der Hand zu weisen. FASM hat mir (bis auf die IDE) vom Ansatz her sofort gefallen.

Ich glaube aber, dass ich zweigleisig fahren werde und mir daneben auch einen Assembler zulege, der compiler und linker nutzt (immerhin hängt außer meiner Seligkeit nichts von ab ;-)).
Das geht mit FASM auch. PureBasic macht das selbst auch so: assemblieren mit FASM oder YASM zu .obj/.o usw., und dann externen Linker (polink) aufrufen und
Tools (polib, porc) hinzufügen. Helles Beispiel war eben nur ein Beispiel wie man direkt eine EXE mit FASM macht (ohne weitere tools), aber der Weg mit Linker etc. ist auch mit FASM normal.
Dazu kannst Du Dir auch mal PB-ASM-Output anschauen. Am Ende schreibt man eh kaum Standalone-EXE, da man meist Funktions-Bibliotheken aufbaut
und diese dann zu verschiedenen Projekten hinzu linkt (Also viele .obj/.lib an den Linker zum verbinden übergeben, der daraus dann eine EXE oder DLL bindet).

Wenn Du mal das Grundprinzip der Maschine verstanden hast (Register, Speicher, Operationen), dann sind die verschiedenen Assembler-Dialekte nur noch
Syntactic Sugar und Du kannst dann in Intel- oder AT&T Syntax schreiben und die Feinheiten in der Syntax der jeweiligen Assembler unterscheiden.
Schau Dir ruhig auch mal den GNU-Assembler an, der mit GNU C/C++ (gcc, mingw, ..) geliefert wird (as, gas, usw). Die verstehen auch Intel- und AT&T Syntax.
MASM32 ist sonst auf Windows wohl noch recht verbreitet, neben NASM, FASM, YASM, usw..
Borland TASM (Turbo Assembler) ist quasi ausgestorben - das war mein erster Assembler für PC, den es damals für rund 198,-DM noch als Standalone-Produkt mit Box
und gedrucktem Handbuch gab. :D

Bild
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Helle »

Oh, Danilo, Mann, da haste aber nostalgische Gefühle bei mir geweckt :D ! Habe da gleich mal mein Exemplar rausgekramt und abgeknippst:
[img]
http://www.mdcc-fun.de/k.helbing/Bilder ... 8-1907.jpg
[/img]
Das waren noch Zeiten... <)
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von puretom »

Hi Kurzer!
Ich möchte mich aus reinem Interesse mal wieder mit dem Thema beschäftigen. Da ich mich früher lediglich mit 6502 Maschinensprache und 68000/30 Assembler beschäftigt habe (absolut low level, ohne Betriebssystemroutinen), würde es mit dem derzeitigen Wissensstand auf dem PC nicht mal zu einem "Hello World" in Assembler reichen. Also von Programmentwicklung in Assembler bin ich weit entfernt. ;-) Das habe ich auch nicht vor.
Vor wenigen Monaten habe ich einen kleinen Satzparser für ein Text-Adventure in 6510 Assembler für C64-Emulator geschrieben.
Immer noch geil! Jetzt werde ich auch nostalgisch.

Zu deinem Thema:
Ich bin kein ASM-Könner am PC, wenngleich ich natürlich die meisten Befehle verstehe und die Konzepte eines ASM-Progs verstehe.
Lange Rede, kurzer Sinn: Wenn ich Lust habe, mich mit PC-ASM herumzuspielen, mache ich das immer von PB aus mit Inline ASM bzw. mit den "!" vor den ASM-Befehlen, da brauche ich mich um all die Sachen, von denen ich keine Ahnung habe (Segmente, was auch immer), kümmern.
Variablen arbeiten mit Inline-ASM zusammen, Labels, man kann Sprungtabellen machen usw.

So spiele ich halt Assembler.

FASM alleine würde ich auch nicht zum Laufen kriegen. Und sicher auch kein "Hello World".

LG
Puretom
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Empfehlung gesucht: Win 32 Bit Assembler Development

Beitrag von Thorium »

puretom hat geschrieben: FASM alleine würde ich auch nicht zum Laufen kriegen. Und sicher auch kein "Hello World".
Was bedeutet für euch "FASM allein"?
Programmierung ohne Betriebssystem? Mit Betriebsystem ist ein Hello World auch nur ein Aufruf der MessageBox API. Hardware darf man unter modernen Protected Mode Betriebssystemen nicht mehr direkt ansprechen. Esseiden man schreibt einen Treiber. Das heisst man kann nicht einfach so in den Videospeicher schreiben um was auf den Bildschirm zu zaubern. Das muss alles über Schnittstellen vom Betriebssystem laufen. WinAPI, DirectX, OpenGL, usw.
Segmentierung gibts auch nicht mehr, vergesst die Relikte aus der DOS-Zeit. Die Segmentregister gibt es zwar noch aber die werden nicht mehr zum segmentieren verwendet.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten