Ответы пользователя по тегу Assembler
  • Что такое org, и вопросы по нему?

    Когда компилятор превращает команды (и данные) в бинарный код, он вычисляет смещения команд и данных от начала сегмента. По умолчанию он считает, что блок загружается в самое начало сегмента и начинает счет с 0.
    Например, если первая команда занимает 3 байта, вторая - 2, третья - 4, то смещение первых четырех в сегменте кода будет [0, 3, 5, 9] соответственно.
    Директива ORG увеличивает этот виртуальный счетчик на то значение. которое указано в ней.
    Самый простой пример: для COM-файлов сегмент кода загружается в ОЗУ не со смещения 0, а со смещения 256 от начала сегмента, выделенного программе. Соответственно, при написании COM-файла, нужно сегмент кода предварять ORG 256, чтобы он понимал, что позиции команд (из примера выше) в сегменте при запуске программы будут - [256, 259, 261, 265].
    Ответ написан
    Комментировать
  • Почему не работает scasw?

    Как указал выше Антон , Ваш код не соответствует логике команды.
    SCASW сравнивает ячейку по адресу ES:DI с AX, выставляет флаги результатов сравнения и инкрементирует DI на 2. Автоматический инкремент DI позволяет (и собственно это и есть основной режим использования) предварять SCAS* префиксами проверки условий (REPE, REPNE).

    Соответственно Ваш код должен содержать строку
    REPNE SCASW
    вместо
    SCASW
    CMP AX,...
    и цикла

    А сейчас Ваш код действительно как будто бы ориентирован на LODSW а не SCASW
    Ответ написан
    2 комментария
  • Почему ругается компилятор?

    Я бы предположил, что между местом расположения в памяти переменной с литералом и местом расположения в памяти команды, в которой она используется, оказалось слишком большое расстояние, которое не может адресовать используемый тип адресации.
    Ответ написан
    9 комментариев
  • Ассемблер, свободное место на жестком диске?

    0) нет гарантии, что для Вашего реального диска все параметры ответа AX, BX, CX умещаются в 16 бит (возможно, конечно DOS для совместимости что-нибудь обманывает, но гарантии опять же нет);

    Теперь собственно ASM :
    1) уверены ли Вы в чистоте верхнего слова ebx на первом умножении ?
    2) абсолютно непонятен смысл манипуляций
    mov ebx,edx
      shl ebx, 16
      add eax,ebx

    3) уверены ли Вы в чистоте верхнего слова eсx на втором умножении ?
    4) вот тут Вы напрочь убили верхние 32 бита значимой информации (а ведь 8 Гб уже не помещаются в младшие 32 бита) :
    xor edx,edx ;расширим делимое
    Ответ написан
  • Как разделить два числа в Assembler при помощи цикла?

    Вам не жалко процессорных циклов для такого алгоритма деления ?
    Количество итераций не должно превышать разрядность делимого - это в самом плохом случае (деление на 2).
    Ответ написан
    Комментировать
  • Как написать антивирус к вирусу по ассемблеру?

    Вариант с 0% False Positive + False Negative - это включить весь скомпилированный код в базу антивируса добайтно, или в целях экономии - хеш-сумму от него. Однако, Ваш антивирус будет "переобученным" : любое изменение кода приведет к пропуску. Вы должны понять насколько большой должна быть способность к обобщению и постараться включить в сигнатуру (т.е. охватываемую хеш-суммой часть кода) ту часть, которая наиболее вероятно не изменится при чьей то правке. А дальше собственно и начинается самое интересное.
    Ответ написан
    Комментировать
  • Генерация кода для условных выражений?

    До фразы "... мы смотрим в стек и если в нем 1, то выполняем ветку истинного условия, если ложно то соответственно ветку ложного условия" все абсолютно верно. А дальше я не понимаю ход Ваших мыслей, извините ... Поясните другими словами ? Какая у Вас в итоге цель ?
    Ответ написан
  • Правильные книги по Assembler. Какие они?

    Мне больше всего нравились в свое время
    П.И.Рудаков, К.Г.Финогенов
    и
    В.И.Пустоваров
    Ответ написан
    Комментировать
  • Что значит этот код?

    $ -смещение текущей инструкции
    array - смещение начала массива
    соответственно "$ - array" - это размер массива, выраженный в байтах
    Ответ написан
    Комментировать
  • Правильно ли я описал логическое выражение?

    Нет, нужно еще в WORD затереть мусорные значения в битах [2-31] перед объединением по OR.
    Да и константа у Вас странная для маски [2-31] - 0x3FFFFFFFC
    Ответ написан
    Комментировать
  • Как найти соответствие адреса памяти коду программы загруженной программы для DOS?

    Преобразование 32 бит адреса "сегмент:смещение" в 20-битный линейный адрес по формуле "сегмент*16+смещение" и была придумана для того, чтобы можно было загружать фрагменты кода и данных практически в любые области памяти не теряя на фрагментации и при этом сохранять смещение равным тому, что было на этапе компиляции, а варьировать при загрузке только сегментный регистр. Так что смещение в принципе должно сохраняться.

    Другое дело, что сам сегмент C031 весьма странный - в классической архитектуре он находится уже за пределами основного ОЗУ. Так что либо в MiniOS другая схема организации памяти, либо Ваша программа в результате нарушения логики либо искажения стека/кода совершила прыжок/вызов/возврат в непредназначенную для этого область памяти, например ПЗУ или видеобуфер, чем сразу же вызвала исключение. В этом случае сам адрес CS:IP ни о чем не говорит - нужно знать где была точка исполнения на один шаг раньше.

    По поводу второго вопроса : честно не знаю есть ли возможность в С++ узнать текущие CS:IP, но в Ассемблере обычно делался ближний либо дальний вызов на адрес, расположенный непосредственно следующим кодом, а затем положенные этим вызовом в стек значения CS:IP считывались обычным POP :
    call far x
    x:
    pop di
    pop es
    Ответ написан
    Комментировать
  • Где найти справочник по командам ассамблера?

    Помню этот справочник. Был скомпилирован на TurboVision в исполнимый файл. Сейчас увы в наличии нет.
    Ответ написан
  • TASM, вынос процедур в отдельный файл для формата COM

    Я бы предположил, что при линковке файл l3p.obj встает до l3.obj а следовательно точка входа оказывается не на позиции 100h. Почему линковщик меняет явно указанный порядок следования объектных модулей и как его заставить не делать так - я не знаю.

    Мой TLINK "на ура" собирает COM-файл из Ваших исходников по Вашему BAT-файлу.

    А если поменять местами obj для моего TLINK, получаю ошибку:
    C:\tasm>tlink.exe l3p.obj+L3.OBJ /t
    Turbo Link  Version 2.0  Copyright (c) 1987, 1988 Borland International
    Cannot generate COM file : data below initial CS:IP defined
    Ответ написан
  • Таймер в Assembler

    Вы точно после
    lea dx, some_function
    mov ah,25h
    mov al,4Ah
    вызываете int 21h?
    Ответ написан