![]() |
Wert einer Variablen in ASM ausgeben, String zusammensetzen
Wie man eine konstante Zeichenfolge in ASM ausgiebt weiß, habe ich hier
![]()
Code:
Ich bin davon ausgegangen, dass das dx Register für die Ausgabe zuständig ist, deswegen das Verschieben des Ergebnisses nach dx. mov ah, 9h ist wohl für die Ausgabe auf dem Bildschirm verantwortlich.
code segment
Start: mov ax, 5 add ax, 2 mov dx, ax mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start Des weiteren wollte ich wissen, wie man Zeichenketten verbindet, um vor und / oder nach dem Ergebnis noch Text auszugeben. |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Deine Fragen haben ja weniger mit Assembler zu tun, eher mit MS-DOS Programmierung.
Wenn du mich ganz lieb bittest dann stiefele ich mal in den Keller und suche dort mein MS-DOS Programmierhandbuch. Darin sind die Int21/15 Aufrufe dokumentiert. Im Kopf kann man so was nach 10 Jahren nicht mehr haben. Zum Zusammenfügen von Strings wird meistens ein globaler vordeklarierter Speicherbereich im Datensegemt benutzt, z.B. 512 Zeichen lang. Ansonsten muß man mit einem Speichermanager anfangen. Für kleinere PChars geht auch der Stack. Dazu wird mit ADD ESP,x und SUB ESP,x Speicher "alloziert". Gruß Hagen |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
So, bin gestiefelt, und habe meine alten Bücher entstaubt.
Zitat:
Zitat:
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
wenn Du weitere Funktionen suchst, kannst Du ja mal versuchen, ob Du auf einem Flohmarkt o.ä. ein Buch wie z.b. PC-Intern 2.0 Michael Tischer Data Becker ISBN: 3-89011-331-1 bekommst. Da dürfte eine recht vollständige Beschreibung der int 21h Aufrufe, und weiterer enthalten sein. Vielleicht wäre eine aktuellere Variante besser, da sich das genannte Buch mit DOS 4.0 beschäftigt. Die beiliegende Diskette ist übrigens im 5,25" Format ;-) [INSIDER]Bin wieder nicht mit dem Stuhl umgefallen :mrgreen:[/INSIDER] |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
:P Aber acht Minuten? Entweder langer Weg oder großer Keller.
Dank dir erstmal, aber diese Interrupts stehen in meinem Assembler Buch auch drin. Aber mit deinem Beispiel gibst du ja wieder eine konstante Zeichenkette aus. Oder meinst du jetzt, ich soll mir eine Variable definieren, den Inhalt des Registers darein kopieren und die Variable dann wie eine konstante Zeichenkette ausgeben? Nur wie bekomme ich da das NULL-zeichen hintendran? Zeichensalat habe ich schon hinbekommen. PS: Mach mal etwas Platz für das Buch auf deinem Shreibtisch und lass es dort stehen. Jetzt wo ich Assembler endlich kompilieren kann... Im Kopf schweben mir schopn Tutorials dafür vor, denn alles was ich gefunden habe war zu schwiereig oder auf Englisch. Wird wohl nicht so der Renner werden wie mien nonVCL Tutorials aber was soll's. |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
beim int 21h Funktion 09h wird eine Zeichenkette durch $ beendet nicht durch #00. |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Und das geschieht automatisch?
Das will noch nicht so recht:
Code:
mov dummy, ax
data segment
dummy DW ? data ends code segment Start: mov ax, 5 add ax, 2 mov dummy, ax mov dx, offset dummy mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start **Error** build.bat(12) Can't address with currently ASSUMEd segment registers |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Christian hat Recht, der PChar muß per $ abgeschlossen sein, wie blöde.
Du deklarierst: Zitat:
Zitat:
Gruß Hagen |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Das muß auch anders gehen. Ich habe es jetzt so probiert:
Code:
Bekomme aber:
data segment
dummy DW 512 dup ($) data ends code segment Start: mov ax, 5 add ax, 2 lea si, ax lea di, dx Schleife: lodsb stosb loop Schleife cmp dh, 0 je Ausgabe Ausgabe: mov dummy, ax mov dx, offset dummy mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start lea si, ax **Error** build.bat(13) Illegal immediate lea di, dx **Error** build.bat(14) Illegal immediate loop Schleife **Error** build.bat(18) Near jump or call to different CS je Ausgabe **Error** build.bat(20) Near jump or call to different CS mov dummy, ax **Error** build.bat(22) Can't address with currently ASSUMEd segment registers |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Zitat:
Gruß Hagen |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Das habe ich mir aus Code gebastelt, welcher eine Zeichenkette byteweise kopieren soll.
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
Du hast vor Loop nirgends ECX initialisiert, und somit hat die Schleife eine unbestimmte Anzahl von Durchläufen.
Code:
kannst Du durch
lodsb
stosb
Code:
bzw. die ganze Schleife durch
movsb
Zitat:
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Und wie sähe dass dann aus?
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
cih würde mal sagen so:
Code:
data segment
dummy DW 512 dup ($) data ends code segment Start: mov ax, 5 add ax, 2 lea si, ax lea di, dx mov ecx,strlen ; strlen = Länge die kopiert werden soll rep movsb mov dummy, ax mov dx, offset dummy mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Leider auch nicht:
Code:
Verdammt, das kann doch nicht so schwer sein den Inhalt eines Registers auf dem Monitor auszugeben. In meinem Assemblerbuch stehen wunbderbare Beispile zu allen Grzundrechenarten usw. drin, nur leider unvollständige Code Schnipppsel - die haben sich immer um die Ausgabe gedrückt. :cry:
lea si, ax
**Error** build.bat(14) Illegal immediate lea di, dx **Error** build.bat(15) Illegal immediate mov ex, 10 ; strlen = Lõnge die kopiert werden soll **Error** build.bat(16) Undefined symbol: ex mov ex, 10 ; strlen = Lõnge die kopiert werden soll *Warning* build.bat(16) Argument needs type override mov dummy, ax **Error** build.bat(18) Can't address with currently ASSUMEd segment registers Hier ![]() |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
sorry, ich dachte es ging Dir nur um die Schleife: Du kannst auch mal versuchen, ob's ohne die e's vor den Registerbezeichnungen geht, mit sind's halt die ganzen 32 Bit
Code:
data segment
dummy DW 512 dup ($) data ends code segment Start: mov eax, 5 add eax, 2 lea esi,[eax] lea edi,[edx] mov ecx,10 ; strlen = Länge die kopiert werden soll rep movsb mov dx, offset dummy mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Wie viele Enttäuschungen haltet ihr noch aus? :roll:
Code:
lea si,ax
data segment
dummy DW 512 dup ($) data ends code segment Start: mov ax, 5 add ax, 2 lea si,[ax] lea di,[dx] mov cx,10 ; strlen = Länge die kopiert werden soll rep movsb mov dx, offset dummy mov ah, 9h int 21h mov ax, 4C00h int 21h code ends end Start **Error** build.bat(14) Illegal immediate lea di,dx **Error** build.bat(15) Illegal immediate :evil: |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
Zitat:
Oder soll das Register (in Deinem Falle wohl ax) einen darstellbaren Inhalt haben? |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Nun ja, ich rechne ja 5+2 und es wäre schön wenn da dann 7 stünde.
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
Code:
lea si,ax
Code:
lea si,[color=red][[/color]ax[color=red]][/color]
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Was willst du mir damit sagen? Die Klammern stehen doch da. Ohne geht es übrigens auch nicht.
|
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
laut der Kopie Deiner Fehlermeldung stehen die Klammern nicht da. Hat der Compiler die bei der Fehlermeldung weggelassen? Nach der Addition steht eine binäre 7 in AX. Die muss also erst einmal in eine darstellbare Zahl (37h) umgewandelt werden. Das mit dem lea hab' ich mit Delphi getestet. Nehme ich ESI und EAX gehts. Meinen TASM hab' ich noch nicht wieder rausgesucht ;-) |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Ja, die Fehlermeldung kam von meinem Versuch ohne Klammern, mit lautet sie aber genauso.
Könntest du mal rauskramen? *ganzliebkuck* Ich fang dich auch auf, falls du wieder umkippen solltest. :angle2: |
Re: Wert einer Variablen in ASM ausgeben, String zusammenset
Moin Luckie,
so ich hab' mal TASM rausgesucht, und herausgekommen ist dabei
Code:
Zum Glück hab' ich auch die Handbücher direkt hier liegen ;-)
.MODEL SMALL
.STACK 100h .DATA buffer DB 512 DUP('$') .CODE .386 mov ax,@data ; Datensegmentregister mov ds,ax ; laden mov al,5 add al,2 or al,30h ; ASCII Ziffer daraus machen mov dx, offset buffer mov si,dx mov [si],al ; in Ausgabebuffer speichern mov ah, 9h int 21h mov ax, 4C00h int 21h END Wie ich leider feststellen musste: Hab' ich irgendwie reichlich lange nicht mehr gemacht :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz