strucktur von asm nach c

12/08/2012 - 23:07 von Jens Kallup | Report spam
Hallo,

wie kann man eine Strucktur in ASM nach C und umgekehrt verwenden?

mov dword [esp+8], 2
mov ebx, var_struct_LCmyArray
mov dword [esp+4], ebx
mov dword [esp], array_myArray
call set_array_value
add esp, 16

.data
var_struct_LCmyArray:
dd 1
dq 3.01
dd 0
dd 0
dd 0

array_myArray: db "myArray", 0


extern "C" __declspec(dllexport) void set_array_value(char *n,
TParameterStruct *off, int num)
{
cout << n << endl; // myArray
cout << num << endl; // 2

if (off->type == 1)
{
cout << off->val << endl;
// 5.30761e-315
// statt 3.01
}
}


woran kann das liegen?

Gruß
Jens
 

Lesen sie die antworten

#1 Jan Seiffert
12/08/2012 - 23:58 | Warnen spam
Jens Kallup schrieb:
Hallo,

wie kann man eine Strucktur in ASM nach C und umgekehrt verwenden?




Indem beide "gleich" sind.
ASM ist hierbei eher derjenige der alles 100% macht was man ihm sagt.
C hingegen fügt "im hintergrund" ein paar Regeln ein, wie z.B. die ABI,
die z.B. ein alignment für Typen vorgibt (und damit für padding sorgt).
Das ist aber Prozessor und Compiler und Betriebsystem abhàngig.
Darum geht man immer besser von einem C-Struct nach ASM.
(man kann aber eine C-Struktur optimieren um zu versuchen padding zu
minimieren)

mov dword [esp+8], 2
mov ebx, var_struct_LCmyArray
mov dword [esp+4], ebx
mov dword [esp], array_myArray
call set_array_value
add esp, 16

.data
var_struct_LCmyArray:
dd 1
dq 3.01
dd 0
dd 0
dd 0




das ist also irgendwie:
struct parameter
{
uint32_t type;
double val;
uint32_t whatever;
uint32_t more_foo;
uint32_t blabla;
}

[snip]

woran kann das liegen?




Ich tippe es ist x86, dann kommt zwischen val und type noch padding, damit das
alignment von val passt, und ans Ende muss noch mehr padding, damit mehrere
Strukturen im ganzen in einem array wieder ausgerichtet sind:

dd 1 // type
dd 0 // padding
dq 3.01 // val
dd 0 // whatever
dd 0 // more foo
dd 0 // blabla
dd 0 // padding

Du kannst dir ja mal sizeof der Struktur ausgeben lassen und offsetof der
einzelnen Felder.

Gruß
Jens



Gruss
Jan

Ähnliche fragen