Autor |
Beitrag |
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Sa 02.06.07 16:50
Hallo,
ich wollte ein Programm für Windows in Assembler (mit MASM32) schreiben, mich aber nicht mit der Fensterprogrammierung rumschlagen und deshalb die Konsole verwenden. Funktioniert das über die API oder über Interrupts? Und welche Assembler/Linkeroptionen muss ich verwenden (Bzw. welchen Linker brauch ich)?
Vielen Dank
Silas
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 03.06.07 12:11
Silas hat folgendes geschrieben: | Hallo,
ich wollte ein Programm für Windows in Assembler (mit MASM32) schreiben, mich aber nicht mit der Fensterprogrammierung rumschlagen und deshalb die Konsole verwenden. Funktioniert das über die API oder über Interrupts? Und welche Assembler/Linkeroptionen muss ich verwenden (Bzw. welchen Linker brauch ich)?
Vielen Dank
Silas |
Hallo,
wahrscheinlich hilft dir das weiter:
andremueller.gmxhome.de/winintro.html
Gruss Reinhard
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Fr 08.06.07 17:30
Muss ich leider passen, aber das hat mir nicht geholfen. Wie man eine Windows-App schreibt, ist mir schon klar, nur halt nicht, wie man das mit der Konsole macht. 
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Timosch
      
Beiträge: 1314
Debian Squeeze, Win 7 Prof.
D7 Pers
|
Verfasst: Fr 08.06.07 18:41
Ich glaub, du mussts auch unter Windows über den int 21h machen. Bin mir aber nicht sicher, Assembler programmier ich normalerweise nur unter DOS.
_________________ If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Fr 08.06.07 20:25
Silas hat folgendes geschrieben: | Muss ich leider passen, aber das hat mir nicht geholfen. Wie man eine Windows-App schreibt, ist mir schon klar, nur halt nicht, wie man das mit der Konsole macht.  |
Hallo,
Console unterscheidet sich nur dadurch, dass Ein/Ausgaben durch die Standard-File(-Handles) erfolgen und nicht über GDI.
Gruss Reinhard
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Sa 09.06.07 09:51
Ich habs jetzt einfach mal so probiert, es stürzt aber ab: "ctest.exe hat ein Problem festgestellt und muss beendet werden.": Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| .386 .MODEL Flat, stdcall .data oStr db "Testtext...",0 .code Start: mov ah, 09h mov edx, offset oStr int 21h mov ah, 4Ch int 21h END Start | und: Quelltext 1: 2:
| ml /c /coff ctest.asm link /Subsystem:windows ctest.obj | Ausgegeben wird nichts. Was ist jetzt falsch (Adressen müssten doch 32-Bit sein, oder?) Habt Gnade mit mir, ich bin ein Noob 
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 09.06.07 11:46
Falsch daran ist, dass Du im 32-Bit-Subsystem keine Berechtigungen zum Zugriff auf die IVT hast, weshalb das Programm mit ner AV abschmiert.
Wenn Du'S als COM machst, wär's trotzdem falsch, weil Du eine ndere Speicherverwaltung nutzt und damit den String über DS:DX und nicht über EDX addressierst ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Sa 09.06.07 12:10
Und wie sieht dann eine richtige Version aus bzw. was muss ich verändern (Sorry, aber ich kenn mich da nicht sonderlich gut aus)?
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Mo 11.06.07 16:55
*ein Schiebeposting verüb*
So helft mir doch ^^
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mo 11.06.07 18:43
Silas hat folgendes geschrieben: | *ein Schiebeposting verüb*
So helft mir doch ^^ |
Hallo,
INT21H ist DOS und hat hier nichts zu suchen. Das könnte man nur in einem DOS-Programm verwenden, das man mit Turbo Pascal für DOS schreiben müsste (vielleicht noch mit Delphi 1 und einigen Tricks). Direktes Schreiben in einen Videobuffer ist noch viel abwegiger.
Consolenprogramme arbeiten mit den Standard File Handles (Input,Output,Error). Man besorgt sich die Handles mit GetStandardHandle (-> Hilfe SDK) und schreibt was rein, z.B. "Hello World".
Gruss Reinhard
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Mi 13.06.07 18:34
Ich habs jetzt mal folgendermaßen versucht:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| .386 .Model Flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib
.data szText db "Hello World",0 .data? lpNrOfChars dd ? .code Start: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, ADDR szText, 12, ADDR lpNrOfChars, 0 invoke ExitProcess, 0 END Start |
Das funktioniert aber nicht  . Es schmiert nicht ab, gibt nur einfach nichts aus, die Konsole läuft normal weiter.
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Do 14.06.07 13:40
Silas hat folgendes geschrieben: | Ich habs jetzt mal folgendermaßen versucht:
....
Das funktioniert aber nicht . Es schmiert nicht ab, gibt nur einfach nichts aus, die Konsole läuft normal weiter. |
Hallo (world), das ist die offizielle Microsoftversion:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| ; Assemble options needed: /c
.386 .MODEL flat, stdcall
STD_OUTPUT_HANDLE EQU -11
GetStdHandle PROTO NEAR32 stdcall, nStdHandle:DWORD
WriteFile PROTO NEAR32 stdcall, hFile:DWORD, lpBuffer:NEAR32, nNumberOfBytesToWrite:DWORD, lpNumberOfBytesWritten:NEAR32, lpOverlapped:NEAR32
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
.STACK 4096
.DATA
msg DB "Hello, world.", 13, 10 written DW 0 hStdOut DD 0
.CODE _start: INVOKE GetStdHandle, STD_OUTPUT_HANDLE ; Standard output handle mov hStdOut, eax
INVOKE WriteFile, hStdOut, ; File handle for screen NEAR32 PTR msg, ; Address of string LENGTHOF msg, ; Length of string NEAR32 PTR written, ; Bytes written 0 ; Overlapped mode
INVOKE ExitProcess, 0 ; Result code for parent process
PUBLIC _start END |
Gruss Reinhard
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Sa 30.06.07 15:19
Hm...
das funktioniert bei mir auch irgendwie nicht...
assembliert hab ichs so: Quelltext 1: 2:
| ml /c ctest.asm link /Subsystem:windows ctest |
Der Assembler hat nichts daran auszusetzen, aber der Linker beschwert sich:
Quelltext 1: 2: 3: 4: 5: 6:
| ctest.obj : warning LNK4033: converting object format from OMF to COFF ctest.obj : error LNK2001: unresolved external symbol _GetStdHandle@4 ctest.obj : error LNK2001: unresolved external symbol _WriteFile@20 ctest.obj : error LNK2001: unresolved external symbol _ExitProcess@4 LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup ctest.exe : fatal error LNK1120: 4 unresolved externals |
Welche Linkeroptionen muss ich denn verwenden (Oder hast du die Adresse von dem Quelltext noch)?
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 30.06.07 15:49
Silas hat folgendes geschrieben: | Hm...
das funktioniert bei mir auch irgendwie nicht...
....
Welche Linkeroptionen muss ich denn verwenden (Oder hast du die Adresse von dem Quelltext noch)? |
Hallo, ich nicht, aber Microsoft, ist nur schwer zu finden:
support.microsoft.com/kb/94314/de
Lies den ganzen KB-Artikel, wenn dir das nicht hilft, wirds schwer...
Gruss Reinhard
|
|
Silas 
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Sa 30.06.07 17:33
Vielen Dank, Reinhard!!
Es funktioniert jetzt. Das es hier auch noch mal steht:
Hello World-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| .386 .Model Flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib
.data szText db "Hello World",0 .data? lpNrOfChars dd ? .code Start: invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, ADDR szText, 12, ADDR lpNrOfChars, 0 invoke ExitProcess, 0 END Start |
Assemblieren und linken muss man's so:
Quelltext 1: 2:
| ml /c /coff ctest.asm link /subsystem:console ctest |
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
|