Ein/Ausgabe von Zeichen
-
Hallo Zusammen!
Ich habe ein kleiner Problem. Da ich ich Anfänger in Sachen Assembler bin würde mich freuen wenn ich hier Hilfe bekommen würde.
Es soll folgende Programmierung gelöst werden:Im Datensegment eines Assemblerprogramms steht folgender Eintrag:
Feld1 db 301 dup(0)Dieses Feld soll durch eine Eingabe von der Tastatur mit Zeichen beschrieben werden. Die Eingabe soll durch
die Eingabe des Zeichens CR (Enter) oder nach der Eingabe von 300 Zeichen beendet werden.
Für eine spätere Ausgabe der Zeichen soll das Zeichen CR als Endezeichen dienen.
Erstellen Sie ein Assemblerprogrammin der 80x86 Programmiersprache, der die Eingabe der Zeichen realisiert.
Das Programm soll im Protected-Mode laufen.Habt vielen Dank vorab für Eure Hilfe.
Gruß
packman2012
-
Ja und?
Welches Betriebsystem, welche Programierschnittstellen (Systemaufrufen, Api, Funktionen und Interrupts)
...und welcher Assembler?Und soll das Programm wirklich im Protected Mode laufen? Dort gibt es nämlich kein Datensegment im eigentlichen Sinne.
Ganz grob: Betriebsystemfunktion oder Interrupt zum Einlesen von Zeichen nach Register X. Wenn ein Zeichen im Register ist, dann gucken, ob es der Carriage Return ist. Falls ja, zur Ausgaberoutine, Falls nein, weiter in den reservierten Datenbereich schreiben. Da man immer gucken muß, ob Carriage Return, geht das Einlesen und Schreiben nur Codeformweise, also bei ASCII z.B. Byteweise.
Ausgaberoutine: Mit einem Register auf den Anfang der Daten zeigen, Betriebsystemfunktion oder Interrupt für die Ausgabe einzelner Zeichen, Zeiger einen Schritt weiter. Gucken, ob Carriage Return dabei, dann
Programm beenden mit Betriebsystemfunktion oder Interrupt.Guck also erstmal, welche Betriebsystemfunktionen du gebrauchen kannst, und was die der Assembler an Arbeit abnehmen kann bzw. was der an Funktionen und Makros zum Benutzen im Progamm hat, und wie die allgemeine Sytax von einem Programmgerüst aussieht.
-
Diese Aufgabe habe ich so gestellt bekommen ohne weitere Infos. Könntest Du mir vielleicht trotzdem weiterhelfen?
Danke vorab!!!
-
packman2013 schrieb:
Diese Aufgabe habe ich so gestellt bekommen ohne weitere Infos. Könntest Du mir vielleicht trotzdem weiterhelfen?
Danke vorab!!!Dazu reichen Deine Infos aber nicht aus:
-
Wie stellst Du Dir die Hilfe vor? Hausaufgaben werden nicht gemacht, Einführungen in Assembler werden auch nicht gemacht.
-
Welches Betriebssystem? Welcher Assembler? Wenn Du das aus Deinen Unterlagen nicht herauskriegst, dann musst Du eben erst einmal irgend einen Assembler installieren. Nach Deinen spärlichen Angaben empfehle ich:
http://www.codingcrew.de/masm32/index.php
-
Gewöhne Dich an die Vorstellung, englische Texte lesen zu müssen. Das ist gar nicht so schwierig, da Programmierer-Englisch recht einfach gestrickt ist. Man muss sich nur am Anfang durchbeißen.
-
Du brauchst Lernmaterial ("Tutorial"). Wenn Du bereits Unterlagen hast, dann nimm diese und nichts anderes! Du wirst im Netz keine Erleuchtung sondern Verwirrung finden. GOTO Frage 2).
viele grüße
ralph
-
-
Als Assembler nutze ich MASM32 auf einem W7 Rechner. Das "Hallo Welt" programm läßt sich jedoch unter W7 64-Bit nicht starten.
-
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