что означает инструкция типа mov byte ptr [rax + rdx-1], 00 с таким смещением, где rax не указатель - PullRequest
0 голосов
/ 19 февраля 2020

Застрял с изучением ассемблера

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

RAX=00000004
RDX=2295EA3B878

и

mov [r10+rsi],al

RAX=0000000000000065
RSI=000002295EA3B878
R10=0000000000000000

Понятно про mov al byte ptr. Но я не понимаю, что означает [rax+rdx-01] и [r10+rsi], где rax и r10 не указатель.

В большинстве случаев я сталкивался с [RAX+C1], где rax - указатель, а C1 - смещение, но я понятия не имею какой смысл когда регистр хранит какое-то значение, а не указатель

1 Ответ

4 голосов
/ 19 февраля 2020

Возможно, вы захотите прочитать о режимах адресации x86 .

[rax+rdx-01] относится к адресу, вычисленному путем сложения rax и rdx и вычитания 1. Это обычно используется если один из rax, rdx является указателем на массив («базовый адрес»), а другой является индексом в этом массиве. Так что это может быть сгенерировано кодом 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=array и rsi=i (или наоборот) и al=c.

...