Ich hätte mal ein paar Fragen zu Assembler:
1. Ist es klug, direkt nach AutoIt, was die bisher erste und einzige Programmiersprache ist, die man kann, Assembler zu lernen? Oder sollte man erst etwas leichteres lernen? Oder stimmen das Vorurteil, ASM sei so schwer, gar nicht?
2. Kennt jemand ein gutes Assembler Tut? Ich hab mich bisher noch nie auch nur annährend mit ASM befasst.
-
-
Ich empfehle dir C++ zu nehmen :D, denn in assembler gibt es keine Befehle wie MsgBox(), das musst du alles selbst zusammen basteln
-
Zitat
1. Ist es klug, direkt nach AutoIt, was die bisher erste und einzige Programmiersprache ist, die man kann, Assembler zu lernen? Oder sollte man erst etwas leichteres lernen? Oder stimmen das Vorurteil, ASM sei so schwer, gar nicht?
Da sind viele Gemeinsamkeiten wie zB Namen mit der Syntax "GUI_DISABLE". Sonst ist einfach nur kompliziert ^^. (Nur einen guten Compilier zu finden dauert ewig..)Zitat2. Kennt jemand ein gutes Assembler Tut? Ich hab mich bisher noch nie auch nur annährend mit ASM befasst.
Kauf dir ein Buch. Gibt kein gutes Online-Tutorial, ich habe schon gesucht, aber GUT ist was anderes, wie ich gefunden habe ^^.ZitatIch empfehle dir C++ zu nehmen
Stimmt, wenn dus noch nicht kannst, sehr zu empfehlen. -
Also ich sage es mal so:
ASM lernen lohnt sich alle Male, Da mann dann auch mal versteht wie eine CPU, etc arbeitet.
Na klar gibt es keine Befehle wie MsgBox()Assembler ist ansich die "leichteste" Sprache die es gibt, Hat nur Knapp 30 Befehle (pi mal Daumen geschätzt) aber dafür ist sie auch sehr sehr Mächtig.
Aber um etwas "vernünftiges" mit ASM auf die Beine zu Stellen muss man halt erstmal die Logik des Prozessors verstehen.Sprich Offsets, Stacks, Bytes etc. Ansonsten frag Andy: Der kann das
PS: Ich hoffe ich schreibe hier keinen Quatsch -
Zitat
denn in assembler gibt es keine Befehle wie MsgBox(), das musst du alles selbst zusammen basteln
Das stimmt nicht!
So gut wie jede nennenswerte Bibliothek gibt es auch in Assembler, die API-Funktionen sowieso.
Beispiel für Messagebox:Code; example of simplified Windows programming using complex macro features include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here .code start: invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK invoke ExitProcess,0 .end start
die passende EXE 2kb groß autoit.de/wcf/attachment/11024/Beispiel Dialogbox;
Spoiler anzeigen
Code
Alles anzeigen; DialogBox example format PE GUI 4.0 entry start include 'win32a.inc' ID_CAPTION = 101 ID_MESSAGE = 102 ID_ICONERROR = 201 ID_ICONINFORMATION = 202 ID_ICONQUESTION = 203 ID_ICONWARNING = 204 ID_TOPMOST = 301 section '.text' code readable executable start: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0 or eax,eax jz exit invoke MessageBox,HWND_DESKTOP,message,caption,[flags] exit: invoke ExitProcess,0 proc DialogProc hwnddlg,msg,wparam,lparam push ebx esi edi cmp [msg],WM_INITDIALOG je .wminitdialog cmp [msg],WM_COMMAND je .wmcommand cmp [msg],WM_CLOSE je .wmclose xor eax,eax jmp .finish .wminitdialog: invoke CheckRadioButton,[hwnddlg],ID_ICONERROR,ID_ICONWARNING,ID_ICONINFORMATION jmp .processed .wmcommand: cmp [wparam],BN_CLICKED shl 16 + IDCANCEL je .wmclose cmp [wparam],BN_CLICKED shl 16 + IDOK jne .processed invoke GetDlgItemText,[hwnddlg],ID_CAPTION,caption,40h invoke GetDlgItemText,[hwnddlg],ID_MESSAGE,message,100h mov [flags],MB_OK invoke IsDlgButtonChecked,[hwnddlg],ID_ICONERROR cmp eax,BST_CHECKED jne .iconerror_ok or [flags],MB_ICONERROR .iconerror_ok: invoke IsDlgButtonChecked,[hwnddlg],ID_ICONINFORMATION cmp eax,BST_CHECKED jne .iconinformation_ok or [flags],MB_ICONINFORMATION .iconinformation_ok: invoke IsDlgButtonChecked,[hwnddlg],ID_ICONQUESTION cmp eax,BST_CHECKED jne .iconquestion_ok or [flags],MB_ICONQUESTION .iconquestion_ok: invoke IsDlgButtonChecked,[hwnddlg],ID_ICONWARNING cmp eax,BST_CHECKED jne .iconwarning_ok or [flags],MB_ICONWARNING .iconwarning_ok: invoke IsDlgButtonChecked,[hwnddlg],ID_TOPMOST cmp eax,BST_CHECKED jne .topmost_ok or [flags],MB_TOPMOST .topmost_ok: invoke EndDialog,[hwnddlg],1 jmp .processed .wmclose: invoke EndDialog,[hwnddlg],0 .processed: mov eax,1 .finish: pop edi esi ebx ret endp section '.bss' readable writeable flags dd ? caption rb 40h message rb 100h section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ GetModuleHandle,'GetModuleHandleA',\ ExitProcess,'ExitProcess' import user,\ DialogBoxParam,'DialogBoxParamA',\ CheckRadioButton,'CheckRadioButton',\ GetDlgItemText,'GetDlgItemTextA',\ IsDlgButtonChecked,'IsDlgButtonChecked',\ MessageBox,'MessageBoxA',\ EndDialog,'EndDialog' section '.rsrc' resource data readable directory RT_DIALOG,dialogs resource dialogs,\ 37,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration dialog demonstration,'Create message box',70,70,190,175,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME dialogitem 'STATIC','&Caption:',-1,10,10,70,8,WS_VISIBLE dialogitem 'EDIT','',ID_CAPTION,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP dialogitem 'STATIC','&Message:',-1,10,40,70,8,WS_VISIBLE dialogitem 'EDIT','',ID_MESSAGE,10,50,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL dialogitem 'BUTTON','&Icon',-1,10,70,80,70,WS_VISIBLE+BS_GROUPBOX dialogitem 'BUTTON','&Error',ID_ICONERROR,20,82,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON+WS_TABSTOP+WS_GROUP dialogitem 'BUTTON','I&nformation',ID_ICONINFORMATION,20,95,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Question',ID_ICONQUESTION,20,108,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Warning',ID_ICONWARNING,20,121,60,13,WS_VISIBLE+BS_AUTORADIOBUTTON dialogitem 'BUTTON','&Style',-1,100,70,80,70,WS_VISIBLE+BS_GROUPBOX dialogitem 'BUTTON','&Top most',ID_TOPMOST,110,82,60,13,WS_VISIBLE+WS_TABSTOP+BS_AUTOCHECKBOX dialogitem 'BUTTON','OK',IDOK,85,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON dialogitem 'BUTTON','C&ancel',IDCANCEL,135,150,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON enddialog
autoit.de/wcf/attachment/11025/Beispiel OpenGL
Spoiler anzeigen
Code
Alles anzeigen; OpenGL programming example format PE GUI 4.0 entry start include 'win32a.inc' include 'opengl.inc' section '.text' code readable executable start: invoke GetModuleHandle,0 mov [wc.hInstance],eax invoke LoadIcon,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax invoke RegisterClass,wc invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW+WS_CLIPCHILDREN+WS_CLIPSIBLINGS,16,16,432,432,NULL,NULL,[wc.hInstance],NULL mov [hwnd],eax msg_loop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,[msg.wParam] proc WindowProc hwnd,wmsg,wparam,lparam push ebx esi edi cmp [wmsg],WM_CREATE je .wmcreate cmp [wmsg],WM_SIZE je .wmsize cmp [wmsg],WM_PAINT je .wmpaint cmp [wmsg],WM_KEYDOWN je .wmkeydown cmp [wmsg],WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp .finish .wmcreate: invoke GetDC,[hwnd] mov [hdc],eax mov edi,pfd mov ecx,sizeof.PIXELFORMATDESCRIPTOR shr 2 xor eax,eax rep stosd mov [pfd.nSize],sizeof.PIXELFORMATDESCRIPTOR mov [pfd.nVersion],1 mov [pfd.dwFlags],PFD_SUPPORT_OPENGL+PFD_DOUBLEBUFFER+PFD_DRAW_TO_WINDOW mov [pfd.iLayerType],PFD_MAIN_PLANE mov [pfd.iPixelType],PFD_TYPE_RGBA mov [pfd.cColorBits],16 mov [pfd.cDepthBits],16 mov [pfd.cAccumBits],0 mov [pfd.cStencilBits],0 invoke ChoosePixelFormat,[hdc],pfd invoke SetPixelFormat,[hdc],eax,pfd invoke wglCreateContext,[hdc] mov [hrc],eax invoke wglMakeCurrent,[hdc],[hrc] invoke GetClientRect,[hwnd],rc invoke glViewport,0,0,[rc.right],[rc.bottom] invoke GetTickCount mov [clock],eax xor eax,eax jmp .finish .wmsize: invoke GetClientRect,[hwnd],rc invoke glViewport,0,0,[rc.right],[rc.bottom] xor eax,eax jmp .finish .wmpaint: invoke GetTickCount sub eax,[clock] cmp eax,10 jb .animation_ok add [clock],eax invoke glRotatef,[theta],0.0,0.0,1.0 .animation_ok: invoke glClear,GL_COLOR_BUFFER_BIT invoke glBegin,GL_QUADS invoke glColor3f,1.0,0.1,0.1 invoke glVertex3f,-0.6,-0.6,0.0 invoke glColor3f,0.1,0.1,0.1 invoke glVertex3f,0.6,-0.6,0.0 invoke glColor3f,0.1,0.1,1.0 invoke glVertex3f,0.6,0.6,0.0 invoke glColor3f,1.0,0.1,1.0 invoke glVertex3f,-0.6,0.6,0.0 invoke glEnd invoke SwapBuffers,[hdc] xor eax,eax jmp .finish .wmkeydown: cmp [wparam],VK_ESCAPE jne .defwndproc .wmdestroy: invoke wglMakeCurrent,0,0 invoke wglDeleteContext,[hrc] invoke ReleaseDC,[hwnd],[hdc] invoke PostQuitMessage,0 xor eax,eax .finish: pop edi esi ebx ret endp
autoit.de/wcf/attachment/11026/
Blume, nein ich kanns nicht^^, jedenfalls nicht so wie die Bitpfriemler, aber das Prinzip habe ich verstanden!
Für die Leute, die Spass verstehen, noch 1 kb Fun^^
autoit.de/wcf/attachment/11027/@Topic,
ja, ich würde dir auch nicht gerade zu Assembler raten, wenn du nicht unbedingt mit Großrechnern oder bei Compilerbauern oder anderen interessanten Sachen programmieren willst...
Aber es gibt einen sehr wahren Spruch dazu: "Wer in einer Herde Schafe nicht auffallen will, der sollte zuallererst ein Schaf sein!"
Überleg dir mal, was in einer Bewerbung Eindruck schindet, ein cleveres (wegen mir übelst schnelles Bitgeschiebe) Assemblerprogramm, oder der 09/15 "Ich kann C++, Java, Javascript, HTML, PHP" (von allem ein bisschen aber nix richtig) -
Nice, der Post gefällt mir^^ Ob ich nun in ASM progge, oder in einer anderen Programmiersprache ist doch relativ egal, bis auf den Syntax und so, oder? Ich krieg doch immer eine funktionierende exe?!? Dann kommen eben noch Größe, Geschwindigkeit usw. als Unterschied auf. Und in Sachen Geschwindigkeit ist man mit ASM doch am schnellsten, oder? Wie hast du dir denn diese Asm Kentnisse verschafft? Und welchen Compiler benutzt du?
-
Zitat
Assembler ist ansich die "leichteste" Sprache die es gibt
yepp....
Zitat, Hat nur Knapp 30 Befehle
Mitnichten ^^
Aber du hast fast Recht, in der Regel braucht man höchstens 30 davon, wobei die MMX/SSE/2/3-Befehle teilweise derart mächtig sind, daß man eine halbe Seite AutoIt-Code bräuchte, um nur einen davon nachzubilden. -
Gibt es sowas auch noch auf Deutsch? Weil ich weiß nicht, ob meine Englisch Kentnisse für ~1400 Zeilen reichen... Und bis ich da mal durch bin...
-
Zitat
Und welchen Compiler benutzt du?
Compiler gibts nicht^^ Das Ding, welches die Befehle in Mnemonics (Maschinensprache) übersetzt (im Prinzip wird nur 1:1 übersetzt) nennt man Assembler. Richtige Hardcore-coder coden in Mnemonics....Trancexx aus dem engl. Forum ist so eine(r), da zieh ich tief den Hut!RESPECT
Spoiler anzeigen
[autoit]; by trancexx
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <Memory.au3>
#include <winapi.au3>Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global Const $STM_SETIMAGE = 370
[/autoit] [autoit][/autoit] [autoit]Global Const $iWidth = 800
[/autoit] [autoit][/autoit] [autoit]
Global Const $iHeight = 470GUICreate("", $iWidth, $iHeight)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, "_Quit")
GUISetBkColor(0)Global $hPic = GUICtrlCreatePic("", 0, 0, $iWidth, $iHeight)
[/autoit] [autoit][/autoit] [autoit]Global $iSize = $iWidth * $iHeight
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $tBits = DllStructCreate("int[" & $iSize & "]")
Global $pBits = DllStructGetPtr($tBits)Global $hBitmap, $aCall, $iHMsg
[/autoit] [autoit][/autoit] [autoit]
Global $hPicHandle = GUICtrlGetHandle($hPic)Global $tRandom = DllStructCreate("dword")
[/autoit] [autoit][/autoit] [autoit]
Global $pRandom = DllStructGetPtr($tRandom)GUISetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $aRtlRandomEx = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("ntdll.dll"), "str", "RtlRandomEx")
[/autoit] [autoit][/autoit] [autoit]
Global $pRtlRandomEx = $aRtlRandomEx[0]Global $aRtlMoveMemory = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("kernel32.dll"), "str", "RtlMoveMemory")
[/autoit] [autoit][/autoit] [autoit]
Global $pRtlMoveMemory = $aRtlMoveMemory[0]Global $aSendMessageW = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("user32.dll"), "str", "SendMessageW")
[/autoit] [autoit][/autoit] [autoit]
Global $pSendMessageW = $aSendMessageW[0]Global $aDeleteObject = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("gdi32.dll"), "str", "DeleteObject")
[/autoit] [autoit][/autoit] [autoit]
Global $pDeleteObject = $aDeleteObject[0]Global $aCreateBitmap = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("gdi32.dll"), "str", "CreateBitmap")
[/autoit] [autoit][/autoit] [autoit]
Global $pCreateBitmap = $aCreateBitmap[0]Global $pRemoteCode = _MemVirtualAlloc(0, 512, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
[/autoit] [autoit][/autoit] [autoit]Local $tCodeBuffer = DllStructCreate("byte[512]", $pRemoteCode)
[/autoit] [autoit][/autoit] [autoit]#Region Assemply
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tCodeBuffer, 1, _
"0x" & _
"33DB" & _ ; xor ebx, ebx
"68" & SwapEndian($pRandom) & _ ; push $pRandom
"B8" & SwapEndian($pRtlRandomEx) & _ ; mov eax, RtlRandomEx
"FFD0" & _ ; call eax
"8BCB" & _ ; mov ecx, ebx
"69C9" & SwapEndian(4) & _ ; imul ecx, 4
"81C1" & SwapEndian($pBits) & _ ; add ecx, $pBits
"68" & SwapEndian(3) & _ ; push 3 bytes
"68" & SwapEndian($pRandom) & _ ; push $pRandom
"51" & _ ; push ecx
"B8" & SwapEndian($pRtlMoveMemory) & _ ; mov eax, RtlMoveMemory
"FFD0" & _ ; call eax
"43" & _ ; inc ebx
"81FB" & SwapEndian($iSize) & _ ; cmp ebx, $iSize; <- compare ebx with $iSize
"75" & Hex(256 - 53, 2) & _ ; jne -53 bytes; <- this is saying go back and do it again if not equal
"68" & SwapEndian($pBits) & _ ; push $pBits
"68" & SwapEndian(32) & _ ; push BitsPerPel
"68" & SwapEndian(1) & _ ; push Planes
"68" & SwapEndian($iHeight) & _ ; push $iHeight
"68" & SwapEndian($iWidth) & _ ; push $iWidth
"B8" & SwapEndian($pCreateBitmap) & _ ; mov eax, CreateBitmap
"FFD0" & _ ; call eax
"50" & _ ; push eax
"68" & SwapEndian(0) & _ ; push IMAGE_BITMAP
"68" & SwapEndian($STM_SETIMAGE) & _ ; push STM_SETIMAGE
"68" & SwapEndian($hPicHandle) & _ ; push $hPicHandle
"B8" & SwapEndian($pSendMessageW) & _ ; mov eax, SendMessageW
"FFD0" & _ ; call eax
"50" & _ ; push eax
"B8" & SwapEndian($pDeleteObject) & _ ; mov eax, DeleteObject
"FFD0" & _ ; call eax
"C3" _ ; ret
)
#EndRegion Assembly;While 1
[/autoit] [autoit][/autoit] [autoit]#region Assembly
[/autoit] [autoit][/autoit] [autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$t=timerinit()
for $i=1 to 10
DllCall("user32.dll", "int", "CallWindowProcW", _
"ptr", $pRemoteCode, _
"int", 0, _
"int", 0, _
"int", 0, _
"int", 0)
next
#endregion Assembly
$x=timerdiff($t)
msgbox(0,0,$x)
Sleep(10)
while 1
WEndFunc SwapEndian($iValue)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Return Hex(Binary($iValue))
EndFunc ;==>SwapEndianFunc _Quit()
[/autoit]
Exit
EndFunc ;==>_Quit
Assembler such man sich den passenden...ob MASM (Microsoft) oder TASM ist egal, es gibt reihenweise Assembler. Das wichtigste ist der Macro-Befehlssatz, richtig angewendet, musst du kein eines Register "anfassen", dann ist der Assembler ähnlich wie eine Hochsprache. Bis vor einigen Jahren habe ich die Inline-Assembler meiner Basic-Compiler benutzt. für schnelle Standalone-*.COM-Dateien hatte ich den A86, heute finde ich den FASM sehr gelungen, da es auch eine Version "für Mausschubser" gibt. Will heissen, eine (sehr simple) IDE mit Fensterchen, Code reinschreiben, F5 drücken, Dll oder EXE fertig....kein Makefile und kein Gelinke und den anderen unnötigen Krempel, den keiner wirklich braucht....ZitatWie hast du dir denn diese Asm Kentnisse verschafft?
Ich zitiere mich mal selbst aus einem Posting:Zitat
Learning by doing wars wohl, ein Buch hatte ich damals auch, allerdings sind die Anfänge schon ziemlich genau 30 Jahre her. Ich hatte damals fürs Abi einen PC1401, das ist ein mit Basic und Maschinensprache programmierbarer "Taschenrechner" von Sharp, den ich heute noch benutze! In den Speicher von immerhin 3534 (manche Zahlen vergisst man nie ) BYTE, passten mehrere kleine Basic-Programme, die durch den Interpreter im ROM ausgeführt wurden. Allerdings konnte man dieses Gerät auch mit Maschinensprache füttern. Der serielle Port nach "draussen" konnte mit Maschinensprache wesentlich schneller angesprochen werden, mit ein bissl löten und Bauteilen für ein paar Pfennige hatten wir (einige in meiner Klasse hatten so einen Rechner) schon 1985 ein Infrarot-"Netzwerk" gebastelt, welches sich bei der Physik-und E-Technik-Abschlussklausur in der Aula (nur an jedem 3. Tisch durfte ein Schüler sitzen) extrem positiv für mein Bestehen des ABI´s auswirkte.
Dann bekam ich irgendwann einen IBM-PC, 8088 mit 4,77 Mhz, aufgerüstet mit einem Coprozessor für mathematische Berechnungen. Auch dort hatte ich die Benutzerschnittstelle (GUI wäre wohl etwas übertrieben) mit Basic erstellt und alles, was "Speed" brauchte, mit Assembler. Später dann Turbo-Basic (gibts heute noch) mit intergriertem Assembler. Pascal hatte ich nur kurz gestreift, und den "Hype" darum belächelt.
Während meiner Lehre als Maschinenbauer hatte ich mit meinen "Taschenrechner" aus einer 3-Achsen-Fräsmaschine eine NC-Maschine gebaut, man beachte, Steuerung und Programm zusammen in 3534 BYTE.
Dann hab ich Maschinenbau studiert und bei den "Freaks" den C-Hype belächelt. Spaghetticode in C ist unendlich mal schlimmer als in Basic, aber naja...erklär das mal einem Programmierer. Hab dann nur zum Spass die (natürlich in C geschriebenen Grafik-Treiber) für die CAD-Workstations in der FH mal durch welche in Assembler ersetzt und eine 15-fache Geschwindigkeitssteigerung rausgeholt. Das sind 1500% Mehrleistung. Heute braucht man für 15% Mehrleistung eine komplett neue Prozessorgeneration....Dann habe ich, durch berufliche Entwicklung, nur noch wenig mit Assembler zu tun gehabt. Die von mir gegründete Firma hatte mit EDV nichts zu tun. In den letzten Jahren habe ich ein bisschen Zeit für mein "Hobby" Computer gefunden und AutoIt als würdigen Basic-Nachfolger kennengelernt. Da das Internet extrem viel Informationen bereitstellt, ist nur noch die Suche nach den "guten" Seiten eine Herausforderung. Für Assembler gilt das auch, Bücher habe ich mir in den letztenn Jahren keine mehr gekauft, ich verwende eigentlich immer noch (bis auf einige Ausnahmen) den Uralt-8088-Code. Der reicht für 99% immer noch aus...
Also stöbere einfach ein bisschen im Netz, Tutorials gibt es sehr gute, und fang einfach mit leichten Sachen an.
Ward aus dem engl. Forum hat die FASM.AU3 bereitgestellt, hast du sicher schon gefunden.
Wenn du Lust hast, können wir eine FUN-"Assembler" Abteilung bei AutoIt aufbauen. Der FASM eignet sich hervoragend dafür. Assembler ist wesentlich einfacher als man denkt, und wie gesagt, 99% aller Programme kann man mit 20 Befehlen schreiben, mehr braucht idR kein Mensch
Das "Verständnis", was, warum und wie in einem Computer abläuft, erhält man mit Assembler jedenfalls sofort. Bei einem Fehler schmiert die Kiste ab, hehe^, das war schon vor 30 Jahren nicht anders -
Wenn es keinen Compiler gibt, wie kommt man dann an die Exe Dateien, oder wie knn man den Code überhaupt ausführen?
Und könntest du mir vllt. mal einen Link zu einem deutschen, gutem Asm Tut geben? Ich kann nicht beurteilen, was nun gut oder schlecht ist
Danke für die Hilfe -
Zitat
Wenn es keinen Compiler gibt, wie kommt man dann an die Exe Dateien
Diese Frage verstehe ich ehrlich gesagt nicht.Was hat das eine denn mit dem anderen zu tun?
ZitatUnd könntest du mir vllt. mal einen Link zu einem deutschen, gutem Asm Tut geben?
Eins möchte ich in aller Deutlichkeit nochmal klarstellen:
Meiner Meinung nach sind heutige C++-Compiler in 99% aller Fälle so schnell wie ein guter Assemblercode. Unter der Vorraussetzung, daß der C++-Programmierer weiß, was er da tut! Kein Compiler kann langsamen Code in schnellen Code verwandeln! Für Assemblerprogrammierer gilt das gleiche!
Andererseits haben reichlich 08/15 C++-Programmierer seitens Geschwindigkeit nicht den Hauch einer Chance! Compileroptionen hin oder her! Ein Bekannter programmierte viele Jahre bei/für SUN, was der an Java-Code abliefert, das putzt die meisten C++-Programmierer von der Platte. Mal davon abgesehen, daß Java im gegensatz zu Assembler auf jede Plattform ohne Aufwand portierbar ist, sind auch dort Prozessor/Plattformspezifische Libraries in (schnellem) Maschinencode immer gern gesehen!
Einer meiner Kunden ist Spezialist für Cobol. Über Verdienst redet man nicht, aber er hat sich zu einer Aussage "Faktor 4" zu guten (!) C++-Programmierern hinreissen lassen. Soll ich jetzt empfehlen Cobol als Programmiersprache zu lernen?Macht das, was euch Spass macht! Das ist das wichtigste! Und macht es richtig.
Ich habe nie programmieren gelernt, und will es auch garnicht mehr "richtig" lernen, dazu bin ich zu alt^^- Ich mache das, was mir Spass macht!
Und wenn mein AutoIt-Programm tut was es soll, dann bin ich Happy. Und wenn es mit der Geschwindigkeit etwas hapert, dann schreib ich in 08/15-8088-Assembler eine Dll oder "Embedded Code", damit es auch "fluppt". C++ jedenfalls fange ich dafür jedenfalls nicht mehr an zu lernen^^ , auch wenn die C++-Dll 3x schneller als mein Assemblercode wäre. Man hat ja auch seinen Stolz