Rick York
Когда я не уверен в инструкциях ассемблерного кода, я пишу фрагмент кода на C или C++, а затем смотрю на список ассемблерного кода. Я сделал это вот с этим. Этот код имеет простую функцию и указатель на нее, который вызывается. Вот список ассемблерного кода :
?DoFunctionTest@@YAXXZ PROC ; DoFunctionTest
; 237 : {
$LN3:
push rdi
sub rsp, 64 ; 00000040H
mov rdi, rsp
mov ecx, 16
mov eax, -858993460 ; ccccccccH
rep stosd
; 238 : double x = 16.612;
movsd xmm0, QWORD PTR __real@40309cac083126e9
movsd QWORD PTR x$[rsp], xmm0
; 239 : dblfunc df = factor; // factor is the function, df is a pointer to it
lea rax, OFFSET FLAT:?fac@@YANN@Z ; fac
mov QWORD PTR df$[rsp], rax
; 240 : double result = ( *df )( x ); // call the function - deref the pointer
movsd xmm0, QWORD PTR x$[rsp]
call QWORD PTR df$[rsp] ; the actual function call is here
movsd QWORD PTR result$[rsp], xmm0
; 241 : trace( _T( "DoFunctionTest() - result is %.3f\n" ), result );
movsd xmm1, QWORD PTR result$[rsp]
movq rdx, xmm1
lea rcx, OFFSET FLAT:$SG255887
call ?trace@@YA_NPEB_WZZ ; trace
; 242 : }
Это был ассемблерный код в 64-битном режиме Debug Unicode для этого кода:
double fac( double x )
{
return 1.0 + x;
}
typedef double ( *dblfunc )( double x );
void DoFunctionTest()
{
double x = 16.612;
dblfunc df = fac;
double result = ( *df )( x );
trace( _T( "DoFunctionTest() - result is %.3f\n" ), result );
}