gpt4 book ai didi

c++ - 在汇编程序中访问 std::string (c++/asm/visual studio 2015)

转载 作者:行者123 更新时间:2023-11-28 00:12:29 25 4
gpt4 key购买 nike

请问如何获取单个字符并在asm中调用std::string的函数。

当我编译下面的代码时,我得到:



 *Error C2244 'std::basic_string
    
     ,std::allocator
     
      >::at':无法将函数定义与现有声明相匹配*
      

我的代码:



 int main()
{
std::string mystring("一些字符");
__asm
{
推 1
lea ecx,[我的字符串]
调用 std::string::at
}
返回 0;
}

最佳答案

来自 MSDN :

An __asm block can call only global C++ functions that are not overloaded. If you call an overloaded global C++ function or a C++ member function, the compiler issues an error.

你可以(如果你敢)但是做一个非常非常(不能强调这一点:非常)肮脏的黑客。在 this SO post,你可以看到一些方法和关注点——我在写下面的时候有点死了——获取你的成员函数的地址。

std::string mystring("Some characters");

std::string::const_reference(__thiscall std::string::*atFunc)(std::string::size_type) const = &std::string::at;
unsigned int atAddress = PtrToUlong((void*&)atFunc);
char output = 0;

__asm
{
mov eax, atAddress

push 5
lea ecx, [mystring]
call eax

mov al, [eax]
mov [output], al
}

std::cout << "Output is: " << output << std::endl;

如果我是一名主管,而我的一个程序员手下会在生产代码中这样做,我会用一条大臭鱼抽他/她一巴掌。使用风险自负。

更明智的解决方案是简单地放弃 __asm block 中的任何 std::string 用法:

std::string mystring("Some characters");
const char * cstr = mystring.c_str();
char output = 0;

__asm
{
mov eax, [cstr]
mov al, [eax+3]
mov [output],al
}

std::cout << "Output is: " << output << std::endl;

关于c++ - 在汇编程序中访问 std::string (c++/asm/visual studio 2015),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32278586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com