У каждой секции в таблице описания указан её RVA (относительный виртуальный адрес). Вычитаешь его из адреса в памяти - получаешь физическое смещение от начала этой секции в файле.
А значение счётчика за вас кто сохранять будет?
Да и в любом случае, прежде чем задавать хоть какие-то вопросы вида "почему не работает" надо открывать самому отладчик и дебажить, отвечая на свой вопрос.
Так то это в документации на процессор указывается, какие машинные инструкции обрабатываются и что они значат. Никакой логики, просто таблица соответствий одного в другое.
Пишут вирус не под процессор, а под операционную систему, в большинстве своём даже под конкретную версию.
На ассемблере не гораздо быстрее работает, а гораздо дольше пишется.
Вам как раз и нужны условные переходы в зависимости от битов в регистре флагов.
И команды так и называются JNE - Jump Not Equal - осуществить переход если не равно (если флаг нуля не установлен). А перед прыжком стоит проверка типа CMP AX, 27h которая и установит флаги.
Есть условно массив (память) из 3 элементов [100, 200, 300]
SI = 1 MOV AX, SI - присвоить значение - AX = SI = 1 MOV AX, [SI] - присвоить значение из памяти AX = [SI] = [1] = 200
Тут нет волшебных printf()
1) Преобразовываете числовое значение в текст. Вы же для этого решили изучить АСМ, чтобы поразмять мозги.
2) Клеите какой-то зарание подготовленный текст с текстом из предыдущего в новом буфере, если конечно необходимо.
3) Вызываете системный вызов для отображение подготовленного буфера с текстом на экран.