NASM 64 位编程遵循字节顺序

Endianness followed in NASM 64 bit programming

我有两种情况:

我。

 arr dq 1234567887654321H

 mov rsi,arr 

 mov rbx,[rsi]

现在,我们知道 rsi 总是指向内存中的 1 个字节的位置,而 x86 遵循小端。 rsi 指向 21H 然后这个 21 进入 rbx 还是 arr 中的完整值被转移到 rbx?

二.

  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:

mov rbx,[rsi]

Nasm 根据左侧目标 r64 隐式解析右侧 ,[r64] 指向的内存大小。因此 rsi 是指向 64 位 [rsi] 值的 64 位地址,该值将被移动到 64 位 rbx 寄存器。
这可以在 Nasm 中明确说明为

mov rbx,qword [rsi]

隐含问题中的陈述 "rsi always points to 1 byte of location in memory" 不正确。对于以下指令有效

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