PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [asm] Status Byte (Drucker)



Prick
26-10-2003, 23:43
Hallo,

hoffe eine kleine Anfänger Assembler-Frage ist hier gestattet. Beschäftige mich seit kurzer Zeit mit der Programmiersprache Assembler und Linux (ix86) und stehe nun vor einem kleinem Problem.
Würde ganz gerne, um mehr über den Umgang mit Assembler zu lernen, einmal das Status-Byte des Druckers abfragen, leider bereitet mir das einige Schwierigkeiten, vielleicht könnt ihr mir da weiterhelfen?



section .text
global _start

msg db "Druckertest ...",0x0A ;0x0A->zeilenumbruch
msg2 db "Drucker bereit",0x0A
len equ $-msg
len2 equ $-msg2

_start:
mov eax,4 ; Ausgabe von msg
mov ebx,1
mov ecx,msg
mov edx,len
int 0x80
jmp Drucker_test


Drucker_test:
mov ah,02
xor dx,dx
int 17h
test ah,10000000b
je Bereit

Bereit:
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, len2
int 0x80
jmp Endeprg

Endeprg:
mov eax,1 ;syscall 1 = exit
int 0x80 ;exit


ist natürlich sehr simpel und sieht sicher auch sehr mies aus, für jemand der sich da etwas besser auskennt, bin wie gesagt noch in der Lernphase. :-)
Beim Ausführen von int 17h "segfaultet" mir das Programm, bin daher um jede Antwort/Verbesserung dankbar, diesen Fehler zum vermeiden.

Danke im Voraus,
h.d.

comrad
27-10-2003, 05:53
hi

ich bin in asm nicht so bewandert,
aber warum interruptest du am ende mit


int 0x80

und an der abstürzenden codestelle mit


int 17h

wäre da nicht ein


int 0x17

angebracht?

comrad

Pingu
27-10-2003, 13:04
Hi,

ich bin zwar schon seit Jahren aus dem Assembler raus. Deswegen kenne ich mich jetzt auch nicht mit den Interrupts aus. Ich weiß nur bei DOS war es immer int 21h ;)

Woebi ich comrad Recht geben muß.

Mir ist aber etwas anderes aufgefallen:

Original geschrieben von Prick

msg db "Druckertest ...",0x0A ;0x0A->zeilenumbruch
msg2 db "Drucker bereit",0x0A
len equ $-msg
len2 equ $-msg2

Muß das nicht heissen:
msg db "Druckertest ...",0x0A ;0x0A->zeilenumbruch
len equ $-msg
msg2 db "Drucker bereit",0x0A
len2 equ $-msg2

Denn bei Deiner Version die Längenberechnung eigentlich nicht stimmen?

Gruß

Pingu

Prick
27-10-2003, 15:19
Danke für die schnellen Antworten, leider konnte mir das nicht helfen.

comrad, wie ich den Interrupt starte sollte eigentlich egal sein, habe beide Versionen versucht, leider selbes Problem.
Pingu, 21h/ah=5 ist für die Ausgabe eines Zeichens auf dem Drucker zuständig, insofern liegst Du da richtig. :-)
In welcher Reihenfolge ich die Variablen deklariere sollte eigentlich keinen Unterschied machen, das Label msg bzw. msg2 bleibt ja bestehen. Mit der Ausgabe der Nachricht gibt es auch keine Problem, wie gesagt nur, wenn das Programm int 17h erreicht, segfaultet es.

Danke nochmals, sollte jemand weitere Vorschläge haben, nehme ich diese natürlich gerne entgegen.

h.d.

lost
27-10-2003, 16:04
Hallo,

ich würde jetzt einfach mal behaupten das du mit int 17h auf eine Funktion im BIOS zu zugreifen versuchst. Das heisst du versuchst vom protected Mode (oder wie das auf Intel Kisten heisst) aus auf eine real Mode Funktion des BIOS anzusprechen. Meines Wissens geht das nicht.

Bernd

Prick
27-10-2003, 16:52
Und warum dann der Segmentation fault?
Im Buch "Programmiersprache Assembler - Ein Strukturierte Einführung" wird es so beschrieben und auf folgender Seite scheint man sich auf eine ähnliche Aussage zu stützen:
http://www.uni-ulm.de/schulen/gym/sgu/computer/assembler/asmfunc.htm#start
Verstehe ich nicht ganz. Welche Möglichkeit bietet sich denn dann, das Status-Byte abzufragen?

Danke,
h.d.