C 内联汇编试图将STD :: String的字符复制到寄存器中

C++ inline assembly trying to copy a char from a std::string into a register

本文关键字:String 字符 寄存器 复制 STD 汇编      更新时间:2023-10-16

我在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('à'(。

ystd::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放在循环的底部。