我无法使用 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++ 主程序中,我声明了一个名为 MemberLvl 和 OfficerLst 的 long 类型列表,以及两个 long 类型 - test1 和 test2.
每当我尝试 运行 我的代码时,它总是说 mov test1, al
和 mov test2, ah
.
存在操作数大小冲突
我的想法是每个数组都存储在esi
和edi
中。然后我通过获取它们的第一个内存地址将第一个元素存储到 al
或 ah
中。因为每个 long 是 8 个字节,而 al
或 ah
寄存器是 8 个字节,我认为它可以将其存储到 test1 和 test2(它们都声明为 long,8 字节),但事实并非如此。我不确定为什么会这样。
al
和 ah
是 8 位 值(1 字节)。根据您的说法,test1
和 test2
是“长”,它是 32 位(4 字节)或 64 位(8 字节),具体取决于您的编译器/系统。
如果要将值存储在各个变量中,可以使用 movzx
(如果无符号)或 movsx
(如果有符号)。
此外,请注意,如果 MemberLvl
是 long
,则将其移动到 esi
,然后执行 [esi]
可能是未定义的行为,除非 MemberLvl
碰巧包含一个有效的指针地址。如果 MemberLvl
是 long *
,那么它可能没问题,但是 [esi]
是 32 位或 64 位值,因此您不应该使用 al
或 ah
完全没有。
以下是我的汇编代码:
mov esi, MemberLvl
mov edi, OfficerLst
mov al, [esi]
mov test1, al
mov ah, [edi]
mov test2, ah
在 C++ 主程序中,我声明了一个名为 MemberLvl 和 OfficerLst 的 long 类型列表,以及两个 long 类型 - test1 和 test2.
每当我尝试 运行 我的代码时,它总是说 mov test1, al
和 mov test2, ah
.
我的想法是每个数组都存储在esi
和edi
中。然后我通过获取它们的第一个内存地址将第一个元素存储到 al
或 ah
中。因为每个 long 是 8 个字节,而 al
或 ah
寄存器是 8 个字节,我认为它可以将其存储到 test1 和 test2(它们都声明为 long,8 字节),但事实并非如此。我不确定为什么会这样。
al
和 ah
是 8 位 值(1 字节)。根据您的说法,test1
和 test2
是“长”,它是 32 位(4 字节)或 64 位(8 字节),具体取决于您的编译器/系统。
如果要将值存储在各个变量中,可以使用 movzx
(如果无符号)或 movsx
(如果有符号)。
此外,请注意,如果 MemberLvl
是 long
,则将其移动到 esi
,然后执行 [esi]
可能是未定义的行为,除非 MemberLvl
碰巧包含一个有效的指针地址。如果 MemberLvl
是 long *
,那么它可能没问题,但是 [esi]
是 32 位或 64 位值,因此您不应该使用 al
或 ah
完全没有。