C 内联汇编试图将STD :: String的字符复制到寄存器中
C++ inline assembly trying to copy a char from a std::string into a register
我在C 中有一个分配,将文件读取到包含数字(无空格(的字符串变量中,并且使用内联汇编,该程序需要总结字符串的数字。为此,我想循环直到字符串结束(null(和每个迭代复制1个字符(1位数字(中的寄存器中,以便我可以使用比较和减去。问题是,每次而不是将字符复制到寄存器上,都会复制一些随机值。
我正在使用Visual Studio进行调试。变量 y 是字符串,我正在尝试将循环的每一个迭代复制到当前字符中的每一个迭代中寄存器
// read from txt file
string y;
cout << "n" << "the text is n";
ifstream infile;
infile.open("1.txt");
getline(infile, y);
cout << y;
infile.close();
// inline assembly
_asm
{
mov edx, 0 // counter
mov ebx, 0
mov eax, 0
loop1:
movzx AL, y[ebx]
cmp AL, 0x00
jz finished
sub AL, 48 // convert ascii to number, assuming digit
add edx, eax // add digit to counter
add ebx, 1 // move pointer to the next byte
loop loop1
finished:
mov i, edx
}
例如,假设 y 是" 123"这是循环的第一次迭代,EBX为0。我希望y[ebx]
指向值49('1'(,实际上在调试中,我看到y[ebx]
的值为49.我想将上述该值复制到寄存器中,所以当我使用指令时:
movzx al,y [ebx]
我希望寄存器Al将更改为49('1'(,但该值改为随机变化。例如,上次调试会话更改为192('à'(。
y
是std::string
对象的控制块。您要访问其C字符串数据。
MSVC内联ASM语法非常糟糕,因此无法在寄存器中要求指针。我认为您必须创建一个新的C 变量,例如char *ystr = y.c_str();
c变量是指针,您需要将其加载到mov ecx, [ystr]
注册中。直接访问ystr
的对象代理的字节将为您提供指针的字节。
另外,您当前的代码正在使用loop
指令,该指令慢,相当于dec ecx/jnz
。但是您没有初始化ECX,并且循环终止条件基于零终结器,而不是您在第一次迭代之前知道的计数器。(除非您还向std::string
询问其长度(。
在此处使用loop
指令的理由为零。像普通人一样将test al,al / jnz loop1
放在循环的底部。
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- "std::string"是否将其字符作为签名字符在内部存储?
- 无法<string>从"常量字符 []"转换为<类名>
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- C++ 从 std::string 中删除所有非数字字符
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 将单个字符转换为 std::string 前缀 \x01
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 将 std::string 转换为具有特殊字符的 FString (TCHAR / wstring)
- 如何互换使用字符* 和 std::string?
- 从 std::string 中删除特定的连续字符重复
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 将空填充但不以空结尾的固定长度字符数组转换为 std::string 的最佳方法
- 如何在矢量"[i]"中插入*字符<string>?[C++]
- Qt UTF-8 文件到 std::string 添加额外的字符
- C++String.h字符表截断不带strstr的单词
- 如何在不复制和保留 std::string 对象的情况下获得 C++ std::string 字符数据的所有权
- 如何将列表转换为<string>字符**?