Frage zum Assembler Buch





  • Nein. Das Buch hat den falschen Titel, es sollte vielmehr "Das x86 Buch" heißen. Du suchst wohl mehr ein Buch, was dir x86 Assembler Programmierung mit MASM oder NASM beibringt. Dafür ist es jedoch absolut das falsche Buch.



  • Hallo,

    ich kenne das Buch (die Bücher, da muss noch ein grünes als Referenz der Befehle mit dabei sein).
    Meine Meinung zu den Kleinigkeiten ist, nein, sie musst du nicht von Anfang an lernen. Man lernt sie vielmehr, indem man versucht, etwas lauffähiges zu programmieren.
    Und ich finde, das Buch ist gar nicht falsch. Ich würde von den Tutorials die Finger lassen, sind sowieso alle zu oberflächlich.
    Du merkst wahrscheinlich schon, dass es gar nicht so trivial ist, ein ganzes Programm in Assembler zu schreiben... nur so in Anlehnung an mein Kommentar im vorigen Thread.
    Welchen Assembler benutzt du eigentlich, ich meine masm, nasm, GNU as?



  • Ja ich benutzt das Assembler Buch von Trutz Eyke Podschun.

    @melkfett Naja will eh erstmal die Grundlagen lernen, außerdem sollten die Codes die da drinen sind mit MASM und TASM arbeiten (aber iwie funken die nur mit TASM^^)
    @abc.w Ich hab mich noch net ganz entschieden, ich hab mir mal die drei großen ASM's geladen: MASM, TASM und NASM. Ich versuch momentan das ganze über RadASM zum Laufen zu bringen, TASM und MASM funken da super, doch NASM überhaupt net, das Ding will immer eine nasmw.exe und einen bin ordner im NASM Verzeichnis, den es net gibt.^^

    Ich werd dann wohl jetzt erstmal anfangen ein paar Dinge zum Laufen zu bringen, aber noch eine Frage:

    Hat jemand zufällig Erfahrung mit RadASM? Würde nämlich gern NASM zum Laufen bringen bzw. NASM32, weil ich gelesen hab, dass nasm+RadASM die beste Kombination ist.^^

    [e] Ahja das Assembler lernen läuft besser als ich dachte, ich versteh schon sehr viel, jedoch würde ich das sicherlich net so schnell nachschreiben könne, hier ein Beispiel:

    .386
    .model flat,stdcall
    option casemap:none
    
    include Basics2.inc
    
    .code
    
    start:
    
    	invoke GetModuleHandle,NULL
    	mov    hInstance,eax
    	invoke GetCommandLine
    	invoke InitCommonControls
    	invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
    	invoke ExitProcess,eax
    
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    	LOCAL	wc:WNDCLASSEX
    	LOCAL	msg:MSG
    
    	mov		wc.cbSize,SIZEOF WNDCLASSEX
    	mov		wc.style,CS_HREDRAW or CS_VREDRAW
    	mov		wc.lpfnWndProc,OFFSET WndProc
    	mov		wc.cbClsExtra,NULL
    	mov		wc.cbWndExtra,DLGWINDOWEXTRA
    	push	hInst
    	pop		wc.hInstance
    	mov		wc.hbrBackground,COLOR_BTNFACE+1
    	mov		wc.lpszMenuName,OFFSET MenuName
    	mov		wc.lpszClassName,OFFSET ClassName
    	invoke LoadIcon,NULL,IDI_APPLICATION
    	mov		wc.hIcon,eax
    	mov		wc.hIconSm,eax
    	invoke LoadCursor,NULL,IDC_ARROW
    	mov		wc.hCursor,eax
    	invoke RegisterClassEx,addr wc
    	invoke CreateDialogParam,hInstance,addr DlgName,NULL,addr WndProc,NULL
    	invoke ShowWindow,hWnd,SW_SHOWNORMAL
    	invoke UpdateWindow,hWnd
    	.while TRUE
    		invoke GetMessage,addr msg,NULL,0,0
    	  .BREAK .if !eax
    		invoke TranslateMessage,addr msg
    		invoke DispatchMessage,addr msg
    	.endw
    	mov		eax,msg.wParam
    	ret
    
    WinMain endp
    
    WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    LOCAL	buffer[128]:BYTE	;/* our local variable for reading from the textfile, acces local variables with: addr */
    
    	mov		eax,uMsg
    	.if eax==WM_INITDIALOG
    		push		hWin
    		pop		hWnd
    
    		invoke  GetMenu, hWnd              ; Get handle to main menu
    		mov     hMenu, eax
    
    	.elseif eax==WM_COMMAND
    		mov		eax,wParam
    		and		eax,0FFFFh
    		.if eax==IDM_FILE_EXIT
    			jmp Exit
    
    		.elseif eax==IDM_HELP_ABOUT
    			invoke ShellAbout,hWin,offset AppName,offset AboutMsg,NULL
    
    		.elseif eax==1001
    			invoke EnableMenuItem, hMenu, 0, MF_DISABLED or MF_BYPOSITION or MF_DISABLED
    			invoke EnableMenuItem, hMenu, 0, MF_DISABLED or MF_BYPOSITION or MF_GRAYED
    		.elseif eax==1002
    			invoke EnableMenuItem, hMenu, 0, MF_ENABLED or MF_BYPOSITION or MF_ENABLED
    
    		.elseif eax==1003
    			Exit:
    		        invoke MessageBox,hWin,offset Quit,offset AppName,MB_YESNO
              		.if eax == IDNO
                			ret
              		.endif
    			invoke SendMessage,hWin,WM_CLOSE,NULL,NULL
    
    		.elseif eax==1004
    			;/* NOTE: This sample is not the best way to read and write from text, its the easiest for this demo */
    			; Create a new file, overwrite any existing file.
    			invoke CreateFile, offset szFile, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0
    			.if eax!=INVALID_HANDLE_VALUE		;if file exists ... then
    				mov hFile, eax
    	         		; Write our string the the file
    				invoke WriteFile, hFile, offset WriteString, sizeof WriteString, offset WriteSize, 0
    	         		; Close handle to file
    				invoke CloseHandle, hFile
    			.else
    				invoke MessageBeep,MB_OK
    			.endif
    
    		.elseif eax==1007
    			; Create a new file, overwrite any existing file.
    			invoke CreateFile, offset szFile, GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING, 0, 0
    			.if eax!=INVALID_HANDLE_VALUE		;if file exists ... then
    				mov hFile, eax
    		         	; Write our string the the file
    				invoke ReadFile,hFile,addr buffer,sizeof buffer,offset WriteSize,0
    				invoke MessageBox,hWin,addr buffer,offset AppName,MB_OK
    		         	; Close handle to file
    				invoke CloseHandle, hFile
    			.else
    				invoke MessageBeep,MB_OK
    			.endif
    
    		.elseif eax==1008
    			invoke CreateDialogParam,hInstance,2000,hWin,offset NewDlgProc,FALSE
    		.elseif eax==1006
    			invoke SendDlgItemMessage,hWin,1005,SB_SETTEXT,0,offset AppName
    		.endif
    
    	.elseif eax==WM_CLOSE
    		invoke DestroyWindow,hWin
    	.elseif uMsg==WM_DESTROY
    		invoke PostQuitMessage,NULL
    	.else
    		invoke DefWindowProc,hWin,uMsg,wParam,lParam
    		ret
    	.endif
    	xor    eax,eax
    	ret
    
    WndProc endp
    
    NewDlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    
    	mov		eax,uMsg
    	.if eax==WM_INITDIALOG
    
    	.elseif eax==WM_COMMAND
    		mov		eax,wParam
    		mov		edx,eax
    		shr		edx,16
    		and		eax,0FFFFh
    		.if edx==BN_CLICKED
    			.if eax==2001
    				invoke SendMessage,hWin,WM_CLOSE,NULL,NULL
    			.endif
    		.endif
    	.elseif eax==WM_CLOSE
    		invoke EndDialog,hWin,NULL
    	.else
    		mov eax,FALSE
    		ret
    	.endif
    	mov  eax,TRUE
    	ret
    
    NewDlgProc endp
    
    end start
    


  • ich kann deine frage aufgrund mangelnder erfahrung mit radasm leider nicht beantworten, möchte aber an dieser stelle nochmal auf yasm als alternative hinweisen 🙂



  • sothis_ schrieb:

    ich kann deine frage aufgrund mangelnder erfahrung mit radasm leider nicht beantworten, möchte aber an dieser stelle nochmal auf yasm als alternative hinweisen 🙂

    Danke, aber ich schätze, dass ich in Zukunft MASM und/oder NASM verwenden werde 🙂



  • Ist das Beispiel wirklich aus dem oben genannten Buch? Kann mich irgendwie nicht erinnern... vielleicht verwechsele ich da irgendwas. Ist nämlich eine reine WinAPI-Applikation für Windows. Ist auch egal... viel Spass damit.



  • abc.w schrieb:

    Ist das Beispiel wirklich aus dem oben genannten Buch? Kann mich irgendwie nicht erinnern... vielleicht verwechsele ich da irgendwas. Ist nämlich eine reine WinAPI-Applikation für Windows. Ist auch egal... viel Spass damit.

    Ne, das oben ist net von dem Buch, wäre zu schön um wahr zu sein.

    Das Beispiel hab ich von einem MASM-Example, wollte damit nur sagen, dass ich den Code eigentlich schon verstehe, aber wahrscheinlich net selber schreiben kann.^^
    [e] Im Buch steht leider nur so Zeug:

    DATA SEGMENT WORD 'DATA'
    Msg DB 13,10,'Hallo, Welt!',7,13,10,'$'
    DATA ENDS
    CODE SEGMENT WORD 'CODE'
    ASSUME CS:CODE, DS:DATA
    Start: mov ax,DATA
    mov ds,ax
    mov dx,OFFSET Msg
    mov ah,009h
    int 021h
    mov ah,04Ch
    int 021h
    CODE ENDS
    END Start
    

    (lässt sich leider nur mit TASM assemblieren, obwohl im Buch steht, dass es auch mit MASM geht, wahrscheinlich meinte er damit nicht die Version 9, sondern eher die Version 6.^^)



  • In dem Buch wird doch erstmal auf de ersten 500 Seiten bis ins kleinste Detail der ganze x86 Kram durchgekauft mit LTD und GTD und dem ganzen descriptor Krempel etc. Fande ich für einen totalen Newbie nicht sehr hilfreich. Das checkt kein Mensch, wenn er nicht vorher Bücher über Arbeitsweise von Prozessoren gelesen hat. Und wer will sich diesen ganzen Intel Mist auch schon freiwillig antun...Wenn ich mich jetzt richtig erinner, war in dem Buch auch alles vollkommen durcheinander und man musste ständig hin und her blättern, also ich war damals nicht sehr begeistert!!



  • melkfett schrieb:

    In dem Buch wird doch erstmal auf de ersten 500 Seiten bis ins kleinste Detail der ganze x86 Kram durchgekauft mit LTD und GTD und dem ganzen descriptor Krempel etc. Fande ich für einen totalen Newbie nicht sehr hilfreich. Das checkt kein Mensch, wenn er nicht vorher Bücher über Arbeitsweise von Prozessoren gelesen hat. Und wer will sich diesen ganzen Intel Mist auch schon freiwillig antun...Wenn ich mich jetzt richtig erinner, war in dem Buch auch alles vollkommen durcheinander und man musste ständig hin und her blättern, also ich war damals nicht sehr begeistert!!

    Genau so ist es, zum Glück hab ich noch andere Literatur zum Thema Assembler und ein paar gute Webseiten.

    Naja meine Frage wäre somit beantwortet. 🙂


Anmelden zum Antworten