Hallöchen!
Im Moment übergebe ich meinen API Funktionen die Parameter über Register (z.B. rax, rbx, .. rsi, rdi ... r8, r9 etc.). Aber damit sind meine API Funktionen nicht sehr gut in Hochsprachen wie C/C++ anzusprechen. Ich kenne mich ja wie ihr alle wisst nicht so gut in Hochsprachen aus. Aber ich möchte das meine API Funktionen auch Beispielsweise mit C++ angesprochen werden können. Meine API Funktionen sind ja nichts anderes wie Interruptaufrufe. In rax wird eine Nummer übergeben (z.B. 0 für ShowCursor) und in den anderen Register halt Parameter. Das ganze habe ich in einem Makro gepackt, damit man sich die Nummern in rax nicht merken muss. Also z.B. kann man meine ShowCursor Funktion jetzt so aufrufen:
mov rcx,Wert ;Y-Position
mov rdx,Wert ;X-Position
mov bl,Wert ;Taste
ShowCursor ;ruft Makro auf
Das Makro macht folgendes:
push rax
xor rax,rax
int 30h
pop rax
Der Handler des "int 30h" prüft dann den rax Wert und springt zur ShowCursor unterfunktion. Diese ließt dann die Werte von bl, rcx und rdx aus und blablabla.
So verändert die Makrofunktion auch keine Register, sonst würde der ASM Programmierer ja auswendiglernen müssen welche Register verändert werden und diese vorher abspeichern müssen.
Das Ganze ist natürlich nicht sehr Hochsprachenfreundlich (da es dort diese Register ja nicht gibt). Mein Problem ist jetzt, wie mache ich die Parameterübergabe so das sie auch für Hochsprachen vernünftig ist. Ich habe da an den Stack gedacht. Man könnte es doch so realisieren, oder? :
push Wert ;X-Wert
push Wert ;Y-Wert
push Wert ;Taste
ShowCursor ;das Makro könnte ja bleiben, schließlich kann man das C/C++ doch durch *.h Dateien erklären, oder?
Dann würde man zum "int 30h" springen. Dieser würde den rax Wert prüfen und in diesem Beispiel zur Unterfunktion ShowCursor springen. Dann könnte man es doch so machen:
ShowCursorPrg:
push alle Register ;speichere alle Registerwerte die von ShowCursorPrg verändert werden
mov rbp,rsp
mov rbx ,[ss:rsb+blabla] ;hole z.B. den Wert für die Taste und kopiere ihn nach rbx
Würde das Sinn machen? Ich habe gesehen Windows API Funktionieren so ähnlich (nur das ein call aufgerufen wird und kein int). Ich könnte ja dann ShowCursorPrg dazu bringen die Rücksprungadressen in Variablen zu Speichern (und den RFlags-Register-Wert). Dann die den Stack so verkleinern das die Werte nicht nacher noch vom Stack geholt werden müssen. Bei Windows müssen diese z.B. nacher auch nicht mehr vom Stack geholt werden. Und die Windows API kann man ja super mit C/C++ ansprechen. Wäre das dann eine gute Lösung?
Wie sieht es dann aber mit Werten aus die ich von einer API Funktion bekomme und nicht gebe (also Z.B. eine Funktion wie ReadTime die mir dann ja die Zeit ausgeben muss, wo soll die die Zeit reinspeichern)?
Hoffentlich versteht ihr was ich meine.
thx
bitmaster