C
jochen06 schrieb:
typedef struct list {
struct list *next;
int value;
} list;
so kommen wir der sache schon näher. ich hab mir mal die freiheit genommen, die erste funktion und eine find funktion zu implementieren:
typedef struct list
{
struct list *next;
int value;
} list;
__declspec(naked) list* ADD_CONSTANT_TO_LIST_ELEMENT(list *element, int value)
{
__asm
{
mov eax, [ esp + 4 ] // element
mov edx, [ esp + 8 ] // value
test eax, eax
jz exit_
add list::value[ eax ], edx // alternative syntax: add [ eax ]list.value, edx
exit_:
ret
}
}
__declspec(naked) list* FIND(list* a_list, int value)
{
__asm
{
mov eax, [ esp + 4 ] // a_list
mov edx, [ esp + 8 ] // value
jmp start_
loop_:
mov eax, list::next[ eax ]
start_:
test eax, eax
jz exit_
cmp list::value[ eax ], edx
jne loop_
exit_:
ret
}
}
die zeile wo ich eine alternative syntax angegeben habe, ist das intressante daran. im prinzip wollen wir einen ausdruck [eax+offsetof(list,value)] (nur ist offsetof ein C macro, das wir hier nat. nicht einsetzen können) - und es gibt auch ein paar syntaktische varianten, die der compiler hier akzetiert. die beiden, die ich oben gezeigt habe, haben allerdings den vorteil, dass sie auch der intel compiler für windows versteht - falls du jemals in verlegenheit gerätst, diesen benutzen zu wollen. die tradiotionelle methode der art
(list ptr [eax]).value
wie man sie in standalone assembler verwenden würde, scheitert an einigen beschränkungen des inline assemblers.