Ответы пользователя по тегу Assembler
  • Как написать ассембли код x86 nasm для Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Твой traverse_loop держит указатель на текущую запись в eax, но первый же вызов PrintName портит почти все регистры и не восстанавливает их, поэтому первый же movzx esi, byte [eax + 10h] после этого вызова обращается мимо памяти и вызывает segfault. Проще всего это исправить каким-нибудь pusha / popa вокруг тела PrintName. После этого ты доберёшься до вызова PrintMark, где увидишь, что эта функция ожидает в eax + 10h текстового представления оценки, а у тебя пока есть только двоичное.
    Ответ написан
    Комментировать
  • Не работает код, что не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что не так
    mov ecx, 5 ; Загружает количество гласных

    inc ecx ; Увеличивает счетчик гласных

    loop checkVowels ; Переходит к проверке следующей гласной

    test ecx, ecx ; Проверяет, содержится ли гласная буква в слове

    ты используешь ecx для двух разных целей, и, похоже, не догадываешься об этом. Из цикла поиска гласных ecx выходит со значением 0 если последняя буква слова -- не гласная.
    Ответ написан
    Комментировать
  • Не работает код, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ; Вывод суммы элементов выше главной диагонали
        mov ah, 2
        mov dl, cl
        int 21h

    функция 2 прерывания int21h выводит один символ с кодом в dl. Если код суммирования работает верно, это 2 + 3 + 6 = 11. Символ с кодом 11 -- непечатный, и, даже если бы он был печатным, подозреваю, что это не то, что тебе было нужно. В общем случае нужно переводить полученную сумму в строку цифр и эту строку печатать.
    Ответ написан
    8 комментариев
  • Что делает компьютер, когда получает машинную инструкцию поделить на ноль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что же сделает программа на чистом ассемблере?

    Программа "на чистом ассемблере" всё равно выполняется в каком-то окружении. От этого окружения и зависит, что именно произойдёт. С программой запущенной на x86 в реальном режиме произойдёт одно (прерывание int 0), запущенной под windows -- другое (исключение -> SEH -> завершение программы), запущенной под linux -- третье (но довольно похожее -- исключение -> сигнал -> завершение программы), а запущенной на микроконтроллере с ядром arm -- так и вообще ничего не произойдёт: разделит и глазом не моргнёт, вернёт 0 в качестве результата деления.
    Ответ написан
    Комментировать
  • Как выявить нужные данные из таблицы в отладчике Turbo Assembler при произведении трассировки программы CPU?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    у меня получилось найти только…

    Если ты нашёл машинный код, то его длину ты легко получишь посчитав символы, 6 16-ричных цифр -- это 3 байта. Ну или вычтя из адреса следующей инструкции пдрес текущей.
    Физический адрес в реальном режиме можно посчитать как cs * 10h + ip. В твоём случае получается 48ff9.
    Из твоей записи непонятно, нашёл ты значения регистров или нет, если что, вон они, в среднем окошке в верхнем ряду, а флаги -- в правом.
    Ответ написан
  • Ассемблер, почему дизассемблированном коде много ненужных операций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не переписать вместо этого
    add ebx,dword ptr [rbp+ECX*4+10h]

    Буквально так написать нельзя, потому что нет такого режима адресации в котором можно было бы использовать вместе Rbp (64-битный) и Ecx (32-битный). Можно было бы написать add ebx,dword ptr [rbp+rcx*4+10h], но для этого счётчик цикла должен был бы быть 64-битным, а он, как мы видим, 32-битный (int i). Т.е. ответ на вопрос "для чего это": для беззнакового расширения 32-битного счётчика цикла в регистр, который можно использовать для доступа к памяти.

    Другое дело, что из исходного кода очевидно, что при обращениях к памяти i не выходит из диапазона 0..9, так что разницы между ecx и rcx нет и не может быть. Возможно я что-то упускаю и у компилятора другое мнение на этот счёт, но может быть он просто туповат и не имеет кода который бы мог использовать эту возможность оптимизации, а может такая оптимизация и есть, но она не была включена во время генерации этого кода.
    Ответ написан
    Комментировать
  • Пытаюсь собрать прошивку для stm32. Ошибка "src/core_cm3.c: Assembler messages"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    g++  ...   src/core_cm3.c src/system_stm32f10x.c -o build/main


    src/core_cm3.c: Assembler messages:
    src/core_cm3.c:447: Error: no such instruction: `mrs %eax,psp'


    На какой системе ты выполняешь сборку, на x86? Тогда чтобы получить код для arm тебе нужен не g++, а какой-нибудь arm-linux-gnueabi-g++.
    Ответ написан
    2 комментария
  • Почему не работает загрузчик?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я так понял, происходит прыжок в никуда?

    Расскажи, как ты это понял?

    почему может не работать?

    Первая ошибка здесь: твой код собран под 0:7c00, но ты загрузил в ds 7c00 вместо нуля.
    Ответ написан
  • Что обозначает инструкция?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    помогите понять инструкцию на MASM:
    mov dx, es:[bx].StartCluster

    Это mov dx, es:[bx + StartCluster], загрузка из базового адреса в регистре + смещения, только в псевдо-С записи. Где-то раньше должна быть определена структура с полем StartCluster, которое используется здесь в качестве смещения.
    Ответ написан
    5 комментариев
  • Что не так с моим кодом assembler?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что не так

    Я не нашёл ответов в доступной документации, за исключением следующей ремарки в описании ключа /AT командной строки:
    Enables tiny-memory-model support.
    Enables error messages for code constructs
    that violate the requirements for .com format files.

    Подозреваю, что assume не может использоваться в masm в исходниках .com, поскольку такие исходники не могут иметь символьных ссылок на сегменты.

    Если вопрос -- "что делать", то ответ -- выкинуть директиву assume из кода.
    Ответ написан
  • Как это работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как и почему это работало тогда, а вот в досбоксе неработает?


    int 2f -- это multiplex interrupt, портал к дополнениям выполняющимся вокруг DOS. Функция 0x1600 -- это конкретно тест "имеются ли в наличии сервисы windows", см. Почему это должно работать в досбоксе, там же нет виндовых сервисов?
    Ответ написан
    Комментировать
  • Как поменять на ассемблере значения двух массивов местами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Написал такой код, меняет местами только первые 8 символов, а дальше не знаю как продолжить.

    Надо ответить себе на следующие вопросы:
    - что именно эта функция меняет местами
    - почему используются опкоды fild и fistp
    - в каких единицах измеряется аргумент Len
    - как должны меняться eax и esi внутри цикла
    Ответ написан
    Комментировать
  • Microprocesor Simulator 5v32 | Как прописать в коде управление змейкой через клавиатуру?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    этот кусочек я нашла с клавиатурой но к сожалению не работате:

    этот кусок рассчитан на PC и его контроллер клавиатуры. Наверняка в этом Microprocesor Simulator 5v32 какая-то другая схема подключения клавиатуры. Я не нашел никаких вменяемых ссылок на этот симулятор, чтобы посмотреть. Тебе прийдётся либо разобраться самой как подключена клавиатура, либо предоставить больше информации об этом.
    Ответ написан
    Комментировать
  • Что не так вроде программа написана верно но при запуске просто экран программы без рисунка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ; инициализация библиотеки Turbo Graphics
        MOV AH, 00h
        INT 10h

    Написано "инициализация библиотеки", а выглядит как просто вызов функции прерывания int 10h BIOS set video mode. Если это и правда инициализация библиотеки, то она (библиотека) должна уже быть загружена на этот момент. Дальше ты вызываешь другие нестандартные функции этого же прерывания, в отсутствие библиотеки они делают совсем не то, что написано в комментариях.

    ; завершение работы с графикой
        MOV AH, 00h
        INT 10h

    Даже если предыдущий код что-то нарисовал, в этом месте режим экрана переключается с графического на текстовый и всё исчезает?
    Ответ написан
    2 комментария
  • Вставку слова перед заданным словом?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    TARGET_WORD DB 'World', '$'

    Твой TARGET_WORD не заканчивается нулём, а условие успешного окончания поиска у тебя такое:

    CMP TARGET_WORD[BX], 0
    JE FOUND


    Ну и дальше тоже не всё гладко:

    LEA DI, TARGET_STRING
    ADD DI, BX

    BX в случае успеха -- это длина искомой строки, если её прибавить к TARGET_STRING, то получится какая-то фигня, если искомая строка была не в начале TARGET_STRING (как у тебя).

    CMP AL, 0
    JE AFTER_MAKE_SPACE

    И TARGET_STRING у тебя не заканчивается нулём, так что этот цикл будет работать дольше чем надо.

    STOSB

    Ты не загрузил в ES сегмент в котором лежит TARGET_STRING.

    LEA DI, INSERT_WORD
    LODSB
    MOV AH, 0
    INSERT_WORD_LOOP:
    STOSB

    У тебя здесь перепутаны местами SI и DI, ты копируешь TARGET_STRING в INSERT_WORD, а не наоборот.

    в идеале дайте исправленый код

    С этим на фриланс.
    Ответ написан
    Комментировать
  • STM32 ловит HardFault_Handler на операторе += как починить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вопрос номер раз: как такое вообще произошло?

    Насколько я понимаю STM32F207xx не поддерживает инструкцию uxtah, потому что это инструкция Thumb2 не реализованная в CortexM3.

    Вопрос номер два: как такое фиксить?

    Подозреваю, что ключом -march=, вероятно -march=armv6.
    Ответ написан
    1 комментарий
  • Программа как сделать com file?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ; устанавливаем сегмент стека
    mov ax, s_seg
    mov ss, ax
    ; устанавливаем сегмент данных
    mov ax, d_seg
    mov ds, ax


    пишет segment relocate

    Ну правильно пишет, вот же у тебя код хочет загрузить в ax то s_seg, то d_seg как константы, откуда он их возьмёт без релокаций? Если хочешь com-файл, то либо пиши вместо этого mov ax, cs ; mov ds, ax, либо вообще этот код выкинь, потому что com-файл и так стартует со всеми сегментами указывающими в одно и то же место.
    Ответ написан
    Комментировать
  • Как в архитектурах risc одинаковые виртуальные адреса разных контекстов задач различаются?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В risc вроде там куча csr регистров

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

    на разных компиляторах одна си операция ассемблируется то в комбинацию lui + addi, то в комбинацию auipc +addi

    Ты указал ARM в тегах, но у ARM нет инструкций lui и auipc. Такие инструкции есть у RISC-V.
    Если ты посмотришь в The RISC-V Instruction Set Manual, раздел 2.4 Integer Computational Instructions, то увидишь, что опкод lui загружает константу собранную из 20 битов непосредственного значения из инструкции и 12 нулевых младших битов в целевой регистр, а auipc прибавляет такую же точно константу к PC и загружает в целевой регистр результат сложения, и в этом вся разница между ними.

    где какая используется не совсем понимаю.

    lui используется для генерации констант, которые не зависят от того, где расположен код, а auipc для генерации констант, которые двигаются вместе с кодом. Т.е. Если ты хочешь вызвать функцию, которая находится дальше чем ±2К от точки вызова, ты можешь сгенерировать её адрес инструкцией auipc, и полученный код будет работать одинаково, независимо от того, по какому адресу он будет размещён. А если тебе надо поместить в регистр константу, например 0x12345678, то ты можешь это сделать парой инструкций lui rd, 0x12345 ; addi rd, rd, 0x678 и значение константы будет всегда одинаковым, вне зависимости от того, где будет этот код.

    Каким образом одинаковые адреса различаются. Или они просто не могут быть одинаковыми(типа ос позаботиться)?

    Если есть MMU и он используется ОС, то есть и виртуальные адреса и они могут быть одинаковыми у разных процессов. Если MMU нет или он не используется, то ОС размещает все процессы в одном адресном пространстве, нет смысла говорить отдельно о виртуальных адресах, поскольку они равны физическим, адреса выделяемые ОС разным процессам могут быть как одинаковыми (например несколько процессов запущенных из одного исполняемого образа могут использовать один и тот же код и константные данные), так и разными (например изменяемые данные разные у всех процессов, а стеки разные у всех потоков).

    Как они в tlb обрабатываются, если вдруг они реально могут быть одинаковыми, и там нету ни каких дополнительных индексов процесса)

    Выбери конкретную процессорную архитектуру -- обсудим. у многих RISC-архитектур есть ASID, который идентифицирует адресное пространство и записывается вместе с виртуальным адресом в TLB. Но в любом случае ASID -- это просто оптимизация для повышения производительности, когда он отсутствует или переполняется ОС должна сбрасывать содержимое TLB при переключении адресного пространства.

    У ARM есть регистры TTBR с примерно той же функцией, что и cr3 в x86.
    У RISC-V есть CSR satp, содержащий ASID и базовый адрес корневого каталога страничных таблиц. Об этом можно прочитать в разделе 4.1.12 Supervisor Address Translation and Protection (satp) Register спецификации The RISC-V Instruction Set Manual Volume II: Privi....
    Ответ написан
    Комментировать
  • Зачем нужно выравнивание больше чем двойное машинное слово? Директива p2align 4 и более?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему нужно 512-356 байт нулями заполнять, почему нельзя продолжить дальше. Ведь следующая после 86*4 байт инструкция(или переменная) будет выровнена

    А вот еслы бы ты тупо взял и прочитал документацию на директиву .p2align, то у тебя таких вопросов не было бы. Потому что никто не заполняет 512-356 байт после. .p21lign выравнивает текущий адрес по заданной степени двойки. Обычно для этого есть аппаратные причины, например базовый регистр таблицы векторов прерываний может иметь 9 младших бит зафиксированных в 0. Или вот по границе страницы MMU выравнивают данные в ELF-файлах, чтобы можно было установить отдельно разрешения RX для кода и констант и RW для изменяемых данных.

    для получения элемента допустим table[index_nBit] можно применять операцию ИЛИ вместо сложения. Что быстрее. В этом ли дело

    Нет, не в этом.
    Ответ написан
    1 комментарий
  • Почему в risc-5 архитектуре команда jal такая, зачем там перемешиваются биты, почему значение Imm разбросанно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему просто 20 бит не берется по порядку

    Официальный ответ на этот вопрос прямо написан в спецификации RV32I Base Integer Instruction Set, в разделе 2.3 "Immediate Encoding Variants" на странице 13:
    By rotating bits in the instruction encoding of B and J immediates instead of using dynamic hard-
    ware muxes to multiply the immediate by 2, we reduce instruction signal fanout and immediate
    mux costs by around a factor of 2


    для кого авторы постарались придумать такую ерунду

    для реализаторов спецификации в железе
    Ответ написан
    Комментировать