Member 14004556 Ответов: 1

На C++ в Visual студии встроенный ассемблер как я называю адрес


Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь сделать следующее в встроенном Asm

asd - это адрес

- позвони АСД"

При просмотре его в шестнадцатеричном редакторе он пишет "call dword ptr asd"

Я совсем запутался

Что я уже пробовал:

До сих пор я пытался использовать две вещи в встроенной сборке

"вызвать смещение АСД"

- позвони АСД"

Ни то, ни другое не работает, я что-то упускаю и не могу понять, как это сделать

1 Ответов

Рейтинг:
1

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 );
}