Chcę podnieść wyjątek w bloku ASM X64.Jak zgłosić wyjątek w bloku ASM?
Załóżmy Mam funkcję tak:
function Example(Values: array of integer): integer;
asm
or rcx,rcx
jz @error
....
wiem, że mogę po prostu czytać wskaźnika, a także uzyskać AV, jednak Chcę podnieść błąd bardziej opisową.
mogłem zrobić dodatkową funkcję i zadzwonić że jeden:
asm
or rcx,rcx
jz @error
....
@error:
mov ecx, 1
mov rdx, ErrorString
jmp RaiseError
....
function RaiseError(code: integer; const Msg: string);
begin
case code of
1: raise EEmptyArrayError.Create(Msg);
jednak błąd będzie występować wtedy poza funkcją, w której było spowodowane. Jak uzyskać wyjątek (wydaje się) pochodzić z wewnątrz funkcji Example
.
Należy pamiętać, że to jest X64, więc wszystkie odpowiedzi SEH które odnoszą się do X86 nie są dobre, bo X64 wykorzystuje poj.
Myślę, że nadal jest SEH na x64. Po prostu napisz trochę Pascala i zobacz, co kompilator wyemituje, aby to przetworzyć. –
Ponieważ nikt nie zapyta, jeśli kod jest na tyle wysoki, że chcesz, aby zgłaszał wyjątki, dlaczego najpierw piszesz je w zespole? – alcalde
Ponieważ potrzebuje instrukcji SSE, a ja nie mam wewnętrznej samoistności SSE. – Johan