Assembly 程序集注册表中的mov 32字节到8字节

Assembly 程序集注册表中的mov 32字节到8字节,assembly,x86,mov,Assembly,X86,Mov,让我们将值设置为如下所示: Address contents 00000000 00 11 22 23 44 65 86 77 00000008 18 29 6A 4B 1C 0D 0E 0F ESI=32604F35AF EBX=0 现在,我们得到了这个mov命令: mov bl[esi] 现在,我的问题是,会发生什么,因为我使用了32字节,并将其放在8字节上。 bl的值是多少?为什么?mov bl,[esi]不会尝试将esi的32位推入bl。相反,它会将esi中的地址所在的内存字节

让我们将值设置为如下所示:

Address   contents
00000000  00 11 22 23 44 65 86 77
00000008  18 29 6A 4B 1C 0D 0E 0F
ESI=32604F35AF EBX=0

现在,我们得到了这个mov命令: mov bl[esi]

现在,我的问题是,会发生什么,因为我使用了32字节,并将其放在8字节上。 bl的值是多少?为什么?

mov bl,[esi]不会尝试将esi的32位推入bl。相反,它会将esi中的地址所在的内存字节读入bl

例如

如果内存如下所示:

Address   contents
00000000  00 11 22 23 44 65 86 77
00000008  18 29 6A 4B 1C 0D 0E 0F
esi包含00000007,则bl将用该地址的字节填充。在这种情况下是77

如果您想将esi加载到bl中,您必须间接地这样做

mov ebx,esi       
and ebx,$000000FF     //discard upper 24 bits

在x86中使用方括号[]时,它表示内存访问,使用lea时除外。lea只是进行计算。

你怎么想,为什么?提示:它不会是32604F35AF,因为它不适合。我知道,那么答案是什么,为什么?esi是32位。这是4个字节。注意i对y。位仅为0或1,单电池是否有电流。字节是由8位组成的一组。mov bl,[esi]从内存中加载8位1字节,esi中的值被间接使用,作为地址值发送到内存芯片,从中读取8位。要将esi的值直接移动到bl中,您必须执行mov ebx,esi no[],这也将设置ebx的剩余高24位,不仅是bl,而且bl将是0xAF,即esi的低8位部分。寄存器位物理上在CPU中。bl的值是什么?很难说,因为您没有显示内存的内容,您还必须为esi提供有效的示例值,仅32位宽,而不是您文章中的40位。您可以很容易地从十六进制格式中读取单个位,每个十六进制数字是4位:0=0000,1=0001,2=0010。。。E=1110,F=1111。那么2个十六进制数字是8位=1字节。这就是为什么十六进制格式在调试器中是首选的默认格式,所以程序员可以很容易地检查特定的字节/位,即使是更长的值。