Autor Thema: GAS: ASCII-Strings (für INT10/13h) in ASM-Programm einbinden  (Gelesen 6652 mal)

HustensaftOS

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
hi,
also ich habe:
  • ASCII-Strings (1. Byte: 1. Zeichen, 2. Byte: Attribute des 1. Zeichens, 3. Byte: 2. Zeichen, 4. Byte: Attribute des 2. Zeichens, ...) in Hex-Schreibweise.
  • Ein GAS-Programm zur Ausgabe eines Strings mithilfe der Real-Funktion INT 10h/13h
Ich will:
  • ...ASCII-String-Daten ohne großen Aufwand (eigenes Linkerscript, ...) in das GAS-Programm einbinden oder hineinkopieren.
  • ...zur Laufzeit mit SP und BP auf die Daten zeigen können (benötigt für INT10/13h).

Wie hinterlege ich solche Daten am Besten?

thx&lg hustensaft.
Es folgt ein Wuschelkopf :mrgreen:

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 23. December 2011, 20:05 »
Wenn du auf den Grafikspeicher Direktzugriff hast, kannst du das mit dem INT10 sausen lassen und deine Strings direkt in den Grafikspeicher kopieren.

HustensaftOS

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. December 2011, 20:11 »
Wenn du auf den Grafikspeicher Direktzugriff hast, kannst du[...] direkt in den Grafikspeicher kopieren.
So oder so müsste ich die ASCII-Strings hinterlegen und das ist mir in Moment mal das Wichtigste. Eins nach dem Anderen ;-)


Danke für deinen Vorschlag.
lg hustensaft.
Es folgt ein Wuschelkopf :mrgreen:

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. December 2011, 21:24 »
Hallo,


ich bin mir jetzt nicht ganz sicher was Du meinst aber wenn Du Deine Strings als Binär-Daten in Dateien vorrätig hast dann kannst Du diese eventuell mit 'BIN2H' in eine Header-Datei umwandeln lassen um das ganze beim make-Prozess zu automatisieren. So eine Header-Datei enthält dann immer ein char-Array mit der Art : const char NAME[] = { 0x41 , 0x42 , 0x43 , 0x00 }; Dazu kommt dann noch ein Define das Dir die Größe des Array verrät.

Wenn ich Deine Frage auch nicht richtig verstanden haben sollte wäre es gut wenn Du diese etwas präzisieren könntest.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. December 2011, 21:37 »
Bei NASM gibt es da dieses Direktiv incbin (http://www.nasm.us/xdoc/2.09.10/html/nasmdoc3.html#section-3.2.3). Wie das unter gas aussieht weiß ich nicht.

HustensaftOS

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 24. December 2011, 12:10 »

hi,
ich habe mal alles einfach mit der .byte-Direktive in ein freies Fleckchen im Bootsektor geschrieben, ist zwar für größere Daten nicht sonderlich geeignet...


Es funktioniert aber eh nicht, ich sitzt schon seit 6 Stunden an diesem dämlichen Stück Code und spiele mich herum... Ich kann nicht einmal genau sagen, was nicht funktioniert, da hier der Bochs-Debugger auch nicht weiterhilft. Es wird einfach kein Text am Bildschirm angezeigt und der BIOS-Code, der Dank INT 0x10 ausgeführt wird, läuft einfach ganz normal ab.


int_vid_str= 0x13
int_vid= 0x10


movb $0x07, %AH
movb $0xD0, %AL
movw %AX, %ES
movb $int_vid_str, %AH
movb $0x03, %AL
movb $0xA0, %DH
movb $0x00, %DL
movb $0x05, %CL
int $int_vid

end:
jmp end


.org 0x0100
strings:
.byte 0x51
.byte 0x05
.byte 0x49
.byte 0xE0
.byte 0x51
.byte 0x05
.byte 0x49
.byte 0xE0
.byte 0x51
.byte 0x05

.org 0x0200-0x02
.byte 0xAA
.byte 0x55


.end


Hat noch jemand eine Idee, woran das liegen könnte?
lg hustensaft.
Es folgt ein Wuschelkopf :mrgreen:

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 24. December 2011, 12:24 »
Strings kann man so ganz nebenbei folgendermaßen hinterlegen:
.string "Ich bin ein String"
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

HustensaftOS

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. December 2011, 12:36 »

hi,
[...]präzisieren[...]
ich weiß zwar nicht genau, was missverständlich formuliert ist, aber:
Ich schreibe ein Assemblerprogramm für den Bootsektor, das mithilfe eines BIOS-Interrupts (INT10/13h) einen einfachen ASCII-String ausgibt.
Der ASCII-String sollte an Adresse ES:BP liegen.
Der ASCII-String enthält nicht nur die ASSCI-Codes für die Zeichen, die ich ausgeben möchte, sondern auch die dazugehörigen Farbattribute - also ein String, wie er im Ausgabemodus 3 oder im Ausgabemodus 2 erwartet wird.
Ich habe den ASCII-String, den ich ausgeben möchte, in Moment als Textdatei gespeichert. Diese Textdatei enthält Buchstaben und Zahlen (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) stellvertretend für die Bitfolgen 0000, 0001, 0010 ..., 1111 - also eine ganz normale .hex-Datei.
Ich möchte diesen String ohne größen Aufwand in mein Assemblerprogramm kopieren oder einbinden, sodass ich auf ihn als ES:BP referenzieren kann, wie dies für INT10/13h erforderlich ist.


Allerdings funktioniert die Ausgabe nicht einmal, wenn ich den String mit .byte-Direktiven Byte für Byte in ein freies Fleckchen der Assemblerdatei hineinschreibe. Das habe ich aber schon genauer in einem anderen Beitrag dieses Threads gepostet.


Hat jemand eine Idee, wie ich das Problem mit der Stringausgabe löse könnte?
lg hustensaft.
Es folgt ein Wuschelkopf :mrgreen:

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 24. December 2011, 14:04 »
Du hast vergessen BP zu laden. Außerdem sind die Werte in DL und DH nicht richtig. Keine Ahnung was du da reinschreiben wolltest. Das hier funktioniert:

.code16

_start:
mov $0, %ax     # 0 ist korrekt, weil dieses Programm nach 0x7c00 gelinkt ist.
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $_start, %sp

mov $0x1303, %ax
mov $message, %bp
mov $0, %bx
mov $12, %cx
mov $34, %dl
mov $12, %dh

int $0x10

jmp .

message:
.byte 'H', 0x01
.byte 'e', 0x02
.byte 'l', 0x03
.byte 'l', 0x04
.byte 'o', 0x05
.byte ' ', 0x06
.byte 'W', 0x07
.byte 'o', 0x08
.byte 'r', 0x09
.byte 'l', 0x0a
.byte 'd', 0x0b
.byte '!', 0x0c

.org 510
.byte 0x55, 0xaa
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen