Problem mit Ausgabe
-
Hallo, kann sich mal einer mein Prog. angucken, bin noch recht neu im Gebiet Assembler...
Ich bekomm einfach die Ausgabe nicht gebacken.
Danke.;Programm soll beim Start fragen, "Wieviel Euros hast du noch?", bediener antwortet erhlich mit Zahl ;Wenn er antwortet 0, geben Sie aus "Armes Schwein" .. größer 0, "du Glücklicher" .model flat .stack 100h .data aus1 db 'Wieviel Euros hast du noch?: $' aus2 db 'Du armes Schwein $' aus3 db 'Du Gluecklicher $' nl db 10,13, '$' .code .include ein32dez.inc .include aus32dez.inc start: mov ah,9 ; Ausgabe Text 'aus1' lea dx,aus1 ; lea, speichert Adresse nicht den Inhalt int 21h call ein32dez ; Eingabe einer Zahl in AX mov ax,0 ; In ax eine 0 packen cmp ax,0 ; Vergleichen ... je rofl ; ... wenn gleich, ab nach rofl ja lol mov ebx,eax ; Sicherung in BX rofl: lea dx,aus2 mov ah,9 ; Ausgabe 'neue Zeile' int 21h mov eax,ebx ; Rücksicherung in EAX lol: lea dx,aus3 mov ah,9 ; Ausgabe 'neue Zeile' int 21h mov ah,1 ; Wartet auf Tasteneingabe int 21h ; vor dem Programmende mov ax,4c00h int 21h ; Programm beenden end start
-
mov ax,0
cmp ax,0das macht wohl nicht viel sinn...
-
Wieso, ich brauch doch ein Wert wonach er sich richtet.. den vergleicht er, und anhand dessen soll er die Ausgabe wählen..
-
ich weiss ja nicht was ein32dez genau macht, aber
mov ax,0 lädt ax mit dem wert 0
cmp ax,0 vergleicht den wert in ax mit dem wert 0, da aber grade 0 in das register geladen wurde, ist natürlich klar, dass das ergebnis immer 'gleich' sein wird.
folglich wird der sprung je rofl immer ausgeführt
übrigens kann der vergleich cmp ax,0 eleganter durch or ax,ax oder and ax,ax durchgeführt werden
-
Moin, Moin...
Also, was mich schon am Anfang stutzig macht, ist .model flat. Dein Programm scheint für DOS zu sein, da Du den DOS-Interrupt 021h verwendest. DOS arbeitet aber nicht mit dem Speichermodell FLAT zusammen.
Des Weiteren verwendest Du die 32-Bit-Register ebx und eax. Die Standard-Einstellung bei TASM und MASM ist aber, dass Code für den 8086 erzeugt wird. Diese CPU hatte bekanntlich noch keine 32-Bit-Register.
Ich bezweifel doch sehr, dass das Programm tatsächlich ohne Fehlermeldung übersetzt wird.
Versuche es mal so:
;Programm soll beim Start fragen, "Wieviel Euros hast du noch?", bediener antwortet erhlich mit Zahl ;Wenn er antwortet 0, geben Sie aus "Armes Schwein" .. größer 0, "du Glücklicher" .model small .stack 100h .data aus1 db 'Wieviel Euros hast du noch?: $' aus2 db 'Du armes Schwein $' aus3 db 'Du Gluecklicher $' nl db 10,13, '$' .code .386 include ein32dez.inc include aus32dez.inc start: .startup mov ah,9 ; Ausgabe Text 'aus1' lea dx,aus1 ; lea, speichert Adresse nicht den Inhalt int 21h call ein32dez ; Eingabe einer Zahl in AX ; Die Funktion ein32dez liefert doch wohl eine Zahl zurück. Wahrscheinlich in Register ax. ; Daher ist mov ax, 0 Blödsinn! ;mov ax, 0 ; In ax eine 0 packen cmp ax,0 ; Vergleichen ... je rofl ; ... wenn gleich, ab nach rofl ja lol mov ebx,eax ; Sicherung in BX rofl: lea dx,aus2 mov ah,9 ; Ausgabe 'neue Zeile' int 21h mov eax,ebx ; Rücksicherung in EAX lol: lea dx,aus3 mov ah,9 ; Ausgabe 'neue Zeile' int 21h mov ah,1 ; Wartet auf Tasteneingabe int 21h ; vor dem Programmende .exit 0 end start
Ciao...
-
Und nochmal Moin, Moin...
Es sind noch einige Ungenauigkeiten im Programm. Du benutzt
cmp ax,0 ; Vergleichen ... je rofl ; ... wenn gleich, ab nach rofl ja lol
Wenn Du eine negative Zahl eingibst, dann wird auch "Du Glücklicher" ausgegeben. Du verwendest die Sprunganweisung ja (jump if above). Die arbeitet aber nur mit vorzeichenlosen Zahlen. Verwende stattdessen jg (jump if greater).
Nachdem der Text aus2 ausgegeben wird, sollte ein Sprung zum Ende erfolgen, damit der nächste Text nicht auch noch ausgegeben wird.
Ciao...
-
Danke, hab es hinbekommen!