在 V8 源代码中使用 arm 程序集遍历字符串
Traversing a string using arm assembly inside V8 source
我正在尝试在 RegExpExecStub::Generate
函数中为 arm/code-stubs-arm.cc
中的正则表达式实现快速路径。主题字符串存储在寄存器 'r4' 中。我需要在字符串中逐个字符地遍历,但我似乎做不到。我尝试过类似的东西:
__ ldrb( r3, MemOperand(r4,0));
//to get to 0th char and store it to r3
或者:
__ ldrb( r3, MemOperand(r4,String::kLengthOffset));
//to do the same thing as above in case the data begins after length field.
我正在使用 d8 shell 检查寄存器的值,方法是在上述语句后停在断点处并执行 print r3
检查字符是否已加载。但是,当我尝试上述语句时,我在寄存器中看到了随机值。理想情况下,我应该看到十六进制形式的字符。
原来正确的偏移量应该是 String::kSize-1 等等。
__ ldrb( r3, MemOperand(r4,String::kSize-1)); //to get 0th character
__ ldrb( r3, MemOperand(r4,String::kSize)); //to get 1st character
__ ldrb( r3, MemOperand(r4,String::kSize+1)); //to get 2nd character`
我正在尝试在 RegExpExecStub::Generate
函数中为 arm/code-stubs-arm.cc
中的正则表达式实现快速路径。主题字符串存储在寄存器 'r4' 中。我需要在字符串中逐个字符地遍历,但我似乎做不到。我尝试过类似的东西:
__ ldrb( r3, MemOperand(r4,0));
//to get to 0th char and store it to r3
或者:
__ ldrb( r3, MemOperand(r4,String::kLengthOffset));
//to do the same thing as above in case the data begins after length field.
我正在使用 d8 shell 检查寄存器的值,方法是在上述语句后停在断点处并执行 print r3
检查字符是否已加载。但是,当我尝试上述语句时,我在寄存器中看到了随机值。理想情况下,我应该看到十六进制形式的字符。
原来正确的偏移量应该是 String::kSize-1 等等。
__ ldrb( r3, MemOperand(r4,String::kSize-1)); //to get 0th character
__ ldrb( r3, MemOperand(r4,String::kSize)); //to get 1st character
__ ldrb( r3, MemOperand(r4,String::kSize+1)); //to get 2nd character`