Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1066[/thread]

ASSEMBLER: Ausgabe ohne Variable: Das wird doch wohl irgendwie gehen ...



<< >> 10 Einträge, 1 Seite
J-jayz-Z
 2006-10-27 12:38
#10775 #10775
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

ich hab mir eine kleine Funktion geschrieben, welche mir einfach den übergebenen Text ausgibt und ein newline anhängt:
macro.bib
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
PRINT_N    MACRO TEXT
   PUSH AX
   PUSH DX
   MOV DX, OFFSET TEXT
   MOV AH, 9H
   INT 21H
   MOV AH, 02h
   MOV DL, 10
   INT 21H
   POP DX
   POP AX
   ENDM

und ein kleines "Hello World"
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
TITLE Hallo
INCLUDE macro.bib
IDEAL
MODEL SMALL
STACK 100              
DATASEG              
   TEXT db 'Hi perl-community$'        
CODESEG              
start:
   STARTUPCODE
     PRINT_N TEXT
   EXITCODE
END start

Jetzt will ich aber etwas ausgeben können, ohne das irgendwie in eine Variable schreiben zu müssen. Irgendwas ala
Code: (dl )
PRINT_N db 'Hello ...$'

funktioniert das irgendwie ? Ich kann mit MOV (siehe meine Funktion) ja auch CR ( 10 ) in DL schieben und es dann ausgeben ...
Ist TASM.

Danke schonmal im Vorraus


EDIT: Kommentare entfent, werden vom Parser vermurkst

//Modedit GwenDragon: Angabe der Sprache im Titel hinzugefügt\n\n

<!--EDIT|GwenDragon|1161953690-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
murphy
 2006-10-27 14:33
#10776 #10776
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ein String ist auf dem Level der Maschinensprache immer eine Sequenz von Bytes im Speicher -- Du kannst keinen String wie ein einzelnes Zeichen in ein Register laden, sondern nur seine Speicheradresse, also brauchst Du auch irgendeinen Speicherbereich, in dem Du den String ablegst.
When C++ is your hammer, every problem looks like your thumb.
GwenDragon
 2006-10-27 16:57
#10777 #10777
User since
2005-01-17
14598 Artikel
Admin1
[Homepage]
user image
Du kannst schon ein paar Bytes in Register stecken. Es gibt ja auch Register die größer als 16 Bytes bis zu 64 oder größer sind.

Allerdings musst du dann schon selbst irgendwie eine Schnittstelle zum Schreiben in den Textspeicher und Anzeigen herstellen.
Die DOS-Schnittstelle mit Int21 bietet sowas nicht.
J-jayz-Z
 2006-10-28 14:17
#10778 #10778
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=GwenDragon,27.10.2006, 14:57]Die DOS-Schnittstelle mit Int21 bietet sowas nicht.[/quote]
Von der muss ich eh grad weg. Ich werde da mit INT 10 arbeiten müssen, ich hab später kein DOS mehr zur Verfügung, da bringt es mir auch nicht viel, wenn ich mit der DOS Schnittstelle arbeite ;)
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2006-10-30 12:00
#10779 #10779
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmm, ich wollte gerade die Ausgabe von DOS auf BIOS umstellen und habe es irgendwie nur hinbekommen, das ich 1 Zeichen ausgeben kann.
Code: (dl )
1
2
3
    MOV AH, 0EH
MOV AL, 10
INT 10H

So ging es mit einem Zeichen. Aber wie bekomme ich mehrere Zeichen hin ?
Wenn ich
Code: (dl )
1
2
3
    MOV AH, 0EH
MOV AL, [TEXT]
INT 10H

schreibe bekomm ich auch nur das erste Zeichen.

Und noch etwas, wie kann ich die Zeichen einer Variablen zählen ? Das war irgendwas mit $ aber ich finde es nicht mehr ...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
nepos
 2006-10-30 13:41
#10780 #10780
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, ich bin da nicht mehr fit, aber folgendes:
AX ist ein 16-Bit Register. In AH, also die hoeherwertigen 8-Bit packst quasi die Funktion, die Int 10 ausfuehren soll. Damit hast du in AL auch nur noch 8-Bit Platz, was genau fuer ein Zeichen reicht. Wie aus der Dokumentation hervorgeht, muss das auszugebende Zeichen eben in AL stehen.

Fuer einen String musst du nach der Tabelle 0x13 nutzen, das dann sicher irgendwo eben den Zeiger auf den null-terminierten String, den du ausgeben willst, erwartet: dabei muss in AH eben 0x13 stehen. In AL hast du eine Bitmaske fuer den Write-Mode, in CX muss die Laenge des Strings stehen, ES:BP enthaelt die Speicheradresse des Strings, DH und DL enthalten Zeile und Spalte fuer die Ausgabe. Nachzulesen wieder hier: http://www.ctyme.com/intr/rb-0210.htm
J-jayz-Z
 2006-10-30 14:47
#10781 #10781
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es geht auch nur mit 0EH. Muss man halt mit einer Schleife arbeiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
TITLE Hallo
INCLUDE macro.bib
IDEAL
MODEL SMALL
STACK 100
DATASEG &nbsp
;
TEXT db 'Ende ...$'
foo db 'Testausgabe',10,13,0
CODESEG &nbsp
;
start:
STARTUPCODE
LEA BX, [foo]
OUTPUT: CMP [BYTE BX], 0
JE ENDE
MOV AH, 0EH
MOV AL, [BX]
INT 10h
INC BX
JMP OUTPUT
ENDE: PRINT_N TEXT
EXITCODE
END start

Aber danke für die links, sind gute Nachschlagewerke !
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2006-10-30 14:56
#10782 #10782
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=J-jayz-Z,30.10.2006, 13:47]Es geht auch nur mit 0EH. Muss man halt mit einer Schleife arbeiten:[/quote]
fragt sich nur was schneller ist.
ich denke, bei der methode von nepos werden direkt alle bytes in den ausgabepuffer geschrieben!\n\n

<!--EDIT|esskar|1162212991-->
nepos
 2006-10-30 15:01
#10783 #10783
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ob da Puffer im Spiel sind oder nicht, keine Ahnung. Assembler hab ich seit 10 Jahren oder so nix mehr gemacht ;)

@J-jayz-Z: Klar, kann man mit ner Schleife arbeiten, nur wozu? Wenn ich nen String ausgeben will, dann nutz ich die 0x13 in AH und gut is. Welchen Sinn hat es, diese Funktion quasi selber in ner Schleife nachzubauen? Und in der Schleife musst du ja auch nur wieder irgendeinen Speicherbereich abklappern, in dem deine Zeichen stehen. Vermutlich im groben nix anderes, als bei 0x13 eh gemacht wird.
J-jayz-Z
 2006-10-30 15:37
#10784 #10784
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habe es jetzt zusätzlich noch mit 13H gemacht, bekomme aber keine Ausgabe. Oder nur komische Zeichen, wenn ich DL,DH und BH nicht gesetzt hab ...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
TITLE Hallo
INCLUDE macro.bib
IDEAL
MODEL SMALL
STACK 100
DATASEG &nbsp
;
TEXT db 'Ende ...$'
foo db 'Testausgabe',10,13,0
CODESEG &nbsp
;
start:
STARTUPCODE
MOV BP, OFFSET foo
MOV CX, 14
MOV DL, 1
MOV DH, 1
MOV BH, 1
MOV AL, 3
MOV AH, 13H
INT 10H
LEA BX, [foo]
OUTPUT: CMP [BYTE BX], 0
JE ENDE
MOV AH, 0EH
MOV AL, [BX]
INT 10h
INC BX
JMP OUTPUT
ENDE: PRINT_N TEXT
EXITCODE
END start
jemand ne Idee, was ich falsch mache ?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< >> 10 Einträge, 1 Seite



View all threads created 2006-10-27 12:38.