Autor Beitrag
Silas
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: So 03.06.07 12:11 
user profile iconSilas 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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. :nixweiss:

_________________
Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat ;-)
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Fr 08.06.07 20:25 
user profile iconSilas 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. :nixweiss:


Hallo,

Console unterscheidet sich nur dadurch, dass Ein/Ausgaben durch die Standard-File(-Handles) erfolgen und nicht über GDI.

Gruss Reinhard
Silas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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.":

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 11.06.07 18:43 
user profile iconSilas 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Mi 13.06.07 18:34 
Ich habs jetzt mal folgendermaßen versucht:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Do 14.06.07 13:40 
user profile iconSilas 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:
ausblenden volle Höhe Quelltext
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Sa 30.06.07 15:19 
Hm...

das funktioniert bei mir auch irgendwie nicht...

assembliert hab ichs so:
ausblenden Quelltext
1:
2:
ml /c ctest.asm
link /Subsystem:windows ctest


Der Assembler hat nichts daran auszusetzen, aber der Linker beschwert sich:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 30.06.07 15:49 
user profile iconSilas 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: Sa 30.06.07 17:33 
Vielen Dank, Reinhard!!

Es funktioniert jetzt. Das es hier auch noch mal steht:

ausblenden 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:
ausblenden 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 ;-)