Asember 8086

0

Witam, otóż mam takie zadanie, aby wyświetlić napis na ekranie (procesor intel 8086) nie używając żadnego z przerwań. Mam pewną koncepcje, żeby konkretne litery przesłać do pamięci ekranu. Wiem tylko tyle że adres pamięci ekranu zaczyna się od 800h:0000 do 800h:4000.
Gdy pisze w programie taką formułkę:

mov ax,41
mov 0B800h:0000,ax

to program się kompiluje natomiast nic konkretnego się nie dzieje.
Czy jest jakiś sposób żeby w taki sposób to zrobić?

0

Musisz przełączyć sobie najpierw tryb na graficzny żeby to w ogóle miało sens. http://www.wagemakers.be/english/doc/vga bo inaczej nie będzie widać tego twojego pisania po pamieci karty graficznej.

1

No po prostu ręce opadają :D Tak się to robi...

[BITS 16]
[ORG 0x7C00]

mov	ax,	0xB800	; segment przestrzeni pamięci ekranu trybu tekstowego 80x25
mov	es,	ax	; załaduj

mov	ah,	0x0A	; kolor jasno zielony znaków/tekstu
xor	di,	di	; wypisuj znaki od początku przestrzeni pamięci ekranu trybu tekstowego 80x25

mov	al,	"A"	; znak do wyświetlenia
stosw		; zapisz do 0xB800:0x0000

mov	al,	"B"	; znak do wyświetlenia
stosw		; zapisz do 0xB800:0x0002

jmp	$	; zatrzymaj dalsze wykonywanie kodu

times	510 - ( $ - $$ )	db	0x00
dw	0xAA55

Kompilacja:nasm -f bin nazwa_pliku.asm -o nazwa_pliku.bin
Uruchomienie:qemu-system-i386 -hda nazwa_pliku.bin

Działa, sprawdzone!

user image

mateq25 napisał(a):

Wiem tylko tyle że adres pamięci ekranu zaczyna się od 800h:0000 do 800h:4000.

Gdzieś to wyczytał?

0

Ogólnie takie coś zostało mi podane na wykładzie. Że pamięć ekranu zaczyna się od 800h i zawiera 4000 bajtów, 2000 znaków i 2000 atrybutów do tych znaków. Dziękuję bardzo za odpowiedź. :)

0

Najbardziej właśnie zależało mi na tym żeby mi wytłumaczyć jak po prostu przesłać literę do pamięci ekranu, czytałem na różnych stronach i nic sensownego nie znalazłem.. No właśnie poza tym że trzeba przejść w tryb graficzny. Teraz tylko zapętlić to i wyświetlic 25 znaków :D Dzięki :)

0

A mógłbym jeszcze się dowiedzieć tak dokładnie w jaki sposób rozkaz STOSW zapisuje daną literkę pod ten adres ? Czy ten rozkaz po prostu operuje na segmencie dodatkowym ktory zwieksza dany adres o 2 ? A jeżeli tak, to w jaki sposób ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1