如何在c ++ visual中为我需要使用内联汇编设置标签,所以它看起来就像这样......例如...
__asm
{
PUSH EAX
PUSH VAR1
MOV ECX,DWORD PTR DS:[VAR2]
CALL DWORD PTR DS:[VAR3]
JMP VAR4
}
VAR
个可变数据链接到值或地址?
我试过以下
DWORD VAR2 = 0x991770; //0x991770 is the location of the function
__asm
{
..code
MOV ECX,DWORD PTR DS:[VAR2]
..code
}
然后应用程序崩溃,这是怎么做到的?
答案 0 :(得分:1)
使用offset variableName
从内联汇编中访问变量。请参阅参考here。
示例:
char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
int main( void )
{
__asm
{
mov eax, offset world
push eax
mov eax, offset hello
push eax
mov eax, offset format
push eax
call printf
//clean up the stack so that main can exit cleanly
//use the unused register ebx to do the cleanup
pop ebx
pop ebx
pop ebx
}
}
答案 1 :(得分:0)
C变量名在内联汇编中可见。因此,如果您需要数据访问,只需编写var名称:
int var2 = 3;
__asm
{
mov ecx, var2
这将编译为适当的内存访问语句。
对于代码标签 - 您只需声明它们,就像在实际汇编中一样:
Label1:
mov ecx, 0
jmp Label1
外部功能也被视为标签。但是,名称修改适用。
如果您需要将当前IP的数值作为通用寄存器,则没有直接命令,但可以使用非常简单的解决方法:
call Next
Next:
pop eax ; eax now is the value of IP at the current point
哦,忘了ds:
的东西。你现在在Flatland - 检查门口的段寄存器。