Assemble rysowanie punktu

0

Cześć mam program w assemblerze, który pokazuje kursor i śledzi jego współrzędne. Chciałbym rysować piksele po tych współrzędnych. Wie ktoś jak to zrobić?

Nie wiem jak zapalać piksele. A program działa w dosie.

3
Wojciech Stolarz napisał(a):

Cześć mam program w assemblerze,

Uczciwie podałeś, że go nie napisałeś.

Nie wiem jak zapalać piksele.

Trzeba trochę kodu, czego i tobie życzę.

2

lepiej korzystac z ASCII przy programowaniu w DOS

2

@Wojciech Stolarz: domyślam się, że chodzi Ci o wywołanie biosu int 10h.
https://en.wikipedia.org/wiki/INT_10H

Z tej strony interesujące jest dla Ciebie:
ah=00h - ustawienie trybu graficznego
ah=0Ch - "zapalenie" pixela (tutaj zwróć uwagę jak zapisuje się kolor i mieszanie, żebyś się nie zdziwił ).

Ciężko powiedzieć czy to masz na myśli, ponieważ nie podałeś żadnego kodu.

0
malencki napisał(a):

@Wojciech Stolarz: domyślam się, że chodzi Ci o wywołanie biosu int 10h.
https://en.wikipedia.org/wiki/INT_10H

Z tej strony interesujące jest dla Ciebie:
ah=00h - ustawienie trybu graficznego
ah=0Ch - "zapalenie" pixela (tutaj zwróć uwagę jak zapisuje się kolor i mieszanie, żebyś się nie zdziwił ).

Ciężko powiedzieć czy to masz na myśli, ponieważ nie podałeś żadnego kodu.

malencki napisał(a):

@Wojciech Stolarz: domyślam się, że chodzi Ci o wywołanie biosu int 10h.
https://en.wikipedia.org/wiki/INT_10H

Z tej strony interesujące jest dla Ciebie:
ah=00h - ustawienie trybu graficznego
ah=0Ch - "zapalenie" pixela (tutaj zwróć uwagę jak zapisuje się kolor i mieszanie, żebyś się nie zdziwił ).

Ciężko powiedzieć czy to masz na myśli, ponieważ nie podałeś żadnego kodu.

DATA SEGMENT USE16
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
Start:
mov ax,0013h
int 10h
MOV AX,0001h
INT 33h
mov dx,0a00h
mov es,dx
Rysuj:
mov ax,0003h
int 33h
test bx,1
jz Nie_stawiaj_punktu
push bx
mov ax,dx
mov bx,320
mul bx
shr cx,1
add ax,cx
mov di,ax
mov byte ptr es:[di],63
pop bx

Nie_stawiaj_punktu:
test bx,2
jnz koniec
jmp Rysuj
Koniec:
mov ax,0003h
int 10h
mov ax,4c01h
int 21h

CODE ENDS
END BEG

Ten program wstawia mi kursor i mogę nim ruszać, ale nie chce reagować na klawisze.

i nie rozumiem linijk
mov byte ptr es:[di],63

która jest właśnie odpowiedzialna za stawianie punktu

1

Tutaj odwołujesz się bezpośrednio do zmapowanej pamięci karty graficznej.
mov byte ptr es:[di],63 - jest to adres pod który są zapisywane pixele.

W tym miejscu:

mov dx,0a00h
mov es,dx

tworzysz adres bazowy do adresowania o które pytasz.
Błąd w Twoim programie polega na tym, że przypisujesz pixele do pamięci zaczynające się od adresu 0a00h 0a000h.
Sprawdziłem na szybko mapowanie pamięci w systemie DOS i początkowy adres zmapowanej pamięci dla pixeli to a000h a0000h.

Wynika z tego że do dx musisz przypisać poprawny adres bazowy mov dx,0a000h.
Reszta kodu wygląda w miarę ok. Jeśli nie ma innych błędów to po tej zmianie powinno zacząć śmigać.

0

A w jakim programie w dzisiejszych czasach (może być płatny) można tworzyć pliki EXE dla jeżyka assembler i C++?

Bo wszystkie programy jakie znam są stare.

1

W zależności co chcesz programować i w jakim środowisku, narzędzia będą różne.
Doprecyzuj co chcesz uzyskać i przy użyciu jakiego oprogramowania, aktualnie, tworzysz kod.

0
Wojciech Stolarz napisał(a):

A w jakim programie w dzisiejszych czasach (może być płatny) można tworzyć pliki EXE dla jeżyka assembler i C++?

Bo wszystkie programy jakie znam są stare.

Gdybyś naprawdę chciał działać w C++, dawno byś znalazł.
Programowanie to nie przede wszystkim klikanie kodu - to szukanie i rozgryzanie informacji / wiedzy.

0
AnyKtokolwiek napisał(a):
Wojciech Stolarz napisał(a):

A w jakim programie w dzisiejszych czasach (może być płatny) można tworzyć pliki EXE dla jeżyka assembler i C++?

Bo wszystkie programy jakie znam są stare.

Gdybyś naprawdę chciał działać w C++, dawno byś znalazł.
Programowanie to nie przede wszystkim klikanie kodu - to szukanie i rozgryzanie informacji / wiedzy.

Tak w tym, że nie wiem jak dla asemblera coś poszukać. Mam Intel(R) Core(TM) i5-10300H CPU @ 2.50GHz 2.50 GHz i chciałem pod niego troche exeków napisać. Stawiam dopiero pierwsze kroki z asemblerem. Mam Visual 2022 ale to co zaprezentowała ta Pani u mnie nie działa, bo nie mam wysztkich opcji co ona. Na dzień dzisiejszy bawię się bez tworzenia plików EXE w Viual Studio Code i wtyczką MASM/TASM

2
Wojciech Stolarz napisał(a):

A w jakim programie w dzisiejszych czasach (może być płatny) można tworzyć pliki EXE dla jeżyka assembler i C++?

Bo wszystkie programy jakie znam są stare.

Ja tworzę na trzy sposoby:

  • Pierwszy nasm + linker:
nasm -f elf64 main.asm -o main.elf
ld main.elf -o main.o
./main.o
  • Drugi robię tylko nasm, dam daję dyrektywę global _func, żeby adres był widoczny z zewnątrz, kompilację bez linkowania robię, sam nasm, potem w C/C++ robię extern _func i rzutuję na dany typ funkcji itp.

  • Trzeci w C/C++ dodaje wstawkę assemblera.
    https://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C

  • Gotowe środowisko, to akurat ten co na filmiku podałeś microsoft visual studio + masm, tam w instalatorze chyba trzeba zatwierdzić do instalacji lub jest domyślnie, ale nie korzystam z tego to nie wiem.

0
GodOfCode. napisał(a):
Wojciech Stolarz napisał(a):

A w jakim programie w dzisiejszych czasach (może być płatny) można tworzyć pliki EXE dla jeżyka assembler i C++?

  • Gotowe środowisko, to akurat ten co na filmiku podałeś microsoft visual studio + masm, tam w instalatorze chyba trzeba zatwierdzić do instalacji lub jest domyślnie, ale nie korzystam z tego to nie wiem.

Dokładnie tak.
Instalator jest wielokrotnego użycia, nie trzeba formatować dysku (bo podobni koledzy tak naprawiają)

0

No i udało się mam Visual Studio 2019 i ten dodatek asemblerowy jak na filmiku. Wszystko byłoby w porządku, gdyby nie błąd jaki mi wywala. Ktoś wie jak go rozwiązać, bo po necie nie mogę nic poszukać. Bez tytułu.jpg

1
Wojciech Stolarz napisał(a):

gdyby nie błąd jaki mi wywala. Ktoś wie jak go rozwiązać, bo po necie nie mogę nic poszukać

Jakbyś jak wszyscy ustawił IDE po angielsku, być raczej wyszukał.

No i udało się mam Visual Studio 2019 i ten dodatek asemblerowy jak na filmiku

Posiadanie IDE to za mało na sukces, jeszcze trzeba w nim się obracać.
masz niepowodzenie buildu, i tym się trzeba zająć.

PS. Jakbyś nie wstawił debilnego obrazka, ktoś by wkleił w googla komunikat i ci przeczytał.

3

Jakby ci to powiedzieć, pod windowsem nie programujesz jak w dosie.

Musisz korzystać z syscalli, funkcji winapi itp.

Czyli programowanie jest identyczne do tego jak robisz to w języku C.

Czyli dobrze umieć przed tym język C, wtedy byś wiedział, że żeby wypisać coś na konsolę to musisz napisać do pliku stdout na windowsie trzeba GetStdHandle wywołać z wartością -11.
Żeby wyświetlić okienko to importujesz MessageBox i wrzucasz na stos parametry i wywołujesz callem funkcję.

Dobra żeby ci masm dobrze działał musisz pobrać includy do masma, czyli musisz zrobić git clone https://github.com/tonado/MASM32-SDK na dysk C:\ potem zmień nazwę na masm32

Teraz dam ci kod przykładowy:

.386
.model flat,stdcall
.stack 4096
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
STD_OUTPUT_HANDLE EQU -11
GetStdHandle proto
MessageBox proto
ExitProcess proto
WriteConsoleA proto


.data
    tit db "Dupa",0
    text db "Assembler",0
    num dd 0
    conHandle dd 0
.code
main proc

    push STD_OUTPUT_HANDLE
    call GetStdHandle
    mov conHandle, eax

    push offset num
    push 5
    push offset tit
    push conHandle
    call WriteConsoleA

    push 1         
    push offset tit
    push offset text
    push 0
    call MessageBox

    push 0
    call ExitProcess

main endp
end main
0

Ok. Z innej beczki.

Napisałem program, który zczytuje z klawiatury znak, dodaje do niego 5 i wyświetla sumę na ekranie. Problem jest z tym, że gdy suma jest większa od 10, czyli dwucyfrowa to nie pokazuje liczby całkowitej, tylko daje znaczki. O co tu chodzi?

DATA SEGMENT USE16
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:

MOV AH,1
int 21H
MOV DL,AL
add dl,5
MOV AH,2
INT 21H
JMP BEG

CODE ENDS
END BEG

1

@Wojciech Stolarz:

Odrózniasz cyfrę (znak graficzny, w naszym kręgu cyfry tzw arabskie) od liczby (podstawa w matematyce) ?
ps dodawanie cyfr ASCII z istoty nie ma sensu, tu tylko przypadkowo "coś czasem" z tego wychodzi

sadzę, że zainwestuj w normalne postawy, naucz się koncepcji, słów, w jakimś normalnym języku, planowania algorytmów, nazywania rzeczy.
Jak na mnie, jestem zaskoczony przy kawie, że ktoś siłuje się wywleczonym z googla asemblerem nie mając odróżnienia w zakresie 4 klasy podstawówki

Wklejanie przypadkowego nie rozumianego kodu w przestarzałym asemblerze - jaki ma miec sens ?

0

W zasadzie nie ma raczej sensu. Też siedzę sobie przy kawie i przerabiam sobie książki z lat 90 w tym, że nie wszystko jest w nich objaśnione. Mam jedną na czasie " The ART of assembly language " ale to po tych starszych chcę zacząć ją przerabiać.

3

Musisz zaimplementować sobie IntToAscii w C języku się nazywa itoa.

Masz liczbę 123 teraz ta liczba składa się z 3 cyfr 1, 2, 3, żeby je zdobyć robisz dzielenie modulo, akurat dzielenie wykonuje automatycznie modulo w asm i w rejestrze jednym będziesz miał resztę z dzielenia, pamiętaj aby czyścić ten rejestr, bo potem jest używany przy następnych obliczeniach i będziesz szukał błędów pół dnia XD.
czyli 123 % 10 dostajesz cyfrę 3, potem dzielisz przez 10, otrzymasz 12, robisz znowu modulo, to otrzymasz 2 itp.

potem wypisujesz to w odwrotnej kolejności lub zapisujesz w odwrotnej.

0

Nie jest objaśnione bo są najczęściej adresowane do ludzi, którzy coś tam kumają w temacie architektury (ówczesnego) sprzętu. Jeśli nie zakładają to czasem lepiej, czasem gorzej starają się jednak wyjaśniać czy to za pomocą jakichś tabelek na końcu książki czy schematów. W formacie PDF to się tak nie rzuca w oczy jak trzymając fizyczny egzemplarz w ręce. Wracając do architektury to jeszcze na początku lat 90tych była jeszce dość niewyszukana i szło to w miarę szybko ogarnąć.

Nie było jednak aż tak prymitywnie jak za czasów ZX Spectrum, czy Commodore kiedy to wszystko co do szczęścia było potrzebne było od A do Z opisane w manualu dołączonym do komputera, który wyjaśniał co najmniej jak manipulować pamięcią w języku BASIC by rysować rzeczy na ekranie czy gadać z preyferiami jak dżojstiki, drukarki itd. Nie mniej jednak sprzęt i programy za pośrednictwem systemu operacyjnego wciąż łączyło w czasach późnego DOSa jeszcze relatywnie mało kleju a sam sprzęt jeszcze nie starał się robić tryliona rzeczy jednocześnie. Karta graficzna to było wciąż niewiele ponad zapalanie pikseli na analogowym ekranie, a domowe procesory dopiero co zaczynały domyślnie umieć w obliczenia zmiennoprzecinkowe. Po tym nastąpił morderczy maraton wprowadzania pod strzechy tego co stacje robocze miały już w latach 80tych i wczesnych 90tych by domowy blaszak był w stanie dźwignąć kanciaste wdzięki Lary Croft czy bardziej złożone projekty CAD.

To przyniosło komplikację architektury spiętrzając ilość wiedzy potrzebnej do obsługi tego wszystkiego na niskim poziomie. By uniknąć konieczności posiadania takowej wiedzy by z tym pracować zaczęto wporwadzać sowite warstwy kleju jak przeportowany ze stacji roboczych Silicon Graphics ten słynny OpenGL czy stworzono w Microsyfie DirectX i to ne ogarniały rozkazywanie kartom graficznym by rysowały na ekranie to co od nich chce programista. Kompilatory zaś decydowały czy to co jest zapisane w kodzie tłumaczyć na rozkazy działające skalarnie czy wektorowo zwalniając programistę z konieczności posiadania świadomości co i jak CPU liczy by program działał w miarę efektywnie. Systemy operacyjne nauczyły się nowych (czy raczej przerabianych wcześniej na stacjach roboczych i często pochodzących pierwotnie z "superkomuterów") sztuczek w zarządzaniu zasobami i nadzorem bezpieczeństwa pamięci. Game developer już nie musi rozumieć organizacji pamięci komputera by napisać wielce skomplikowaną grę typu Pac-Man. Ceną za to jest często jednak konieczność wykonania przez CPU dziesiątek a prawdopodobnie i setek instrukcji zanim na ekranie w ogóle pojawi się okno gry. Sam kod potrzebny do uzyskania takiego efektu też się wydłużył, o ile nie korzysta się z jakiegoś silnika, który jednakoż jest tylko opakowaniem skrywającym odwołania do tego programistycznego kleju.

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