assembly - 如何使用重复的字节值填充 64 位寄存器

标签 assembly x86 64-bit masm

我正在使用 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/

相关文章:

linux - 组装中的强项

c++ - 如何返回复杂的返回值?

c - 为什么 pushl %ebp 和 movl %esp, %ebp 在每个 ASM 函数的开头?

macos - 如何在 Mac 上运行汇编程序?

c++ - 关于在 Windows 7 下工作的 Turbo C

javascript - Javascript 对 64 位浮点的 native 支持

c - 使用 SIGILL 与 CPU 探测的 AVX 特征检测

assembly - 如何在汇编中保存esi或edi

linux - 如何在 Linux 的 nasm x86 程序集中复制数组,移植 16 位 DOS 代码?

visual-studio - 在 VS 2008 中编译 Qt 应用程序时 64 位 Win 7 中的 "cannot open input file odbc32.lib"错误