2016-05-16 48 views

回答

2

正如评论者Michael和Ped7g所说,您已经使用了偏移量。让我解释一下:

x86以little-endian格式存储数字,这意味着最低位字节首先存储在内存中。一个小例子:假设你有值0x12345678eax,并执行这个指令:

mov [addr], eax 

...然后在地址addr内存将是这样的:

78 56 34 12 

在你的榜样,则在dx:ax中有一个值,该值是“在dx中具有值高16位并且其在ax中具有低16位”的简写。假设值,再次0x12345678,所以你必须在dx0x12340x5678ax,那么你就需要两个移动指令:

mov [addr], ax // Memory now looks like this: 78 56 
mov [addr+2], dx // Memory now looks like this: 78 56 34 12 

+2来自于一个事实,即ax是一个16位寄存器,即它存储在内存中时占用了两个字节,所以既然你想在它后面放置dx,你需要增加地址2

对于edxeax中的64位值具有相同的作用,偏移量为4。让我们假设你有eaxedx价值0x1234567890ABCDEF斯普利特0x123456780x90ABCDEF,那么它应该是这样的:

mov [addr], eax // Memory now looks like this: EF CD AB 90 
mov [addr+4], edx // Memory now looks like this: EF CD AB 90 78 56 34 12 
相关问题