Archiv verlassen und diese Seite im Standarddesign anzeigen : x86 Assembler: An Bit-Werte rankommen
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
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.
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
;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...
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
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.