【发布时间】: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 的一个字节。我希望上述逻辑在这种情况下不成立。