Задать вопрос
Ответы пользователя по тегу Assembler
  • Разбираюсь с умножением в ассемблере, почему так работает, а так нет?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    программа ломается во время выполнения

    Как ломается-то?

    use32
    mov ax,3h
    mov bx,4h
    mul bx

    должно записать 12 в ax и 0 в dx и очистить флаги OF и CF. Что записывает?
    Ответ написан
    Комментировать
  • Может ли процессор изменять порядок инструкций в программе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Насчет компиляторов поверю, но вот процессора ??? как ???

    Читать тут, лучше сразу английскую версию.
    Ответ написан
    Комментировать
  • Сегментация в long mode?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Русским и английским языком написано. Сегментные регистры в x64 кроме GS и FS не используются и принудительно устанавливаются в 0.

    Это какая-то неоднозначная и неточная цитата. Вот что пишет Intel Software Developer Manual 3.7.4.1 "Segmentat...:
    In 64-bit mode, segmentation is generally (but not completely) disabled, creating a flat 64-bit linear-address space. The processor treats the segment base of CS, DS, ES, SS as zero, creating a linear address that is equal to the effective address. The exceptions are the FS and GS segments, whose segment registers (which hold the segment base) can be used as additional base registers in some linear address calculations.

    Т.е. базовый адрес сегментов к которым осуществляется доступ через cs/ds/es/ss нулевой, но не сами значения селекторов. Базовый адрес, напомню, это поле в записях GDT/LDT. Селектор же (значение в сегментном регистре) выбирает запрашиваемые привилегии (младшие два бита), тип таблицы (GDT/LDT, третий с конца бит) и номер записи в таблице (все остальные биты).

    Согласись же, это совсем не то, что ты ожидал?

    Глядя на твою картинку можно сказать, что выполняется код из сегментв в шестой записи в GDT с привилегиями третьего кольца защиты, а доступ к данным через ds/es/ss/gs осуществляется через сегмент в пятой записи в GDT с привилегиями третьего кольца.
    Ответ написан
    Комментировать
  • Assembler WriteConsole не выводит текст?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    WriteConsole не выводит текст

    А что возвращает? А GetLastError какой? А что в буфере buffer и в eax перед вызовом WriteConsole?
    Ответ написан
    1 комментарий
  • Assembler WinAPI сокеты, Accept не ждет подключения?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    invoke accept,[socket_server],addr_client,sizeof.sockaddr_in

    accept последним параметром ожидает указатель на размер, а не сам размер.
    Ответ написан
    1 комментарий
  • Поиск статического адреса для записи значения в память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov [esi + 000001cc], ecx
    Объясните пожалуйста что из этого всего на скриншотах база, смещение я так понимаю (01CC) но смещение относительно чего?


    относительно регистра esi, в котором сейчас 06201d38. Вид адресации использованный инструкцией mov -- косвенный, с базой и смещением. База -- в регистре, смещение -- в инструкции.
    Ответ написан
    Комментировать
  • Почему ассемблерный код (GNU assembler) компилируется на одной машине, но не компилируется на другой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $ gcc -fPIC -o a.out ./1_1.s
    Параметр -fPIC не помогает

    DVoropaev у тебя уже был такой вопрос, ответ с тех пор не изменился: -fPIC изменяет ассемблерный вывод компилятора, на готовый ассемблерный файл этот ключ никак не влияет.

    movl $.hello_str, %edi

    Этот код -- 32-битный, компилируй его с ключом -m32.
    Ответ написан
    Комментировать
  • Почему не компилируется код на ассемблере в gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    перекомпилируйте с параметром -fPIC
    gcc -fPIC ./hello.s

    "перекомпилируйте" в данном контексте означает "сгенерируйте другой ассемблерный код".

    Код программы выглядит так:

    Ну это же явно 32-битный код, компилируй его под 32 бита:
    gcc -m32 hello.s -o hello
    Ответ написан
    3 комментария
  • Как работает страничная организация память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1) Первая страница памяти отвечает за обращение к первой странице памяти вторая ко второй и так далее?

    Вопрос непонятен.

    2) Связка виртуального и физического адреса позволяет создать что-то по типу перенаправления?

    Она позволяет создать несколько независимых адресных пространств, в каждом из которых сопоставить любой виртуальной странице любую физическую, или сделать так, что при обращении к виртуальной странице произойдёт исключение.

    3) Работает ли обратная связь когда если пишу в виртуальную страницу идет перенаправление на физическую?

    Да.

    4) Для работоспособности в данном режиме надо создаться страницы в диапазоне которых лежии код программы?

    Как минимум исполняющийся в настоящий момент код.

    5) Страничная организация памяти работает паралельно с адресацией по дискриптору или это замена?

    Работает параллельно. Т.е. адрес вида сегмент:смещение сначала преобразуется в линейный адрес, который потом транслируется в физический адрес.
    Ответ написан
    3 комментария
  • В чём различие между FASM и FASM G?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    https://flatassembler.net/docs.php?article=fasmg говорит нам:
    What is flat assembler g?
    It is an assembly engine designed as a successor of the one used in flat assembler 1, one of the recognized assemblers for x86 processors. This is a bare engine that by itself has no ability to recognize and encode instructions of any processor, however it has an ability to become an assembler for any CPU architecture. It has a macroinstruction language that is substantially improved compared to the one provided by flat assembler 1 and it allows to easily implement instruction encoders in form of customizable macroinstructions. This approach has a great flexibility at the cost of performance.

    Т.е. fasm g -- это ассемблерный движок, нацеленный на то, чтобы стать ассемблером для любой архитектуры за счёт использования встроенного языка обработки макросов.
    Т.е. как будто бы ответы на твои вопросы -- "не зависит", "отдельный", "предназначен для того же и большего".
    Ответ написан
    Комментировать
  • Как низкоуровневый код использующий стек узнает откуда он начинается?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если взять за основу эту схему, то становится понятно, как код процесса может узнать адреса текста, инициализированных данных, неинициализированных данных

    Если мы говорим про обычные (не PIE) исполняемые ELF-файлы, то они слинкованы под конкретный адрес куда они будут загружены, и все адреса внутри одного исполняемого файла посчитаны заранее. Поэтому загрузка адреса функции или пременной в секции данных -- это просто загрузка константы в регистр.

    и кучи

    С кучей всё по-другому, потому что куча и объекты в ней полностью динамические. Выделение памяти для кучи -- это всегда системный вызов, который возвращает адрес выделенной памяти (и sbrk, и mmap).

    не ясно, как становится известен адрес стека и аргументов командной строки

    они инициализируются ядром ОС, согласно ABI, см. например, ABI x86_64, раздел 3.4.1.
    Ответ написан
    Комментировать
  • Как перевести этот код с C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как перевести этот код с C++?

    И, главное, зачем? И чем для этой цели не подошёл компилятор С++?

    mov ebx, [ebp - 8]

    Нифига не mov, должно быть lea ebx, [ebp - 8]

    lea edx, [ebx + ecx + 4] ; add FirstThunk RVA to base. Offset &function is 4

    Нифига +4 не нужно. Смещение &function == 0.

    lea edx, [edx + 20] ;size of IMAGE_THUNK_DATA

    Нифига не +20, размер этой структуры -- 4.
    Ответ написан
    3 комментария
  • Что можно улучшить в этой функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    можно ли ее как-то улучшить

    Зависит от того, что считать улучшением.
    По размеру кода -- вряд ли можно улучшить существенно.
    По скорости -- можно, если загружать данные из памяти выравненными словами и раскрутить цикл.
    По простоте -- можно существенно улучшить, переписав её на С или вообще воспользовавшись готовой реализацией.
    Ответ написан
    1 комментарий
  • Почему не срабатывает шеллкод?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при компиляции флаг из реестра не удаляется. В чем может быть проблема?

    В том, что ты засунул бинарный код в параметр функции, в котором должна быть строка с именем программы для запуска и её параметрами. Непонятно, почему ты ожидаешь, что WinExec бросится выполнять машинный код в этой строке. WinExec имеет код возврата, который недвусмысленно тебе сказал бы в чём ошибка (путь или файл для запуска не найдены), если бы ты его проверил.
    И, кстати, байт с кодом 0 по смещению 0x246 -- это тоже часть шелл-кода, терминатор командной строки.

    Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?

    Это заголовок файла формата PE. Да, его туда записал линкер. Нет, это не информация линкера, это информация в основном для загрузчика ОС, а так же для дизассемблера и прочих binutils.
    Ответ написан
    1 комментарий
  • Корректный ли ассемблерный код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите пж, в чем может быть проблема?

    Скорее всего в том, что ты не умеешь пользоваться отладчиком.

    Вообще код выглядит нормально. Предлагаю написать в консоли REG DELETE HKCU\keys /v key и убедиться, что желаемое действие происходит (я так понимаю, что keys и key -- это затычки, в реальном коде указаны конкретный путь в реестре и конкретное имя значения).

    Для разнообразия можно убрать xor eax, eax после возврата из WinExec, чтобы результат пришёл в ExitProcess -- и посмотреть на код завершения процесса.
    Ответ написан
    2 комментария
  • Как "склеить" строку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сделать так, чтобы эти 2 строки считались за одну?

    Считались за одну -- шли в памяти подряд без разделителей между ними?
    msg db "hello " 
        db "world"
    Ответ написан
    Комментировать
  • Почему не соединиться с сервером?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я смотрю сюда, и сдаётся мне, что начало инициализации sockaddr_in в твоём коде должна выглядеть так:

    mov byte [sockaddr_in + 0], AF_INET ; sin_family
    mov byte [sockaddr_in + 2], 0 ; sin_port[0] это старший байт sin_port
    mov byte [sockaddr_in + 3], 80 ; sin_port[1] а это младший

    Т.е. перепутана endianness sin_family и sin_port. sin_addr вроде нормально выглядит.
    Ответ написан
    1 комментарий
  • Как задать значение переменной в SRAM при ее объявлении?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить.

    Откуда взялся адрес 0x0060 и как вы поняли что там лежит?

    TL;DR: код копирующий данные из FLASH в SRAM и обнуляющий .bss не линкуется по умолчанию. gcc вставляет ссылку на неопределённые символы __do_copy_data и __do_clear_bss в каждую единицу трансляции, в которой определяются объекты в секции .data и .bss соответственно. В написанных руками ассемблерных файлах их можно упомянуть явно.
    Ответ написан
  • Почему есть смысл в вычитании из ESP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если же разместить в стеке
        локальные четырёхбайтные переменные, то они окажутся доступны по
        адресам [esp-4] , [esp-8] и т. д.

    Смутило последнее предложение: почему автор указал, что можно адресоваться выше стека?

    Правильно смутило, автор херню написал. Достаточно заглянуть в любой ABI чтобы убедиться, что область стека ниже (по адресам, меньшим) указателя стека зарезервирована и не должна меняться.
    Ответ написан
    Комментировать
  • Как передать значение переменной в стек (Ассемблер)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Код может выглядеть как-то так:

    void OutFloat(double v);

    sub sp,16
    mov bp,sp
    fstp qword ptr [bp + 8]
    call OutFloat
    add sp,16


    Т.е. можно выгружать значение из сопроцессора прямо в то место, где будет исходящий параметр для вызова функции.
    Ошибка возникает из-за того, что нет команд mov пересылающих значение из памяти в память.
    Ответ написан
    5 комментариев