【问题标题】:what does mean instruction like mov byte ptr [rax + rdx-1], 00 with such offset where rax not pointer像 mov byte ptr [rax + rdx-1], 00 这样的指令是什么意思,其中 rax 不是指针
【发布时间】:2020-02-19 20:09:31
【问题描述】:

坚持学习汇编程序

mov byte ptr [rax+rdx-01],00

RAX=00000004
RDX=2295EA3B878

mov [r10+rsi],al

RAX=0000000000000065
RSI=000002295EA3B878
R10=0000000000000000

movalbyte ptr 很清楚。但我不明白 [rax+rdx-01][r10+rsi] 是什么意思,其中 rax 和 r10 不是指针。

在大多数情况下,我遇到[RAX+C1],其中 rax 是指针,C1 是偏移量,但我不知道当寄存器存储一些值而不是指针时是什么意思

【问题讨论】:

  • rax 可能不是指针,但rdx 可能是。
  • byte ptr 表示形成了一个地址,因为无法推断0 的大小,所以需要它。在[r10+rsi] 中,rsi 几乎肯定是一个指针。
  • Raymond 你的意思是它类似于 [rsi+0] 偏移量还是什么?
  • 是的,这就是英特尔语法使用+ 来表示寄存器和常量位移的原因,当然。英特尔的手册记录了寻址模式;您可以咨询他们或谷歌了解您想知道的任何细节。
  • 所以,如果我理解正确的话,对于 r10 !=0 的情况,序列 [pointer+offset] 或 [offset+pointer] 和 0 偏移都没有关系?

标签: assembly x86-64 offset cpu-registers addressing-mode


【解决方案1】:

您可能想了解x86 addressing modes

[rax+rdx-01] 指的是通过将raxrdx 相加并减1 计算的地址。如果rax, rdx 之一是指向数组的指针(“基地址”),则通常使用此地址,并且other 是该数组的索引。所以这可能是由C代码生成的,例如

char *array = ...;
size_t i = ...;
// ...
array[i-1] = 0;

其中array 的值存储在rax 中,而i 存储在rdx 中,反之亦然。你在这里说rax不是指针,但也许rdx是。

同样,mov [r10+rsi], al 可以对应

char *array = ...;
size_t i = ...;
char c = ...;
// ...
array[i] = c;

r10=arrayrsi=i(反之亦然)和 al=c

【讨论】:

  • 在第一种情况下要明确 2295EA3B878+04-01 意味着我需要地址 2295EA3B87B?
  • @user199588:在我看来你得到了 2295EA3B87B,是的。
  • 你说where the value of array is stored in rax and i is in rdx, or vice versa. You say here that rax is not a pointer, but perhaps rdx is。我猜你的意思是 rdx 是数组,而 rax 是`i`?因为 rdx 是一个指针
  • 是的,您的示例似乎对应于具有rdx=arrayrax=i。我的观点是,如果您选择以其他方式使用寄存器,您也可以使用相同的指令。
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 2020-02-16
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2017-05-05
  • 2018-04-09
相关资源
最近更新 更多