Programowanie PC innaczej.

W tym miejscu zadajemy pytania na temat języka Assembler, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Programowanie PC innaczej.

Postautor: PROTON » piątek 09 paź 2015, 09:22

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"
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
RafPe
User
User
Posty: 177
Rejestracja: sobota 05 wrz 2015, 16:22

Re: Programowanie PC innaczej.

Postautor: RafPe » piątek 09 paź 2015, 13:02

Naprawde fajnie to wyglada :)


Wróć do „Pisanie programów w Assembler”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości