MASM tutorial.

Status
Niet open voor verdere reacties.

CanTBeaTme

Banned
Lid geworden
25 jul 2006
Berichten
235
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 ; waarvoor staat dit?
.model flat ;wat doet dit?

IFDEF masm
option casemap:none
ENDIF

include windows.inc

IFDEF masm

MessageBoxA equ _MessageBoxA@16
ExitProcces equ _ExitProcess@4
ENDIF

extrn ExitProcess : near
extrn MessageBoxA : near

.data
MessageBoxsven db "sven owns MASM",0
MessageBoxvrankent db "IK WIN ****ERS",0
ErrorCode dd 0
.code
_letsbegin:


push MB_ICONHAND or MB_OKCANCEL
push offset MessageBoxsven
push offset MessageBoxvranken
push 0
call MessageBoxA
push ErrorCode
call ExitProcess
end _letsbegin
 
da wordt lezen

Ik zoek.......... maar ik krijg hem niet eens gecompiled (geassemblerd?)

>>Hmmm,zeker weten is het volgende niet gebeurd
1)download m32v9r.zip van masm32.com 2)installeer op c: 3) kijk wat er gebeurd
A) Textbestanden worden geschreven vanuit windoze interface.
B) ZwartWit geeft begin van bibliotheekopbouw aan
C) Iedere regel is een goede assembly
D) Aan het eind hiervan wordt een testprogramma geassembled en gestart
E) Programma vraagt aan Windoos om een window en dus wordt zwartwit verlaten
F) Parameters zetten en Masm32 is stand by

Bijna hetzelfde als een windows programma, kun je het programma voor een wasmachine
(Zancker,Miele)of kachel (Remeha) of BIOS programmeren.
Daarom moet een Assembler coder z'n code gebruik en geheugen indeling :
A of goed voorbereiden en bijhouden of
B De assembler zoveel mogelijk dit werk laten doen
>>.386 .model .data .code zijn hier voorbeelden van dit laatste

.389 ; waarvoor staat dit? TypeVout >>.386 Aantal verwachte PK's voor programma
.model flat ;wat doet dit? Geheugen gebruik op moment van laden (blijft)

IFDEF masm alleen als #DEFINE MASM hierboven voorkwam dan
option casemap:none geen omzetting naar hoofd of kleine letters
ENDIF en dus is er verschil tussen water wAter en Water gekomen

include windows.inc Plak hier het typewerk van windows.inc

IFDEF masm >>herhaling
Windows heeft intern meerdere routines voor bijna hetzelfde doel en bijna windows systemen hebben bijna Windows namen (Wine cygwin)
Opa equ Oma mocht ik opa gezegd hebben, ik bedoelde oma

MessageBoxA equ _MessageBoxA@16
ExitProcces equ _ExitProcess@4
ENDIF
extrn =zoekt en gij zult niet vinden (codecs, windowfuncties)
ExitProcess =laat mij geen virus zijn
near =houd rekening dat "registerlengte" bytes met locatie later ingevuld moet worden
>>.286 = 2 bytes dankzij .386 = 4 bytes

hier zet ik gegevens neer om te gebruiken
.data
MessageBoxsven db "sven owns MASM",0
MessageBoxvrankent db "IK WIN ****ERS",0
ErrorCode dd 0
.code
_letsbegin:

en hier probeer ik iets te krijgen waar je op kunt klikken met ok en cancel button
push MB_ICONHAND or MB_OKCANCEL
push offset MessageBoxsven
push offset MessageBoxvranken
push 0
call MessageBoxA
push ErrorCode
call ExitProcess
end _letsbegin

Mijn advies
Installeer masm32 ,lees en bekijk de voorbeelden die aan te klikken zijn als exe en asm
stap overop een andere assembler (jeremy gordon)http://www.godevtool.com/ als je raan toe bent.jeremy heeft ook een goed voorbeeld: exept32 http://www.jorgon.freeserve.co.uk/Except32.zip das heel goeie spul !!!
 
Tutorial waar ik het zelf gellerd heb, maar ik was ooit al wijs uit mc86000 asm, dus misschien was dat al een voorsprong......: http://win32assembly.online.fr/tutorials.html

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
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan