Strona 1 z 1

Programowanie PC innaczej.

: piątek 09 paź 2015, 09:22
autor: PROTON
Programy na PC uruchamia się zazwyczaj pod kontrolą jakiegoś systemu operacyjniego, np. może być to DOS, Windows, Linux, itp. Można też uruchomić bezpośrenio na komputerze.
Wymagania są takie, że program musi być napisany w trybie 16bitowym, ponieważ będzie uruchamiany na procesorze pracyjącym w trybie rzeczywistym. Drugie wymaganie to program nie może być większy jak 512 bajtów, to ograniczenie wynika z tego że BIOS komputera jest w stanie wczytać tylko jeden 512 bajtów sektor i go uruchomić.
Żeby uruchomić program trzeba go wgrać do zerowego sektora dysietki lub pendrive a następnie zabootować z tego urządzenia komputer.

O to program zegar.asm

Kod: Zaznacz cały

[org 0x7c00]
start:

jmp word 0:code

;ES:DI - adres VRAM
;B800:0000 - początek - tryb tekstowy

code:
mov ax, 0xb800
mov es, ax
xor di, di
mov ds, di
xor ax, ax
mov cx, 80*25
cld
rep stosw   ;fill CX words at ES:DI with AX
mov di, (80*12+40-6)*2
mov si, text
mov cx, text_dl
write:
movsb   ; mov byte DS:SI ->  ES:DI
mov al,   12
stosb   ;store AL at address ES:DI
loop write

czas:
;#######################################
;odczyt godziny (tryb BCD)
clc
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
mov ah, 0x2
int 1ah

;przetwarzanie godziny
;godzina
xor ax, ax
mov al, ch
shr al, 4
add al, "0"
mov [data], al

mov al, ch
and al, 0b00001111
add al, "0"
mov [data+1], al

mov al,":"
mov [data+2], al

;minuta
mov al, cl
shr al, 4
add al, "0"
mov [data+3], al

mov al, cl
and al, 0b00001111
add al, "0"
mov [data+4], al

mov al,":"
mov [data+5], al

;sekunda
mov al, dh
shr al, 4
add al, "0"
mov [data+6], al

mov al, dh
and al, 0b00001111
add al, "0"
mov [data+7], al

mov al, " "
mov [data+8], al
mov [data+9], al

;wypisanie godziny
mov di, (80*13+40-4)*2
mov si, data
mov cx, data_dl
write2:
movsb
mov al, 4
stosb
loop write2

;#########################################
;odczyt daty
clc
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
mov ah, 0x4
int 1ah

;przetwarzanie daty
;century
xor ax, ax
mov al, ch
shr al, 4
add al, "0"
mov [data], al

mov al, ch
and al, 0b00001111
add al, "0"
mov [data+1], al

;rok
mov al, cl
shr al, 4
add al, "0"
mov [data+2], al

mov al, cl
and al, 0b00001111
add al, "0"
mov [data+3], al

mov al,"-"
mov [data+4], al

;miesiac
mov al, dh
shr al, 4
add al, "0"
mov [data+5], al

mov al, dh
and al, 0b00001111
add al, "0"
mov [data+6], al

mov al,"-"
mov [data+7], al

;dzien
mov al, dl
shr al, 4
add al, "0"
mov [data+8], al

mov al, dl
and al, 0b00001111
add al, "0"
mov [data+9], al


;wypisanie godziny
mov di, (80*14+40-5)*2
mov si, data
mov cx, data_dl
write3:
movsb
mov al, 6
stosb
loop write3

;czekanie na klawisz
;xor ax, ax
;int 16h

jmp czas

; stop
jmp $

text  db "ZEGAR PROTON"
text_dl equ $ - text
data times 10 db " "
data_dl equ $ - data

; botesctor

times (510-($-start)) db 0
db 0x55, 0xAA
times ((1440*1024)-($-start)) db 0


Kompilascja Netwide Assemblerem, tworzy ona obraz dyskietki.

nasm zegar.asm -o zegar.img

Efekt działania programu pod VirtualBoxem

e462d8e7607f39ef5016ba1a4e67ca97.png


Porgram powstał na bazie artykułów z miesięcznika programista, "Bliżej krzemu"

Re: Programowanie PC innaczej.

: piątek 09 paź 2015, 13:02
autor: RafPe
Naprawde fajnie to wyglada :)