Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wert einer Variablen in ASM ausgeben, String zusammensetzen (https://www.delphipraxis.net/10034-wert-einer-variablen-asm-ausgeben-string-zusammensetzen.html)

Luckie 10. Okt 2003 06:27


Wert einer Variablen in ASM ausgeben, String zusammensetzen
 
Wie man eine konstante Zeichenfolge in ASM ausgiebt weiß, habe ich hier http://www.delphipraxis.net/internal...ct.php?t=11276 gelernt. Nun wollte ich das Ergebnis einer Addition ausgeben, dochleider schweigt sich darüber mein ASM Buch aus. Meine Versuche sind bisher gescheitert:
Code:
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
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.

Des weiteren wollte ich wissen, wie man Zeichenketten verbindet, um vor und / oder nach dem Ergebnis noch Text auszugeben.

negaH 10. Okt 2003 11:08

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

negaH 10. Okt 2003 11:16

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
So, bin gestiefelt, und habe meine alten Bücher entstaubt.

Zitat:

Display String Int21/09h

AH = 09h
DS:DX = PChar
INT21

Terminate Process Int21/04Ch

AH = 4Ch
AL = Returncode
INT21
D.h.

Zitat:


Message DB "Test",0

MOV AH,09h
LDS DX,Message
INT 21h

Gruß Hagen

Christian Seehase 10. Okt 2003 12:57

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]

Luckie 10. Okt 2003 13:00

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.

Christian Seehase 10. Okt 2003 13:03

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Moin Luckie,

beim int 21h Funktion 09h wird eine Zeichenkette durch $ beendet nicht durch #00.

Luckie 10. Okt 2003 13:24

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Und das geschieht automatisch?

Das will noch nicht so recht:
Code:
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
mov dummy, ax
**Error** build.bat(12) Can't address with currently ASSUMEd segment registers

negaH 10. Okt 2003 13:40

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Christian hat Recht, der PChar muß per $ abgeschlossen sein, wie blöde.

Du deklarierst:
Zitat:


SEG DATA
TempSpace '$' dup(512)
ENDSEG


StrLCat(TempSpace, Source, 511)
StrLCat(TempSpace, '$', 512)

LDS DX,TempSpace
MOV AH,9h
INT 21h


StrCat(), StrLCat() siehe SysUtils.pas

Zitat:

Aber acht Minuten?
Für dich tue ich doch alles :)


Gruß Hagen

Luckie 10. Okt 2003 14:15

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Das muß auch anders gehen. Ich habe es jetzt so probiert:
Code:
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
Bekomme aber:
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

negaH 10. Okt 2003 14:43

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Zitat:

mov ax, 5
add ax, 2

lea si, ax
lea di, dx
Was soll das bewirken ? Du versuchst in SI die Adresse CS:$7 zu laden ?

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz