我无法使用 x86 程序集将数组的元素存储到寄存器中

I am not able to store an element of an array into a register using x86 assembly

以下是我的汇编代码:

    mov esi, MemberLvl
    mov edi, OfficerLst

    mov al, [esi]
    mov test1, al
    mov ah, [edi]
    mov test2, ah

在 C++ 主程序中,我声明了一个名为 MemberLvlOfficerLst 的 long 类型列表,以及两个 long 类型 - test1test2.

每当我尝试 运行 我的代码时,它总是说 mov test1, almov test2, ah.

存在操作数大小冲突

我的想法是每个数组都存储在esiedi中。然后我通过获取它们的第一个内存地址将第一个元素存储到 alah 中。因为每个 long 是 8 个字节,而 alah 寄存器是 8 个字节,我认为它可以将其存储到 test1test2(它们都声明为 long,8 字节),但事实并非如此。我不确定为什么会这样。

alah8 位 值(1 字节)。根据您的说法,test1test2 是“长”,它是 32 位(4 字节)或 64 位(8 字节),具体取决于您的编译器/系统。

如果要将值存储在各个变量中,可以使用 movzx(如果无符号)或 movsx(如果有符号)。


此外,请注意,如果 MemberLvllong,则将其移动到 esi,然后执行 [esi] 可能是未定义的行为,除非 MemberLvl 碰巧包含一个有效的指针地址。如果 MemberLvllong *,那么它可能没问题,但是 [esi] 是 32 位或 64 位值,因此您不应该使用 alah 完全没有。