Sök…


BIOS-samtal

Hur man interagerar med BIOS

Det grundläggande in- / utgångssystemet, eller BIOS, är det som styr datorn innan något operativsystem körs. För att få åtkomst till tjänster som tillhandahålls av BIOS använder monteringskod avbrott . Ett avbrott tar formen av

int <interrupt> ; interrupt must be a literal number, not in a register or memory

Avbrottsnumret måste vara mellan 0 och 255 (0x00 - 0xFF) inklusive.

De flesta BIOS-samtal använder AH registret som en "funktionsval" -parameter, och använder AL registret som en dataparameter. Funktionen som väljs av AH beror på det inställda avbrottet. Vissa BIOS-samtal kräver en enda 16-bitars parameter i AX , eller accepterar inte parametrar alls, och kallas helt enkelt av avbrottet. Vissa har ännu fler parametrar som skickas i andra register.

Registren som används för BIOS-samtal är fixerade och kan inte utbytas med andra register.

Använd BIOS-samtal med funktionsval

Den allmänna syntaxen för ett BIOS-avbrott med en funktionsvalparameter är:

mov ah, <function>
mov al, <data>
int <interrupt>

exempel

Så här skriver du ett tecken till skärmen:

mov ah, 0x0E             ; Select 'Write character' function
mov al, <char>           ; Character to write
int 0x10                 ; Video services interrupt

Så här läser du ett tecken från tangentbordet (blockering):

mov ah, 0x00             ; Select 'Blocking read character' function
int 0x16                 ; Keyboard services interrupt
mov <ascii_char>, al     ; AL contains the character read
mov <scan_code>, ah      ; AH contains the BIOS scan code

Hur man läser en eller flera sektorer från en extern enhet (med CHS-adressering):

mov ah, 0x02             ; Select 'Drive read' function
mov bx, <destination>    ; Destination to write to, in ES:BX
mov al, <num_sectors>    ; Number of sectors to read at a time
mov dl, <drive_num>      ; The external drive's ID
mov cl, <start_sector>   ; The sector to start reading from
mov dh, <head>           ; The head to read from
mov ch, <cylinder>       ; The cylinder to read from
int 0x13                 ; Drive services interrupt
jc <error_handler>       ; Jump to error handler on CF set

Hur man läser systemet RTC (Real Time Clock):

mov ah, 0x00             ; Select 'Read RTC' function
int 0x1A                 ; RTC services interrupt
shl ecx, 16              ; Clock ticks are split in the CX:DX pair, so shift ECX left by 16...
or cx, dx                ; and add in the low half of the pair
mov <new_day>, al        ; AL is non-zero if the last call to this function was before midnight
                         ; Now ECX holds the clock ticks (approx. 18.2/sec) since midnight
                         ; and <new_day> is non-zero if we passed midnight since the last read

Så här läser du systemtiden från RTC:

mov ah, 0x02             ; Select 'Read system time' function
int 0x1A                 ; RTC services interrupt
                         ; Now CH contains hour, CL minutes, DH seconds, and DL the DST flag,
                         ; all encoded in BCD (DL is zero if in standard time)
                         ; Now we can decode them into a string (we'll ignore DST for now)

mov al, ch               ; Get hour
shr al, 4                ; Discard one's place for now
add al, 48               ; Add ASCII code of digit 0
mov [CLOCK_STRING+0], al ; Set ten's place of hour
mov al, ch               ; Get hour again
and al, 0x0F             ; Discard ten's place this time
add al, 48               ; Add ASCII code of digit 0 again
mov [CLOCK_STRING+1], al ; Set one's place of hour

mov al, cl               ; Get minute
shr al, 4                ; Discard one's place for now
add al, 48               ; Add ASCII code of digit 0
mov [CLOCK_STRING+3], al ; Set ten's place of minute
mov al, cl               ; Get minute again
and al, 0x0F             ; Discard ten's place this time
add al, 48               ; Add ASCII code of digit 0 again
mov [CLOCK_STRING+4], al ; Set one's place of minute

mov al, dh               ; Get second
shr al, 4                ; Discard one's place for now
add al, 48               ; Add ASCII code of digit 0
mov [CLOCK_STRING+6], al ; Set ten's place of second
mov al, dh               ; Get second again
and al, 0x0F             ; Discard ten's place this time
add al, 48               ; Add ASCII code of digit 0 again
mov [CLOCK_STRING+7], al ; Set one's place of second
...
db CLOCK_STRING "00:00:00", 0   ; Place in some separate (non-code) area

Så här läser du systemdatum från RTC:

mov ah, 0x04             ; Select 'Read system date' function
int 0x1A                 ; RTC services interrupt
                         ; Now CH contains century, CL year, DH month, and DL day, all in BCD
                         ; Decoding to a string is similar to the RTC Time example above

Hur man får storleken på det sammanhängande låga minnet:

int 0x12                 ; Conventional memory interrupt (no function select parameter)
and eax, 0xFFFF          ; AX contains kilobytes of conventional memory; clear high bits of EAX
shl eax, 10              ; Multiply by 1 kilobyte (1024 bytes = 2^10 bytes)
                         ; EAX contains the number of bytes available from address 0000:0000

Så här startar du om datorn:

int 0x19                 ; That's it! One call. Just make sure nothing has overwritten the
                         ; interrupt vector table, since this call does NOT restore them to the
                         ; default values of normal power-up. This means this call will not
                         ; work too well in an environment with an operating system loaded.

Felhantering

Vissa BIOS-samtal implementeras kanske inte på alla maskiner och garanteras inte att de fungerar. Ofta kommer ett oimplementerat avbrott att returnera antingen 0x86 eller 0x80 i register AH . Nästan varje avbrott kommer att sätta bärflaggan (CF) på ett feltillstånd. Detta gör det enkelt att hoppa till en felhanterare med jc villkorat hopp. (Se villkorade hopp )

referenser

En ganska uttömmande lista över BIOS-samtal och andra avbrott är Ralf Browns Interrupt List . En HTML-version kan hittas här .

Avbrott som ofta antas vara tillgängliga finns i en lista på Wikipedia .

En mer djupgående översikt över vanligt tillgängliga avbrott kan hittas på osdev.org



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow