Ik zoek, een MASM tutorial dat vanuit het begin uitlegt waarmee ik bezig ben!
ik heb nu een tutorial, ze vliegen er drek in en laten me zien hoe ik een messagebox maak met daar een zinnetje in maar ik krijg hem niet eens gecompiled (geassemblerd?)
.389 ;
.386 da's de instructieset van je cpu, oftewel 32 bits intel
.model flat ;
Heb je even....dit gaat over het geheugenmodel als ik het goed heb. Win32 (*nix ook) programma's draaien in protected mode. Dat wil zeggen dat ieder programma dat draait op je pc z'n eigen geheugen ruimte heeft. Vroeger was het zo dat er een globaal geheugen was. Ieder programma kom schrijven en lezen uit het geheugen van andere programma's. Had programma 1 een bug, bijvoorbeeld dat een pointer verkeerd werd berekend, werd er geschreven naar geheugen dat door programma 2 gebruikt werd. Resultaat: programma 2 crash, terwijl de bug in programma 1 zit. Tegenwoordig heeft ieder programma z'n eigen virtuele geheugenruimte en verzorgt het OS (windows, *nix, etc) voor de vertaalslag tussen virtueel en werkelijke (fysieke) geheugenadressen
IFDEF masm ; Assembler (masm in dit geval) specifieke opties
option casemap:none
ENDIF
include windows.inc ; Include de windows header
IFDEF masm
MessageBoxA equ _MessageBoxA@16 ; De tekst MessageBoxA moet door de assembler gelezen worden als _MessageBoxA@16
ExitProcces equ _ExitProcess@4 ; Ditzelfe voor ExitProcess, dit het ik nooit gebruikt, windows.inc en de linker handelen dit zelf af
ENDIF
extrn ExitProcess : near ; ik denk iets van linker informatie, zie hierboven
extrn MessageBoxA : near
.data ; De DATA chunk van je programma. Een programma kan uit meerdere onderdelen bestaan: .code, . data, . data? .data zorgt ervoor dat dit gedeelte van het programma in read-write geheugen geplaatst wordt. Dit wil zeggen dat je programma zowal kan lezen van de waarden in deze chunk als er gegevens in kan opslaan
MessageBoxsven db "sven owns MASM",0 ; Dit is een simpele tekst net een label (MessageBoxsven) en die eindigt met de verplichte 0
MessageBoxvrankent db "IK WIN ****ERS",0
ErrorCode dd 0 ; db = byte lengte (8 bits), dw = word lengte (16 bits) en dd in dword lengte (32 bits) Hier wordt een read-write geheugenadres gereserveerd met de standaardwaarde 0
.code ; De code chunk. Een code chunk is read-only geheugen. Het is dan ook niet de bedoeling dat je programma hiernaar schrijft, Als je dit wel doet volgt er een page fault
_letsbegin: ; Een label
push MB_ICONHAND or MB_OKCANCEL ; Die MB_ICONHAND en MB_OKCANCEL worden gedefineerd in windows.inc. Die zien er uit als 2, 6 of 128, oftewel een getal. or wil zeggen dat deze waarden binair gecombinneerd moeten worden net een logische or. Push wil zeggen dat deze waarde op de stack gezet moet worden. API aanroepen zetten hun argumenten altijd op de stack onders window (en *nixen). Als je C kan lezen zie dan:
http://msdn2.microsoft.com/en-us/library/ms645505.aspx Je moet de argumenten van rechts naar links lezen.
push offset MessageBoxsven ; push = zet op de stack, offset = neem het geheugenadres, als een pointer in C (&) en MessageBoxsvan is het label uit je .date chunk
push offset MessageBoxvranken ; zelfde als hierboven
push 0 ;Het HWND argument als je C kan lezen. NULL (0) wil zeggen geen parent window
call MessageBoxA ; MessageBoxA wordt vertaalt door de assembler in doe @16. Da's en API call voor windows met de argumenten die net on de stack gezet zijn
push ErrorCode ; Argument voor ExitProcess met een label, oftwel wat in je .data staat = 0
call ExitProcess ; Roep de API call ExitProcess aan (stopt je programma)
end _letsbegin ; einde van je label