Comments 14
Операция mul является самой старой и примитивной: она умножает значение в текущем регистре на значение, которое было в предыдущем регистре. То есть, если вы пишете:
mov eax, 4
mov ecx, 3
mul eaxТо команда берет значение eax, умножает его на значение в предыдущей строке ecx и сохраняет туда же, в eax
MUL не так работает.
Нет, все так. Только в команде mul опечатка, не eax (что бессмысленно), а ecx.
это не опечатка, там же формулировка изначально неверная: "она умножает значение в текущем регистре на значение, которое было в предыдущем регистре".
mul всегда умножает сожержимое AL/AX/EAX на любой регистр указанный как операнд. Никаких "предыдущих регистров".
Учитывая фигню написанную и про трехоперандный imul, я почти уверен, что это писала нейросетка. ЧатЖПТ часто так тупит. Алсо, статья озаглавлена как методичка по asm x86-32, но почему-то упоминаются 64-разрядные регистры.
Дальше я просто проверять не стал, уверен, там и в остальном полно нейро-галлюцинаций.
ЗЫ: к слову "mul eax" не бессмысленно, просто на выходе в EAX будет возведенное в квадрат число, в данном случае будет 16. А еще это обнулит EDX.
64-разрядные регистры упоминаются только в самом начале во введении, и там же я написал почему я про них упомянул. Содержание статьи же полностью соответствует названию - речь идет только про 32-разрядные или ниже.
Про умножение тоже поправил, спасибо за замечание
Пример использования IMUL с тремя операндами:
mov eax, 0xFAFe
mov ebx, 3
imul edx, eax, ebx
Так сделать нельзя. Третий операнд imul может быть только константой.
Вы нейросетку штоле попросили сгенерировать вам методичку?
Я не использовал нейросеть при написании этой методички вовсе
Я проверил ваше утверждение, вы правы, исправлю
Хотя тот онлайн-эмулятор, который я использовал для проверки, допускал компиляцию такой программы, поэтому я не озаботился факт-чекингом - по логике же ведь должно работать)
изучать x86 ассемблер с помощью онлайн-компилятора какого-то, это крайне сомнительное решение. Лучше бы просто скачали DOSbox и любой ассемблер для DOS (TASM, YASM, NASM) . Так проще всего, имхо.
Если знаете Си, то можно на встроенном ассемблере упражнятся.
А еще лучше поразвлекаться сайзкодингом. Это прокачивает знание ассемблера, особенностей архитектуры и кодерскую смекалку, при этом это не скучно и есть определенная тусовка, где можно общаться, задавать вопросы, показывать свои достижения :)
ЗЫ: еще у вас ссылки в оглавлении не работают
Да сейчас такая методичка слегка устарела:
vector_loop:
vmovdqu32 zmm1, zmmword ptr [rsi]
add rsi, 64
kxnorw k1, k1, k1
vgatherdps zmm2 {k1}, [rbx + 4 * zmm1]
vcmpltps k1, zmm2, zmm30 {sae}
vpcompressd [rdi] {k1}, zmm1
kmovw edx, k1
popcnt edx, edx
lea rax, [rax + 4 * rdx - 64]
lea rdi, [rdi + 4 * rdx]
knotw k1, k1
vpcompressd [rax] {k1}, zmm1
sub rcx, 16
jnb vector_loop
Просто для меня наилучшим способом научится и разобраться является «составление учебника» для самого себя.
Ваша статья слегка выиграла бы, если бы продемонстрировала решение какой-нибудь нетривиальной задачи. Заодно и картинки бы показали для разнообразия. Например, в моей статье: «IdaPro v.6.1 demo: Серьезное испытание» ( https://erfaren.narod.ru/Asm/Erfaren005.htm ), я дизассемблировал и перекомпилировал полученный код заново для бинарников: «explorer.exe» и «comctl32.dll» из Windows XP, sp3.
Вот результаты работы перекомпилированных модулей:


Ну а сам ассемблер осваивался по ходу, на базе реального дизассемблированного листинга.
Вообще, это общий принцип, вместо скучного штудирования учебника, например грамматики французского языка, от русскоязычных авторов, лучше попытаться сделать самому его двуязычный аналог для оригинального учебника на французском языке, от франкоговорящих авторов:


Т.е., то, что сами создаете в результате обучения – запоминается лучше, чем при пассивном чтении.
mov ebx, 0x00000005
not ebx ; получили отрицательное число
not ebx ; инвертировали его обратно
inc ebx ; получили число, к которому можем мысленно подставить знак–.Но погодите! Мы получили при таком инвертировании –6, а не –5, как ожидалось! Почему же так?
Потому что существует инструкция NEG, для изменения знака числа.
А NOT просто инвертирует биты.
Перевод чисел между системами: Конвертер числовых систем
Чем обычный калькулятор в Windows не угодил?
вот такой таблички не хватает только по всем командам.

Методичка которую я формировал для себя, когда учил ассемблер x86-32. Ч.1