vrijdag 6 april 2018

Visual Studio ideaal voor C++ / x64 assembler programming

Visual Studio is echt ideaal voor debugging C++ / x64 assembler code.
Tijdens het debuggen kun je ctrl-alt-d drukken om assembly code van de C++ code te zien.
Ook kun je de inhoud van de registers zien. Tevens van de stack, met Debug/Windows/Memory/Memory1.

In je header file van je C++ class definieer je een extern naar een assembler file als volgt:

extern "C" void RotateScreenPart(BYTE* screenSource, BYTE* screenDestination, Sint64 startY, Sint64 endY, Sint64 cosinusAngle, Sint64 sinusAngle, Sint64 centerPointX, Sint64 centerPointY, Sint64 screenWidth, Sint64 screenHeight);

Vergeet niet deze typedef's op te nemen:
typedef signed __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef signed __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef signed __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;

typedef uint8_t BYTE;
typedef uint16_t Uint16;
typedef int16_t Sint16;
typedef uint32_t Uint32;
typedef int32_t Sint32;
typedef uint64_t Uint64;
typedef int64_t Sint64;

In je assembler file doe je:

RotateScreenPart proc
push rbp
mov rbp, rsp
sub rsp, 30h     ; 6 qwords space.
mov [rbp-8h], r8
mov [rbp-10h], r9
mov [rbp-18h], rcx
mov [rbp-20h], rdx
push rax
mov rax, 1566 - 100
mov [rbp-28h], rax
mov rax, 1566 - 200
mov [rbp-30h], rax
push rbx

; cosinusAngle      = [rbp+30h]
; sinusAngle        = [rbp+38h]
; centerPointX      = [rbp+40h]
; centerPointY      = [rbp+48h]
; screenWidth       = [rbp+50h]

pop rbx
pop rax
mov rsp, rbp
pop rbp
ret
RotateScreenPart endp

Aan de bovenstaande code zie je dat de 
parameter1 = rcx
parameter2 = rdx
parameter3 = r8
parameter4 = r9
mov rax, [rbp+30h] ; parameter 5
mov rax, [rbp+38h] ; parameter 6

Je kunt ook nog lokale space aanmaken. Zie RotateScreenPart.


Geen opmerkingen:

Een reactie posten