Imam dosta znanja o programiranju ( C++, OpenGL, DirectX - svuda sam po malo programirao)
Sada se osecam kao da sam na pocetku, dok posmatram sebe kako kucam kod koji izbacuje Hello, World ... :)
Verovatno ce sve ici brze kada pohvatam termine i logiku koja se koristi u asembleru, a do tada evo jednog malog koda koji sabira dva broja ( pa trebalo bi ).
Code:
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
uint typedef word ;Unsigned integers.
integer typedef sword ;Signed integers.
.data
broj1 uint ?
broj2 uint ?
rezultat uint ?
opcija uint ?
res byte 128 dup (?)
template db "%d", 0
recenica1 db "Unesite prvi broj: ", 0
recenica2 db "Unesite drugi broj ", 0
recenica3 db "Sabiranje(1) Oduzimanje(2) Mnozenje(3) Deljenje(4)", 0
.code
start:
invoke StdOut, addr recenica1
invoke StdIn, addr broj1, 100 ; unosimo broj 1
invoke StdOut, addr recenica2
invoke StdIn, addr broj2, 100 ; unosimo broj 2
invoke StdOut, addr recenica3
invoke StdIn, addr opcija, 100 ; opcija
.if(opcija == 1) ; sabiramo broj1 i broj2
mov ax, broj1
add ax, broj2
mov rezultat, ax
.endif
invoke wsprintf, addr res, addr template, rezultat ; priprema za out to screen
invoke StdOut, addr res
invoke StdIn, addr broj1, 1 ; cekamo pritisak dugmeta za izlazak ( budjavo, ali ne znam drugacije - interupt or something)
invoke ExitProcess,0
end start
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
uint typedef word ;Unsigned integers.
integer typedef sword ;Signed integers.
.data
broj1 uint ?
broj2 uint ?
rezultat uint ?
opcija uint ?
res byte 128 dup (?)
template db "%d", 0
recenica1 db "Unesite prvi broj: ", 0
recenica2 db "Unesite drugi broj ", 0
recenica3 db "Sabiranje(1) Oduzimanje(2) Mnozenje(3) Deljenje(4)", 0
.code
start:
invoke StdOut, addr recenica1
invoke StdIn, addr broj1, 100 ; unosimo broj 1
invoke StdOut, addr recenica2
invoke StdIn, addr broj2, 100 ; unosimo broj 2
invoke StdOut, addr recenica3
invoke StdIn, addr opcija, 100 ; opcija
.if(opcija == 1) ; sabiramo broj1 i broj2
mov ax, broj1
add ax, broj2
mov rezultat, ax
.endif
invoke wsprintf, addr res, addr template, rezultat ; priprema za out to screen
invoke StdOut, addr res
invoke StdIn, addr broj1, 1 ; cekamo pritisak dugmeta za izlazak ( budjavo, ali ne znam drugacije - interupt or something)
invoke ExitProcess,0
end start
Ovi silni include-ovi su tu jer isprobavam sve i svasta pa da se ne smaram o tome koji cu da umetnem u kod.
Sve radi kako treba... Osim izbacivanja pravog rezultata. Uvek mi izadje na ekranu 10.
Mislim da je greska kod wsprintf naredbe, mada sam sve OK uradio ( addr - zato sto su pointeri u pitanju i tako dalje )
Gde je greska i ( ako moze ) sta treba poboljsati na ovom kodu ( na nivou beginner-a ) tj. ima li boljeg nacina da se sve ovo izbaci na ekran u silu assemblera, a ne pomocu WinAPI-ja...
EOF