【问题标题】:Endianness followed in NASM 64 bit programmingNASM 64 位编程中遵循的字节序
【发布时间】:2018-04-14 07:16:11
【问题描述】:

我有两种情况:

我。

 arr dq 1234567887654321H

 mov rsi,arr 

 mov rbx,[rsi]

现在,我们知道 rsi 总是指向内存中的 1 字节位置,而 x86 遵循 little-endian。 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 字节位置)指向的位置?

【问题讨论】:

  • 你试过运行它吗?
  • mov rbx,[rsi] 将 64 位内容存储在 rbx 中,即使 rsi 指向 1 字节地址。我无法理解,为什么?
  • 因为rbx是一个64位寄存器。
  • Nasm 根据左侧目标(在您的情况下为 r64)隐式解析右侧 ,[r64] 指向的内存大小。所以你有一个 64 位地址指向一个 64 位值,该值将被移动到一个 64 位寄存器。您可以使用 ,byte [r64] ,word [r64] 等显式指定 rhs 指针内存大小。
  • @Kamil.S 所以,acc。根据您的解释,数据传输取决于 LHS 中存在的寄存器大小。而且,如果我指定 type_specifier[reg] 那么 type_specifier 大小的数据将移动到 destination (LHS) 。是现在吗?但是第二种情况呢?有多少 rbx 通过 [rsi] 进入 tempbuff,因为这里 rsi 也指向 tempbuff 的一个字节。我希望上述逻辑在这种情况下不成立。

标签: nasm x86-64


【解决方案1】:

对于案例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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2023-01-11
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多