PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warte Funktion schreiben.


DOSe
07.12.2004, 14:54
Hi,

ich sitze gerade vor einem kleinen Problem und zwar suche ich eine Funktion / Interrupt der mir es ermöglicht z.B. 500 mSek oder 1 sek zu warten

ich hab da zwar schon aus einer kleinen Interrupt liste einen Interrupt gefunden den verstehe ich aber nicht ganz bzw. denke ich der nützt mir nicht viel da er scheinbar in Mikrosekunden arbeitet und das ja noch unter milliesekunden liegt :-D


INT 15h
AH=86h
AL=0
CX=Zeit in Mikrosekunden (Bits 16 - 31)
DX=Zeit in Mikrosekunden (Bits 0 - 15)


kann mir da eventuell jemand ein tipp geben wie ich es am besten anfange?

Thx 4 Help schonmal.


Kuno
07.12.2004, 15:45
also 500ms solltest du damit auch locker hinbekommen.
das wären dann also 500000 Mikrosekunden.

mit den beiden registern zusammen kommst du auf mehr als 4000000000 Mikrosekunden, was 4000 ms entspricht.

also für 500ms
cx = b 0000000000000111
dx = b 1010000100100000

kenne diese Funktion nicht, aber so erklär ich mir das. Hoffe ich liege da nicht falsch.

DOSe
07.12.2004, 15:48
Ha ok also war der schonmal doch richtig :D

fein jetzt würde mich interessieren wie du auf die Zahlen gekommen bist, mit hex rechnen usw. tu ich mich noch etwas schwer, und was kann diese warte routine max an sek anhalten ?!

thx 4 help schonmal

OK mein Code sieht nun so aus, und das prg wartet länger als 500 millisek :-D

warten:
mov ah,86h
mov al,0
mov cx, 0000000000000111
mov dx, 1010000100100000
int 15h
ret

Kuno
07.12.2004, 16:06
gut , wie komme ich auf diese zahlen !?

ganz einfach , wie schon gesagt sind 500ms gleich 500000 Mikrosekunden.
das bedeutet das diese zahl ein DWORD (32bit) einnimmt.
Da die register nur 16 bit breit sind, wird die zahl augeteilt in ein LOWORD (bit 0 - 15 ) und einem HIWORD (bit 16 - 31).

500000 würde binär als DWORD etstmal so ausehen :

00000000000001111010000100100000
Nun siehst du schon woher diese Zahlen kommen.

bit 0-15 = 1010000100100000 = 41248
bit 16-31 = 0000000000000111 = 7

und diese schreibst du dann in die jeweiligen register.

wie lange kann diese anhalten ? nunja maximal 4294967295 Mikrosekunden, sprich ca. 4,3 sekunden (Wenn es auch so funzt wie ich mir das denke). aber in einer schleife kann die sicher tagelang warten.


OK mein Code sieht nun so aus, und das prg wartet länger als 500 millisek :-D
Nun ob das nun 100% richtig war kann ich dir nicht versprechen. Es war nur ein erklärungsversuch meinerseits.
Wartet er ne Stunde ?

Hab aber hier nochwas für dich gefunden .
http://cs.hofstra.edu/~cscccl/csc111/line.asm
dort gibt es 2 Delay funktionen.

Felix Kaiser
07.12.2004, 16:28
Rechnet doch nicht selber, sondern lasst rechnen! Das Ding wird nicht umsonst auch Rechner genannt:
mov ax,500 ; 500ms
mov bx,1000
mul bx
mov cx,dx
mov dx,ax
mov ah,86h
int 15h
Multipliziert mit 1000 und verschiebt alles gleich in die richtigen Register.

Kuno
07.12.2004, 16:32
habs gut gemeint, weil eine Frage lautete :


... fein jetzt würde mich interessieren wie du auf die Zahlen gekommen bist ...

DOSe
08.12.2004, 00:25
Danke Danke, nun hab ich es kapiert :D

habt mir mal wieder schnell und kompetent geholfen thx nochmal :)

bis zur nächsten frage dann *gg :D