Ein/Ausgabe von Zeichen
-
packman2013 schrieb:
Als Assembler nutze ich MASM32 auf einem W7 Rechner. Das "Hallo Welt" programm läßt sich jedoch unter W7 64-Bit nicht starten.
Wenn Du wirklich Hilfe willst, dann solltest Du etwas gesprächiger werden
Welches "Hallo Welt"-Programm? Was heißt "nicht starten"? Wie sieht die Fehlermeldung im Wortlaut aus?
Weißt Du schon, wie man die "Eingabeaufforderung" (auch bekannt als: Konsole, Dosbox, Shell) startet und bedient?viele grüße
ralph
-
Hallo Ralph!
Hab ersteinmal Dank für Deine Hilfe. Ich habe folgendes Programm:assume cs:prog,ds:daten
daten segment
text db "Hallo Welt!$"
daten ends
prog segment
a: mov ax,daten
mov ds,ax
mov ah,09h
lea dx,text
int 21h
mov ah,4ch
int 21h
prog ends
end aBei starten der exe soll die Ausgabe "Hallo Welt" erfolgen.
Das Kompelieren habe ich über die Eingabekonole "cmd" und den Befehl ml /c dateiname.obj gestartet. Ohne Fehler wurde die Datei erstellt.
Dann wollte ich über den Befehl "link16" und eingabe des dateinamens Dateiname.obj eine exe mit dem Namen Dateiname.exe erstellen. Ich habe dort den Name der *.obj angegeben und die Abfragen
run file
list fole
Libraries
definitions file
bestätigt.
Anschließen habe ich die Meldung "LINK: warning L4021: no stack segment in der Eingabeaufforderung erhalten.
Das starten der nun erstellten exe führte zu den Fehler, dass das Programm aufgrund einer Inkompatibilität mit 64-Bit-Version nicht gestartet werden kann.
Das MASM32-Packages habe installiert.
Ich hoffe, dass Du nun etwas damit anfangen kannst.viele Grüße
Volker
-
packman2013 schrieb:
Ich hoffe, dass Du nun etwas damit anfangen kannst.
Ja, damit kann ich etwas anfangen. Das Programm ist ein DOS-Programm, was Du anhand der "int 21h" erkennen kannst. Also ein 16-Bit-Real-Mode-Programm und kein 32-Bit-Protected-Mode-Programm. Ein 64-Bit-Windows verweigert den Start eines DOS-Programms. Nicht weiter schlimm, da Du ja "Protected Mode" (etwas ältliche Ausdrucksweise für 32-Bit-Programm) programmieren sollst. Vergiss einfach alle Programme, die ein "int ..." beinhalten oder gar die Hardwareports direkt ansprechen (;)).
Navigiere mal zum Ordner "\masm32\examples\exampl05\console\hello\" und starte aus der Konsole heraus das Programm "hello.exe". Das sollte funktionieren.
Nun brauchst Du ein brauchbares Gerüst ("Skeleton") für Dein Programm. Guck Dir mal "\masm32\examples\exampl01\generic\generic.asm" an. Für Deine Zwecke reicht aber:
.686P .model flat,stdcall option casemap:none .DATA ; Datensegment ; Daten .CODE ; Codesegment Start: ; Einsprungpunkt ; Code END Start ; Programmende mit Einsprungpunkt
Jetzt erst wird programmiert :). Es gibt verschiedene Möglichkeiten, Deine Aufgabe zu programmieren. Das MASM32-Paket ist (zu) sehr auf Makros konzentriert, so dass vom eigentlichen Assembler nicht mehr viel übrig bleibt. Das sollte wohl nicht der Sinn der Übung sein. Hast Du nicht ein Beispiel von vorigen Übungen?
viele grüße
ralph
-
16Bit - Dos Programme kann man fast problemlos mit Dosbox im Protected Mode unter 64Bit laufen lassen.
Zu Ein und Ausgaberoutingen mit masm32 haben hier schon etliche Neulinge ins Asmforum reingeposten, vielleicht kann man sich ja von denen etwas abgucken.
Aber statt in unterschiedlichen Foren reinzuposten, mit den selben fehlenden Angaben, würde ich lieber den Aufgabensteller um genauere Angaben bitten.
-
in meinem Ordner gibt es kein Verzeichnis "\masm32\examples\exampl05\console" und somit auch kein Unterverzeichnis "hello"
Das Verzeichnis mit der Datei "\masm32\examples\exampl01\generic\generic.asm" ist vorhanden. Diese ist nur wesentlich komplexer als Dein Beispiel. In nehme mal an das sind die ganzen Makros.Soweit ich mir erinnere müßte eine Schleife ein Unterprogramm angestoßen welchen auf Eingaben wartet bis in meinem Fall 300 Eingaben oder ein <CR> erreicht sind.
Ich schaue aber nochmal in meiner Unterlagen.
Erfolgt das Einlesen über
INS
input string
??
-
WinAPI-Lösung:
include \masm32\include\masm32rt.inc .code main proc LOCAL dwN:DWORD LOCAL hIn:HANDLE LOCAL hOut:HANDLE LOCAL sz[10+1]:BYTE print "Hello World",13,10 print "Enter 10 char.: " mov hIn,rv(GetStdHandle,STD_INPUT_HANDLE) mov hOut,rv(GetStdHandle,STD_OUTPUT_HANDLE) invoke SetConsoleMode,hIn,0 lea edi,sz xor esi,esi @@: invoke ReadConsole,hIn,ADDR sz[esi],1,ADDR dwN,0 movzx eax,sz[esi] cmp eax,13 je @F mov [edi+esi],al invoke WriteConsole,hOut,ADDR sz[esi],1,ADDR dwN,0 lea esi,[esi+1] cmp esi,LENGTHOF sz - 1 jb @B @@: mov BYTE ptr [edi+esi],0 print chr$(13,10,"your string: ",13,10,"'") print ADDR sz print "'",13,10 inkey exit main endp end main
\masm32\qeditor.exe; code einfügen; speichern; Project->"Console Build All" ; Project->"Run Program" :schland:
-
"mov [edi+esi],al" ist überflüssig
-
packman2013 schrieb:
in meinem Ordner gibt es kein Verzeichnis "\masm32\examples\exampl05\console" und somit auch kein Unterverzeichnis "hello"
Dann wirds Zeit für das neueste MASM32-Paket...
Das Verzeichnis mit der Datei "\masm32\examples\exampl01\generic\generic.asm" ist vorhanden. Diese ist nur wesentlich komplexer als Dein Beispiel. In nehme mal an das sind die ganzen Makros.
Es handelt sich um ein Skeleton für GUI-Anwendungen. Klick mal auf "generic.exe". Im Augenblick erstellst Du "nur" eine Console-Anwendung. Es ist aber eine gute Gedächtnisstütze, ob man in seinem eigenen Gerüst etwas vergessen haben könnte.
Hier ein Beispiel mit den "Console Mode Makros":
.686P .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\kernel32.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib .DATA Feld1 db 301 dup(0) msg db "Gib's mir bis zu 10 Mal: ", 0 crlf db 13, 10, 0 .CODE main PROC USES edi ebx print ADDR msg lea edi, Feld1 mov ebx, 10 @@: sub ebx, 1 jc @F getkey cmp al, 13 je @F mov [edi], al print edi add edi, 1 jmp @B @@: mov BYTE PTR [edi], 13 print ADDR crlf print ADDR Feld1 xor eax, eax ret main ENDP END main
viele grüße
ralph
-
Hallo Ralph
Hab vielen Dank für Deine Hilfe. Ich werde jetzt ein wenig probieren... darf ich mich nochmal bei Dir melden wenn ich nicht weiterkommen?Gruß
Volker
-
packman2013 schrieb:
Hallo Ralph
Hab vielen Dank für Deine Hilfe.Bitte gern geschehen :).
Ich werde jetzt ein wenig probieren...
Das ist gut, so bekommst Du es in Dein Gehirn.
darf ich mich nochmal bei Dir melden wenn ich nicht weiterkommen?
Privatlehrer - obendrein unbezahlt - spiele ich nicht. Stelle Deine Fragen hier im Forum. Anhand der vielen Antworten, die Du hier und anderswo bekommen hast, kannst Du Dir überlegen, wie man in Zukunft Fragen so stellt, dass man so schnell wie möglich so sinnvolle Antworten wie möglich bekommt.
viele grüße
ralph