_asm
{
mov eax,ebx
add ecx,edx
} asm mov eax,ebx
asm add ecx,edxEinen allgemeinen Standard gibt es hierfür nicht
IFDEF masm
option casemap :none
ENDIF
Kann ich das nicht als TASM-Nutzer weglassen?nasm -f elf file.asm -o obj alink file.obj -oEXE file.exe
SendMessageA equ SendMessageA@16?LoadBitmap, LoadIcon, CreateDialogParam, usw.) oder automatisch mehrere Sprachen unterstützt werden sollen, ansonsten sind normale Datensegmente einfacher zu handhaben.RDTSC und CMOVxx/FCMOVxx können uneingeschränkt verwendet werden. Dies trifft auch auf MMX und 3DNow zu, da die MMX/3DNow-Register auf die FPU-Register abgebildet werden und deshalb vom Betriebssystem während eines Taskwechsels automatisch gesichert werden. Befehlssätze, die neue Register verwenden wie SSE und SSE2 benötigen jedoch Betriebssysteme, die auch diese Register sichern können. Aus diesem Grund läßt sich SSE und SSE2 nicht unter Windows95 und älteren NT-Versionen verwenden.VirtualProtect sowie die Flags im PE-HeaderVirtualProtect.code-Section setzen.data) oder zusätzlich alloziertem Speicher kopieren und dort ausführen.VirtualAllocEx auf, so daß man diese Funktion ebenso für diesen Zweck verwenden kann. Allerdings bieten die in vielen Bibliotheken enthaltenen malloc()/new() - Funktionen zusätzlich noch den Vorteil, daß sie kleinere Speicherbereiche zuerst aus eigenem reserviertem Speicher verwenden und erst wenn dieser knapp wird auf das Betriebssystem zurückgreifen. Bei new() wird zudem noch der zugehörige Konstruktor aufgerufen.Query, AddRef und Release werden natürlich mitgezählt).CreateWindow?CreateWindowEx aufruft und den zusätzlichen Parameter dabei auf 0 setzt.InitDialog o.ä.SetDlgItemInt, SendMessage,...). Es gelten deshalb für die Fensterprozedur dieselben Regeln wie für rekursiv aufrufbare Funktionen; insbesondere müssen innerhalb der Fensterprozedur verwendete Variablen lokale Variablen (d.h. auf dem Stack) sein.DefWindowProc die Funktion DefFrameProc aufrufen. Fensterprozeduren für Unterfenster rufen stattdessen die DefMDIChildProc auf.CreateDC und DISPLAY als Gerätename.BitBlt oder MaskBlt wird es dann angezeigt.ChangeDisplaySettings auf.KeyboardProc, MouseProc, SetWindowsHookEx, UnhookWindowsHookEx, usw.). Funktionsaufrufe in DLLs innerhalb eines Prozesses kann man abfangen, indem man die Sprungziele der DLL im Speicher durch die Adressen der eigenen Funktion ersetzt. Wenn das immer noch nicht genügt so kann man mit den Debugfunktionen arbeiten, benötigt dazu aber entsprechende Zugriffsrechte. Weitergehende Informationen befinden sich auf internals.comSIDT-Instruktion. Allerdings heißt das noch lange nicht daß man auf die Tabelle zugreifen darf... Zudem sind die Interrupts für den Kernel reserviert und folglich vom verwendeten Betriebssystem abhängig.CheckSumMappedFile, enthalten in imagehlp.dll.FlushInstructionCache() nach selbstmodifizierendem Code benötigt?GetCommandLine erhält man die gesamte Kommandozeile als Zeichenkette.FillConsoleOutputCharacter. Wichtig: Im allgemeinen ist die Breite als auch die Höhe der Konsole (in Zeichen) nicht bekannt. In diesem Fall sollte man erst mal mittels GetConsoleScreenBufferInfo Höhe und Breite der Konsole ermitteln und daraus die Anzahl benötigter Zeichen errechnen.printf aus der MSVCRT.DLL:; Hello, World for the Windows Command Line
; Copyright 2007, Daryl Lee
%include "win32n.inc"
EXTERN exit
IMPORT exit msvcrt.dll
EXTERN printf
IMPORT printf msvcrt.dll
segment .data USE32
MsgContent db "Welcome to Windows Assembly Language Programming", 0
segment .code USE32
main:
..start:
; Display message
push dword MsgContent
call [printf]
add esp, 4 ; clean up stack
; Exit with success code
push 0
call [exit]FindFirstFileA, FindNextFileA und FindClose. Achtung: Einige Windows-Include-Dateien verwenden einen falschen Wert für die Konstante MAX_PATH: Der richtige Wert beträgt 260.GetLastError und FormatMessagemciSendString öffnet man das CDAUDIO-Gerät, setzt den Wert DOOR auf OPEN und schließt es danach mit CLOSE. Beispielcode gibt es vom Test DepartmentBeginUpdateResource, UpdateResource und EndUpdateResource.