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字节。这就是为什么十六进制格式在调试器中是首选的默认格式,所以程序员可以很容易地检查特定的字节/位,即使是更长的值。