Ich habe diese Funktion, die Inline-Assembly, die im Grunde eine C-Funktion ruft, ruft den zurückgegebenen Wert und übergibt diesen Wert als Parameter an eine andere Funktion, die ein Zeichen zurückgibt.Get char von einer C-Funktion mit Inline-Assembly
void convertText(FILE *arch, FILE *result)
{
int i = 0;
int n = arch->size;
_asm {
mov esi, 0
whileS:
cmp esi, n
jge end
mov ebx, result
mov ebx, [ebx]result.information ; Pointer to an array of characters
push esi ; Push parameters to get5bitsFunc
push arch ; Push parameters to get5bitsFunc
call get5bitsFunc
pop arch ; Restore values
pop esi ; Restore values
push eax ; push get5bitsFunc returned value to codify as parameter
call codify
mov edi, eax ; <- HERE move returned value from codify to edi register
pop eax ; restore eax
inc esi
jmp whileS
end:
}
}
Denken Sie an kodifizieren als Funktion des Typs
unsigned char codify(unsigned char parameter) {
unsigned char resp;
// Do something to the parameter
resp = 'b'; // asign value to resp
return resp;
}
ich bereits kodifizieren getestet und funktioniert gut, um den Wert der Rückkehr I C-Code wollen verwenden. Das Problem ist, dass, wenn ich den ConvertText-Code in Inline-Assembly in der Zeile ausführen und debuggen, die ich als "-> Here" markiert habe, ist der in eax zurückgegebene Wert etwas vom Typ 3424242 und nicht 97 oder höher in der ascii-Tabelle Ich brauche.
Wie kann ich den char Wert erhalten?
Ein 'unsigned char' ist nur 1 Byte, während' eax' ein 32-bit (4 Byte) Register ist. Wenn 'codify()' nur 1 Byte zurückgibt, dann wird der Rückgabewert in 'al' gespeichert (das erste Byte von' eax'), während der Rest von 'eax' unberührt bleibt (was zu Müll führen würde). Ich würde 'xor eax, eax' vor dem Aufruf von' codify() 'empfehlen, damit Sie wissen, dass das Register sauber ist, bevor Sie den Rückgabewert darin speichern. –
@BrendonBoldt Yeah Mann, danke, dass du Recht hattest, kannst du deinen Kommentar als Antwort posten, damit ich deinen überprüfen kann? – ravelinx
Warum hast du 'pop eax; Wiederherstellung eax'? Sicherlich ist es nur, um den Stack neu zu balancieren, da die nächste Iteration es nicht liest, bevor es durch den Aufruf von "get5bitsFunc" verfälscht wird. Also ist die Anweisung richtig, aber der Kommentar ist total falsch/irreführend. In ähnlicher Weise sind die POPs nach diesem Aufruf super-komisch (und Pop in den Speicher ist langsamer als benötigt). Außerdem scheint EDI von nichts gelesen zu werden, das ist seltsam. Ich nehme an, Sie haben das von dem, was Ihr echter Code ist, abgeschnitten. Wenn Sie dies in Inline-Asm für Leistung schreiben, tun Sie wahrscheinlich schlechter als ein optimierender Compiler ... –