我正在使用 Visual C++ 2010 和 masm(“快速调用”调用约定)进行一些 x64 程序集。
假设我在 C++ 中有一个函数:
extern "C" void fillArray(unsigned char* byteArray, unsigned char value);
指向数组的指针将在 RCX 中,而字符值将在 DL 中
我如何使用 DL 用值填充 RAX,以便如果我要
mov qword ptr [RCX], RAX
并打印byteArray,所有值都等于'char value'?请注意,我不是在尝试编写编译器的代码,我只是在学习。
最佳答案
您可以乘以 0x0101010101010101 将最低字节复制到所有其他字节中(假设其余字节一开始都是零),这有点烦人,因为没有 imul r64, r64, imm64
但你可以这样做:
mov rax, 0x0101010101010101
imul rax, rdx ; at least as fast as mul rdx on all CPUs
如
rdx
不是所需的形式(换句话说,如果它设置了一些额外的位),只需添加一个movzx eax, dl
在前面,并将常量移动到 RDX 或其他寄存器中。 ( movzx edx,dl
无法从 Intel CPU 上的移动消除中受益。)如果您不喜欢代码大小(
mov r64, imm64
本身已经是 10 个字节),只需将该常量保留在您的数据段中。
关于assembly - 如何使用重复的字节值填充 64 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27940150/