• 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

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

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

    Zitat

    2. 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 ^^.

    Zitat

    Ich empfehle dir C++ zu nehmen


    Stimmt, wenn dus noch nicht kannst, sehr zu empfehlen.

    Nur keine Hektik - das Leben ist stressig genug

  • 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


    autoit.de/wcf/attachment/11025/


    Beispiel OpenGL

    Spoiler anzeigen

    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.

    LeseTip für Interessierte

  • 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
    #include <GUIConstantsEx.au3>
    #include <Memory.au3>
    #include <winapi.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $STM_SETIMAGE = 370

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $iWidth = 800
    Global Const $iHeight = 470

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("", $iWidth, $iHeight)
    GUISetOnEvent(-3, "_Quit")
    GUISetBkColor(0)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hPic = GUICtrlCreatePic("", 0, 0, $iWidth, $iHeight)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iSize = $iWidth * $iHeight
    Global $tBits = DllStructCreate("int[" & $iSize & "]")
    Global $pBits = DllStructGetPtr($tBits)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $hBitmap, $aCall, $iHMsg
    Global $hPicHandle = GUICtrlGetHandle($hPic)

    [/autoit] [autoit][/autoit] [autoit]

    Global $tRandom = DllStructCreate("dword")
    Global $pRandom = DllStructGetPtr($tRandom)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $aRtlRandomEx = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("ntdll.dll"), "str", "RtlRandomEx")
    Global $pRtlRandomEx = $aRtlRandomEx[0]

    [/autoit] [autoit][/autoit] [autoit]

    Global $aRtlMoveMemory = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("kernel32.dll"), "str", "RtlMoveMemory")
    Global $pRtlMoveMemory = $aRtlMoveMemory[0]

    [/autoit] [autoit][/autoit] [autoit]

    Global $aSendMessageW = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("user32.dll"), "str", "SendMessageW")
    Global $pSendMessageW = $aSendMessageW[0]

    [/autoit] [autoit][/autoit] [autoit]

    Global $aDeleteObject = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("gdi32.dll"), "str", "DeleteObject")
    Global $pDeleteObject = $aDeleteObject[0]

    [/autoit] [autoit][/autoit] [autoit]

    Global $aCreateBitmap = DllCall("kernel32.dll", "ptr", "GetProcAddress", "ptr", _WinAPI_GetModuleHandle("gdi32.dll"), "str", "CreateBitmap")
    Global $pCreateBitmap = $aCreateBitmap[0]

    [/autoit] [autoit][/autoit] [autoit]

    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
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;While 1

    [/autoit] [autoit][/autoit] [autoit]

    #region Assembly

    [/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
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func SwapEndian($iValue)
    Return Hex(Binary($iValue))
    EndFunc ;==>SwapEndian

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Quit()
    Exit
    EndFunc ;==>_Quit

    [/autoit]


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

    Zitat

    Wie hast du dir denn diese Asm Kentnisse verschafft?


    Ich zitiere mich mal selbst aus einem Posting:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (17. August 2010 um 02:07)

  • 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 :thumbup:

  • 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?

    Zitat

    Und könntest du mir vllt. mal einen Link zu einem deutschen, gutem Asm Tut geben?

    http://www.gidf.de

    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 :rolleyes: