Delphi-PRAXiS

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

Luckie 10. Okt 2003 14:46

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Das habe ich mir aus Code gebastelt, welcher eine Zeichenkette byteweise kopieren soll.

Christian Seehase 10. Okt 2003 15:36

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:
lodsb
stosb
kannst Du durch

Code:
movsb
bzw. die ganze Schleife durch

Zitat:

rep movsb
austauschen.

Luckie 10. Okt 2003 19:10

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Und wie sähe dass dann aus?

Christian Seehase 10. Okt 2003 20:44

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

Luckie 10. Okt 2003 21:59

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Leider auch nicht:
Code:
  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
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:

Hier http://www.c-plusplus.de/forum/viewt...=370126#370126 habe ich von jemanden Code bekommen, ich muß nur noch rausfinden, wie ich den einzubinden habe.

Christian Seehase 10. Okt 2003 23:06

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

Luckie 10. Okt 2003 23:23

Re: Wert einer Variablen in ASM ausgeben, String zusammenset
 
Wie viele Enttäuschungen haltet ihr noch aus? :roll:
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  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
lea si,ax
**Error** build.bat(14) Illegal immediate
lea di,dx
**Error** build.bat(15) Illegal immediate

:evil:

Christian Seehase 10. Okt 2003 23:24

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

Zitat:

Zitat von Luckie
Verdammt, das kann doch nicht so schwer sein den Inhalt eines Registers auf dem Monitor auszugeben.

In welcher Form willst Du es denn darstellen? Binär, Hex, Dezimal? Byte, Word, Dword?
Oder soll das Register (in Deinem Falle wohl ax) einen darstellbaren Inhalt haben?

Luckie 10. Okt 2003 23:25

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.

Christian Seehase 10. Okt 2003 23:26

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]

Luckie 10. Okt 2003 23:28

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.

Christian Seehase 10. Okt 2003 23:35

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 ;-)

Luckie 10. Okt 2003 23:46

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:

Christian Seehase 11. Okt 2003 17:43

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

so ich hab' mal TASM rausgesucht, und herausgekommen ist dabei

Code:
         .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
Zum Glück hab' ich auch die Handbücher direkt hier liegen ;-)
Wie ich leider feststellen musste: Hab' ich irgendwie reichlich lange nicht mehr gemacht :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 Uhr.

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