Регистры, shl и двоичные файлы в сборке

#assembly #x86 #cpu-registers

#сборка #x86 #cpu-регистры

Вопрос:

Я надеюсь, что кто-нибудь сможет помочь мне разобраться в части кода, которая у меня есть, поскольку я нахожу это трудным. Язык ассемблера для меня новый, и я читал книгу «Практический анализ вредоносных программ», и мне трудно ее полностью понять. Это то, что я понимаю из приведенного ниже кода:

13 добавляется в var_C, который хранится в памяти. сверху добавляется 10. 13 10 = 23 в двоичном формате, что равно 0001 0111. Мы сдвигаем влево на 1, что дает нам: 0010 1110 (46 в десятичной системе счисления). Последние две строки над условным переходом меня смущают. И я не совсем уверен, что я прошел через это правильно. Но я могу подтвердить, что 46 был ответом, который я искал. Однако кто-нибудь может подтвердить, были ли мои методы правильными? А как насчет последних двух строк над условным переходом? Любая помощь приветствуется

 lea eax, [ebp var_18]
mov [esp], eax
....
....
mov [ebp var_C], 13
add [ebp var_C], 10
shl [ebp var_C], 1
mov eax, [ebp var_18]
cmp eax, [ebp var_C]
jnz short loc_4015F7
  

Комментарии:

1. Просто примечание: var_C установлено значение 13, не добавлено в.

2. @atomsymbol Это исправляет мою ошибку. Может быть, вы сможете ответить на это. Почему у нас есть ebp перед var_C?

3. Потому что это локальная переменная, адресуемая относительно ebp , которая предположительно настроена как указатель фрейма ранее в коде, не показанном.

4. Последние две строки не имеют ничего общего с shl . Они представляют собой сравнение и условный переход.

5. mov Инструкция объясняется на странице 73. «Формат такой mov destination, source . Операнды, заключенные в квадратные скобки, рассматриваются как ссылки на данные в памяти «. Однако обратите внимание, что глава 4 называется «ускоренный курс», поэтому в книге в основном предполагается, что вы знакомы с языком ассемблера x86. Ожидается, что вы дополните информацию о книге внешней ссылкой.