Задать вопрос
Ответы пользователя по тегу Assembler
  • Как это работает?

    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


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

    для реализаторов спецификации в железе
    Ответ написан
    Комментировать
  • Почему компиляторы не используют инструкции повторения REP movs?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему компиляторы не используют инструкции повторения REP movs?

    чего это "не используют"? Используют.

    Она должна быть в миллиард раз быстрее

    Инструкция которую не нужно читать из памяти, но которая сама лезет в память дважды на каждом цикле своего выполнения не может быть "в миллиард раз быстрее" других реализаций той же логики.
    Ответ написан
    Комментировать
  • Выдаёт ошибку - This program cannot be run in DOS mode.при этапе компоновки и линковки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при этапе компоновки и линковки ml.exe /c /coff program.asm
    link.exe /subsystem:windows program.obj выдаёт ошибку - This program cannot be run in DOS mode.

    Не нужно запускать виндовые исполняемые файлы в досе. Ассемблируй и линкуй под виндой, либо используй досовские программы коль скоро уж ты собираешь приложение для win32.

    call GetWindowReact

    call GetWindowsDC

    у тебя тут опечатки в названиях функций, правильные названия -- GetWindowRect и GetWindowDC.

    сделать так чтобы изображение окружности было вписано в квадрат

    Нарисуй квадрат, нарисуй эллипс по координатам углов квадрата, а не по координатам десктопа, как у тебя сейчас написано.
    Ответ написан
  • Как собрать библиотеку из кода для 16-bit ОС для работы в 32-bit \ 64-bit ОС?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как пере собрать её под 32 \ 64 разрядную ОС?

    Судя по тому, что делают приведённые куски кода -- никак. Только переписать в виде ядерного драйвера + интерфейсной библиотеки.
    Ответ написан
    Комментировать
  • Как увеличить FPS в системе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как увеличить FPS в системе?

    Ты уже задавал этот вопрос в комментариях к предыдущему вопросу, там есть ответ:

    Основной способ стандартный -- не перерисовывать всё, если можно этого избежать.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    VIDEO_BUFFER_SEGMENT = 0xA000
    VIDEO_BUFFER_OFFSET = 0xFA00
    VIDEO_SEGMENT = 0xA000
    VIDEO_OFFSET = 0x0000

    как ты думаешь, сколько памяти в сегменте VIDEO_BUFFER_SEGMENT доступно начиная со смещения VIDEO_BUFFER_OFFSET и что там идёт дальше?

    Если в твоём коде сделать вот такие изменения, то всё работает:
    diff --git a/lib/video.inc b/lib/video.inc
    index 3a26f43e2f79..d7054e194da9 100644
    --- a/lib/video.inc
    +++ b/lib/video.inc
    @@ -3,8 +3,8 @@ VIDEO_INC equ 0
     
     include "memory.inc"
     
    -VIDEO_BUFFER_SEGMENT = 0xA000
    -VIDEO_BUFFER_OFFSET = 0xFA00
    +VIDEO_BUFFER_SEGMENT = 0x6000
    +VIDEO_BUFFER_OFFSET = 0x0000
     VIDEO_SEGMENT = 0xA000
     VIDEO_OFFSET = 0x0000
     VIDEO_SIZE_DB = 0xFA00
    @@ -79,11 +79,11 @@ macro video!flip {
            mov ax, VIDEO_SEGMENT
            mov bx, VIDEO_BUFFER_SEGMENT
            mov es, ax
    -       mov ds, ax
    +       mov ds, bx
            mov cx, VIDEO_SIZE_DB
            cld
            mov si, VIDEO_BUFFER_OFFSET
    -       xor di, VIDEO_OFFSET
    +       mov di, VIDEO_OFFSET
            rep movsb
            pop ds es
     }
    diff --git a/os.asm b/os.asm
    index 1949e95b4e99..e5ebb3d280aa 100644
    --- a/os.asm
    +++ b/os.asm
    @@ -91,9 +91,9 @@ kernel.routine.startup:
     kernel.routine.video:
            cli
            video!fill 0x4E
    -       ;video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
    -       ;video!cursor
    -       ;video!flip
    +       video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
    +       video!cursor
    +       video!flip
            sti
            ret
    Ответ написан
  • Как исправить движение мыши?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov al, [bp+12]
      mov bl, al
      mov cl, 3
      shl al, cl
    
      sbb dh, dh
      cbw
      mov dl, [bp+8]
      mov al, [bp+10]

    Этот кусок кода из обработчика перемещений мыши должен делать знаковое расширение 9-битных координат, но я вижу, что в существующем коде в обработчик перемещений всегда приходят нули в координатах x и y, а из-за этого знакового расширения отрицательные dx и dy всегда становятся равными -256. Если добавить вызов функции initialize (0xc205) прерывания 0x15 в mouse.init с 3-байтными пакетами:
    kernel.routine.mouse.init:
      push es bx
      int 0x11
      test ax, 4
      jz kernel.routine.mouse.init.error
      mov ax, 0xC205
      mov bh, 3
      int 0x15
      jc kernel.routine.mouse.init.error
      mov ax, 0xC203
      mov bh, MOUSE_RESOLUTION
      int 0x15
      jc kernel.routine.mouse.init.error

    то у меня всё начинает работать как ожидалось.
    Кстати в ответе на SO по твоей ссылке вызов этой функции есть, непонятно зачем ты его выкинул.
    Ответ написан
    2 комментария
  • Получение доступа к регистру rip x86-64 архитектура?

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

    lea (%rip), %rax (в синтаксисе at&t) получает адрес следующей инструкции
    Ответ написан
    2 комментария
  • FASM Что не так с процедурой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что не так с процедурой?

    stdcall test_proc, 11
    …
    proc test_proc, ms
    …
    mov rbx, qword ptr ms


    ABI вызова не совпадает с ABI процедуры: 64-битный stdcall передаёт первый параметр в rcx, а test_proc ожидает его на стеке, в чём легко убедиться пропустив результат через objdump:

    403004:       48 c7 c1 0b 00 00 00    mov    $0xb,%rcx
    40300b:       e8 19 00 00 00          callq  0x403029
    …
    40307b:       48 8b 5d 10             mov    0x10(%rbp),%rbx
    Ответ написан
    Комментировать
  • Как выводить числа на семисегментный дисплей в Microprocesor Simulator 5v32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    цифра три на левой части дисплея имеет код 9Е и чтобы вывести результат сложения 1 + 2 мне надо 3 как-то преобразовать в 9Е

    Типовое решение этой задачи -- через таблицу преобразования, где индекс -- это то, что нужно отобразить, а содержимое -- это то, что нужно записать в порт для отображения. Для вывода цифр от 0 до 9 и вашего дисплея таблица будет такой:
    0xfa, 0x0a, 0xb6, 0x9e, 0x4e, 0xdc, 0xfc, 0x8a, 0xfe, 0xde
    .
    Ответ написан
    1 комментарий
  • Что за странная константа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.

    В конечном коде выглядит действительно загадочно. Если вызывать компилятор с ключом -fdump-tree-all (фиг знает, как сделать это на godbolt.org, я проверял локально), то уже в самом первом дампе можно увидеть, что if (arr[j - 1] > arr[j]) превращается в это:
    if (*(arr + ((sizetype) j + 1073741823) * 4) > *(arr + (sizetype) ((unsigned int) j * 4)))

    1073741823 -- это 0x3fffffff, 30 единичных бит, т.е. 30-битная -1. Дальше j + 1073741823 превратилось в
    add     r3, r3, #1073741824
    subs    r3, r3, #1

    т.е. в j + 1073741824 - 1. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.
    Поскольку константа появляется ещё до начала архитектурно-зависимых преобразований, она фигурирует в выводе для всех 32-битных архитектур поддерживаемых gcc. Интересно, что это началось между gcc-4.6 и gcc-5, до этого в этом месте генерировался просто sub r3, r3, #1. Ещё интересно, что даже с -O2 эта константа остаётся в сгенерированном коде, а исчезает только с -Os. Выглядит как регрессия.
    Ответ написан
    Комментировать