我有两种情况:
予。
arr dq 1234567887654321H
mov rsi,arr
mov rbx,[rsi]
现在,我们知道rsi总是指向内存中1个字节的位置,而x86则遵循little-endian。 rsi是否指向21H,然后这个21进入rbx或者arr中的完整值被转移到rbx?
II。
tempbuff resb 16
arr resb 1234567887654321H
mov rbx,qword[arr]
mov rsi,tempbuff
mov [rsi],rbx
以上陈述来自不同部分,并在此合并,以便集中注意重要细节。
现在,从上面的陈述中,rbx存储了arr。
的全部内容rsi指向tempbuff的第一个内存位置。然后是mov [rsi],rbx 将rbx的全部内容存储到tempbuff中或者它是否只将rbx的最低1字节(此处为21)存储到rsi指向的位置(1字节位置)?
答案 0 :(得分:0)
案例 1 :
mov rbx,[rsi]
Nasm
根据左侧目标,[r64]
隐式解析右侧r64
指向的内存大小。因此rsi
是64位地址,指向64位[rsi]
值,该值将移至64位rbx
寄存器。
这可以在Nasm
中明确说明为
mov rbx,qword [rsi]
它暗示了问题中的陈述 “rsi始终指向内存中1个字节的位置” 不正确。以下指令将有效:
mov rbx,byte [rsi]
第一个遇到的64位rsi
地址指向的字节将成为rbx
最低有效字节。
案例 2 :
mov [rsi],rbx
整个64位rbx
值被移动到64位rsi
地址指向的内存中。
从聊天讨论中我可以得出结论OP真正的疑问是关于影响寄存器和内存的小端点。
exampleQuadWord dq 0102030405060708H ; this is represented in memory as 0807060504030201
exampleQWordWithByte dq 1 ; this is represented in memory as 0100000000000000
在一个简单的例子中
mov rbx,2
mov rsi, exampleQWordWithByte
mov [rsi],rbx
; exampleQWordWithByte in memory is now 0200000000000000