PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : x86 Assembler: An Bit-Werte rankommen


mf_2
2004-04-12, 14:43:49
Hallo,

Ich habe in einem Assembler-Programm den Interrupt 11h ausgelöst, um die Sysconfig eines mir unbekannten Systems zu erhalten.
Nun möchte ich z.B. an das zweite Bit ( Copro: ja/nein? ) rankommen und eine entsprechende JMP-Anweisung ausführen ( z.b je oder jne ) wenn ein Copro installiert ist ( wenn das zweite Bit gesetzt ist ). Wie kann ich aber das nun anstellen, zu sehen welchen Wert Bit 2 ( oder auch ein beliebiges anderes Bit ) in einem Register ( in dem Fall ax ) hat?

Thx in advantage.

HajottV
2004-04-12, 15:02:37
Original geschrieben von mf_2
Wie kann ich aber das nun anstellen, zu sehen welchen Wert Bit 2 ( oder auch ein beliebiges anderes Bit ) in einem Register ( in dem Fall ax ) hat?


test al,00000010b <- bitmaske
jnz bitgesetzt

Gruß

Jörg

mf_2
2004-04-12, 15:45:19
Thx!

mf_2
2004-04-13, 21:29:46
Neues Prob:

Ich wollte die anzahl der diskettenlaufwerke auslesen, aber das klappt nicht ( der pc zeigt mir nichts an ), hier mal der quelltext:

;------------------Start---------------

Get_CPU_ID_:
int 011h
test al,00000010b
jnz coproinstalled
test al,00000010b
jz coproninstalled
int 011h
test al,00110000b
jnz dreilws
test al,00110000b
jz nolws
test al,00010000b
jnz einlw
test al,00100000b
jnz zweilws
jmp weiter

nolws:
mov si, lws0
call schreiben
ret

einlw:
mov si, lws1
call schreiben
ret

zweilws:
mov si, lws2
call schreiben
ret

dreilws:
mov si, lws3
call schreiben
ret

weiter:
jmp reset

reset:
db 0Eah
dw 0000h
dw 0FFFFh

;--------------------Ende---------------
Ist die Abfrage so überhaupt korrekt?
Ich habe ja alle 4 Möglichkeiten abgefragt, also müsste ich zumindest irgendeine Meldung bekommen.

BTW:schreiben ist eine funtkion, die einen string aus si auf dem bildschrim ausgibt.

mf_2
2004-04-15, 09:24:13
weiss denn keiner ne lösung?

zeckensack
2004-04-15, 11:41:56
Das Problem sind die konditionalen Sprünge. JMP (und auch JNZ etc) kehren nicht zurück, so wie CALL das tun würde.

Der erste Sprung, den das Programm nimmt, führt relativ direkt zu einem ret. Von da kehrt der Programmablauf aber nicht zur alten Position innerhalb Get_CPU_ID_ zurück, sondern zu dem Punkt, von wo aus Get_CPU_ID_ angesprungen wurde.

Das ist zumindest meine Vermutung. Genau kann ich's nicht sagen, weil ich
a)nicht sehen kann, was bei coproinstalled: bzw coproninstalled: passiert und
b)nicht weiss, wie du Get_CPU_ID_ aufrufst

mf_2
2004-04-15, 16:02:21
;die schreiben funktion

schreiben:
lodsb
or al, al
jz short schreiben_d
mov ah, 0x0E
mov bx, 0x0007
int 0x10
jmp schreiben

;ende


; die coprofuntkionen
coproinstalled:
mov si, copro1
call schreiben
ret

coproninstalled:
mov si, copro2
call schreiben
ret
;ende

;nachrichten
copro1 db "Copro installiert!",13,10,0
copro2 db "Copro nicht installiert!",13,10,0
;nachrichten ende

HajottV
2004-04-17, 01:16:58
Mach's doch so:

0E87:0100 CD11 INT 11
0E87:0102 2401 AND AL,01
0E87:0104 7504 JNZ 010A
0E87:0106 B000 MOV AL,00
0E87:0108 EB06 JMP 0110
0E87:010A B106 MOV CL,06
0E87:010C D2E8 SHR AL,CL
0E87:010E FEC0 INC AL
0E87:0110

Am Ende steht in AL die Anzahl der Laufwerke...

mf_2
2004-04-23, 22:01:52
Was ist das für eine Syntax, die du verwendest?
Ich hab das einfcah so gemacht:

int 11h
and al,01
jnz test
mov al,00
jmp test2
test:
mov cl,06
shr al,cl
inc al
test2:
usw.

HajottV
2004-04-24, 01:34:06
Original geschrieben von mf_2
Was ist das für eine Syntax, die du verwendest?


Das ist debug... langt, um den schnellen Hack zwischendurch auszutesten. Auf der Arbeit habe ich keinen Assembler, da darf ich nur in Java (bäh) proggen. =)

Gruß

Jörg