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
我有两种情况:
我。
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