Assembly Avanzato
CS = FFFFh, IP = 0000h, SS = 0000h, SP = 0000h, DS = 0000h,
ES = 0000h
-u FFFF:0000 FFFF:0000 EA5BE000F0 JMP F000:E05B FFFF:0005 3035 XOR [DI], DH FFFF:0007 2F DAS FFFF:0008 3239 XOR BH, [BX+DI] FFFF:000A 2F DAS FFFF:000B 3836FFFE CMP [FEFF], DH FFFF:000F EF OUT DX, AX FFFF:0010 1A5735 SBB DL, [BX+35] FFFF:0013 025C07 ADD BL, [SI+07] FFFF:0016 7000 JO 0018 FFFF:0018 C0 DB C0 FFFF:0019 F9 STC FFFF:001A 00F0 ADD AL, DH FFFF:001C 5C POP SP FFFF:001D 07 POP ES FFFF:001E 7000 JO 0020 |
JMP F000:E05B
CS = F000h, CS.BASE = FFFF0000h, EIP = 0000FFF0h SS = 0000h, SS.BASE = 00000000h, ESP = 00000000h DS = 0000h, DS.BASE = 00000000h ES = 0000h, ES.BASE = 00000000h FS = 0000h, FS.BASE = 00000000h GS = 0000h, GS.BASE = 00000000h |
CS.BASE + EIP = FFFF0000h + 0000FFF0h = FFFFFFF0h
i 80
003FFh - 00000h + 1 = 400h byte = 1024 byte
1024 / 4 = 256 = FFh vettori di interruzione
INT 10h - Servizio n. 13h - Write string: visualizza una stringa sullo schermo. Argomenti richiesti: AH = 13h (servizio Write string) ES:BP = indirizzo logico Seg:Offset della stringa CX = lunghezza della stringa DH = riga di output DL = colonna di output BH = pagina video BL = attributi video AL = modalità di scrittura 0 = solo caratteri 1 = solo caratteri + aggiornamento posizione cursore 2 = caratteri + attributi 3 = caratteri + attributi + aggiornamento posizione cursore |
MyString db "Stringa da visualizzare con il servizio BIOS n. 13h della INT 10h" strLen equ $ - MyString |
push ds ; copia DS pop es ; in ES mov bp, MyString ; ES:BP punta a MyString mov cx, strLen ; CX = lunghezza stringa mov dh, 6 ; riga 6 mov dl, 8 ; colonna 8 mov bl, 00011110b ; giallo su blu mov bh, 0 ; pagina video zero mov al, 00h ; solo caratteri mov ah, 13h ; servizio n. 13h int 10h ; chiama la ISR |
MyString db 'T', 1Eh, 'e', 1Fh, 's', 04h, 't', 01h
strLen equ ($ - MyString) / 2
mov ax, [es:OffsetBDA]
Bit | Significato |
---|---|
0 | Riservato |
1 | Coprocessore matematico presente |
2 | Mouse PS/2 presente |
3 | Riservato |
4 | Modalità video iniziale: (00b = EGA/VGA, 01b = 40x25 CGA, 10b = 80x25 CGA, 11b = Monocromatico) |
5 | |
6 | Numero floppy disk drives: (00b = 1, 01b = 2, 10b = 3, 11b = 4) |
7 | |
8 | Riservato |
9 | Numero porte seriali: (001b = 1, 010b = 2, 011b = 3, 100b = 4, etc) |
10 | |
11 | |
12 | Porta giochi installata |
13 | Riservato |
14 | Numero porte parallele: (01b = 1, 10b = 2, etc) |
15 |
mov ax, [es:O010h]
Nota importante. Chi utilizza DOSEmu deve ricordarsi di attivare e configurare le varie periferiche attraverso l'apposito file $HOME/.dosemurc; tale file contiene anche le istruzioni sulla sintassi da utilizzare. Ad esempio: $_cpu = "80586" $_mathco = (on) $_mouse_internal = (on) $_mouse = "imps2" $_mouse_dev = "/dev/psaux" $_joy_device = "/dev/js0" $_com3 = "/dev/ttyS2 irq 4" $_com4 = "/dev/ttyS3 irq 3" e così via. |
Nota importante. Impostando l'hardware in modo non corretto, si può provocare il malfunzionamento del computer; nei casi meno gravi, la situazione può essere risolta riavviando il PC e selezionando le impostazioni di fabbrica nel menu di configurazione del BIOS. Bisogna ribadire quindi che solamente gli utenti esperti possono accedere a tale menu; se, a causa di impostazioni errate, si riscontrano problemi persistenti sul proprio computer, si può rendere necessario il ricorso ad un centro di assistenza tecnica! |
Nota importante. È fondamentale tenere presente che il BIOS utilizza appositi codici per identificare i vari floppy disk drive e gli hard disk; in particolare: i floppy disk drive sono indicati, nell'ordine, dai codici 00h, 01h, 02h, etc; gli hard disk sono indicati, nell'ordine, dai codici 80h, 81h, 82h, etc. Il codice del dispositivo da cui è avvenuto il boot viene caricato dal BIOS nel registro DL; tale codice è quindi a disposizione del bootloader! |
Nota importante. L'unico aspetto da gestire con molta cautela, riguarda il metodo da seguire per installare un bootloader "personale" nel MBR di un disco; si tratta chiaramente di una operazione molto delicata in quanto il MBR viene anche utilizzato dai SO per contenere informazioni relative al tipo di file system presente sul disco! Tutto ciò significa che dopo l'inserimento del nostro bootloader nel MBR di un disco, il disco stesso risulta illeggibile da parte del SO; proprio per questo motivo, si raccomanda vivamente di effettuare questo tipo di esperimenti, servendosi di un floppy disk e NON dell'hard disk del proprio computer! |
format a: /s
fdisk /mbr
format a: /s
1: C:\WINDOWS
map
\Device\Harddisk0\Partition1
fixmbr \Device\HardDisk0
exit
RegStr db "XXXXh" HexStr db "0123456789ABCDEF" |
and bx, 000Fh
byte [HexStr + bx] = byte [HexStr + 9] = '9'
and bx, 000Fh
byte [HexStr + bx] = byte [HexStr + Eh] =
byte [HexStr + 14] = 'E'
Hex16toStr: mov si, 3 ; offset 3 in RegStr mov cx, 4 ; 4 loop (4 cifre esadecimali) hex_loop: mov bx, ax ; bx = prossimo nibble and bx, 000Fh ; isola i 4 bit meno significativi mov dl, [HexStr + bx] ; converte in ASCII mov [RegStr + si], dl ; salva in RegStr dec si ; prossimo carattere di RegStr shr ax, 4 ; prossimo nibble da esaminare loop hex_loop ; controllo loop retn ; near return |
0000h * 10h + 7C00h = 00000h + 7C00h = 07C00h
org 7C00h
org 0000h
000Eh E8h 0000h call near get_ip 0011h get_ip: 0011h 58h pop ax 0012h 2Dh 0011h sub ax, (($ - $$) - 1) |
CS:IP = 0000h:(0011h + 7C00h) = 0000h:7C11h
AX = 7C11h - 0011h = 7C00h
[Ctrl] + [Alt] + [Canc]
Valore | Effetto |
---|---|
0000h | Cold boot - Riavvio totale del computer |
0064h | Burn-in mode |
1234h | Warm boot - Riavvio senza pulizia della RAM |
4321h | (Solo PS/2) - Riavvio senza pulizia della RAM |
5678h | (Solo PC Convertible) System suspended |
9ABCh | (Solo PC Convertible) Manufacturing test mode |
ABCDh | (Solo PC Convertible) POST loop mode |
INT 16h - Servizio n. 00h - Read keyboard input: attende la pressione di un tasto. Argomenti richiesti: AH = 00h (servizio Read keyboard input) Valori restituiti: AL = codice ASCII del tasto premuto AH = codice di scansione del tasto premuto |
nasm -f bin bootload.asm -o bootload.bin
w address drive sector number
debug bootload.bin
w 100 0 0 1
(per il primo floppy disk)
dd if=input_file of=output_file bs=block_size count=num_blocks
dd if=bootload.bin of=/dev/fd0 bs=512 count=1
dd if=bootload.bin of=/dev/fd0
Nota importante. Si faccia molta attenzione a non utilizzare disinvoltamente il comando dd; ciò vale, in particolare, quando si specifica l'hard disk come destinazione! Prima di utilizzare il comando dd è vivamente consigliabile la lettura delle relative "pagine man" (man dd). |
ORG 150
org 510 dw 0AA55h |