在NASM 64位编程中遵循Endianness

时间:2018-04-14 07:16:11

标签: nasm x86-64

我有两种情况:

予。

 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字节位置)?

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