Ответы пользователя по тегу Assembler
  • Почему компиляторы не используют инструкции повторения 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. Выглядит как регрессия.
    Ответ написан
    Комментировать
  • Как узнать, откуда прерывание?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    проблема заключается в том, что я не знаю, как получить состояние машины в момент прерывания, чтобы его сохранить.

    Возможно тебе следует выяснить, что это конкретно за "состояние машины" которое ты собираешься сохранить, возможно это поможет тебе его найти.
    Ответ написан
    4 комментария
  • Хочу написать простенький симулятор процессора для уроков, какую выбрать систему команд?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Какую систему команд выбрать? …
    для демонстрации принципов работы ассемблера

    Для этого нужно ответить на вопросы: где вы собираетесь взять ассемблер и как конкретно вы собираетесь демонстрировать его работу?
    Я вижу два возможных ответа на первый вопрос: взять готовый или написать самому. Если цель -- написать самому, то это может быть сравнимо по сложности, если не сложнее, чем написать эмулятор для той же самой системы команд. Если брать готовый, я бы рекомендовал RISC-архитектуру, но все они с теми или иными заморочками, так что это будет выбор наименьшего из зол. На мой взгляд RISC-V, точнее базовый набор RV32I -- достойный кандидат.
    Ответ написан
    Комментировать
  • Одна мнемоника преобразуется в один код, или в разные?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Скажите, машинный код команды будет один и тот же, или различный?

    Первая ссылка по запросу mov x86 в гугле: https://c9x.me/x86/html/file_module_x86_id_176.html
    Ответ написан
    Комментировать
  • Как с помощью консоли сделать lst файл, masm32?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    .lst обычно называют листинги ассемблера, которые показывают, в какие конкретно байты были оттранслированы инструкции ассемблера. Для masm это делается ключом /Fl, а деталями листинга можно управлять ключами /S*, см.

    проблема в том что надо не через линк а через link16 тогда работает,

    тогда, возможно, тебе нужен не листинг ассемблера, а мэп линковщика. Его вывод можно включить опцией линковщика /MAP.
    Ответ написан
    Комментировать
  • Как создать массив хендлов на MASM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для полноты картины не хватает определений hBmp, hbtm и hInstance.
    Косяк бросающийся в глаза сразу -- ты создаёшь таймер в обработчике WM_INITDIALOG, но нигде его не удаляешь и он продолжает тикать и после закрытия диалога.
    Ответ написан
    Комментировать
  • Почему вылетает программа?

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

    format PE console
    …
                    push str1
                    call [printf]
    
                    mov ah, 7
                    int 21h

    интересная попытка, но почему печать -- вызовом функции, а ввод символа -- вызовом досовского прерывания,
    если для печати тоже есть досовское прерывание?
    Если серьёзно, нельзя вызывать досовские прерывания из приложения win32. Ищи подходящую функцию win32 API.
    Ответ написан
    Комментировать
  • Моя программа не грузиться на VB и в BIOS не отображается SANDISK?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У тебя тут три разных вопроса.
    Моя программа запускается в bosh но не реагирует на прерывания клавиш


    А какую реакцию ты ожидаешь? Введённый символ ты не печатаешь, si ты не перезагрузил, так что puts_loop загружает из памяти следующий 0 и тоже ничего не печатает. Можно сделать так чтобы увидеть, что int 16h таки работает:

    keyboard_loop:
            mov ah, 0
            int 16h
            mov ah, 0Eh
            int 10h
            jmp puts_loop


    iso образ созданный dd не запускается в VB

    А почему ты думаешь, что из mbr можно создать iso с помощью dd? Его вообще-то надо в правильное место поместить, не абы куда. Например это можно сделать так: mkisofs --no-emul-boot -o test.iso -b test.bin . где test.bin -- это твой бинарник бут-сектора.

    а загрузочная флешка не отображается в BIOS

    Это видимо следствие из того, как ты сделал iso который закатал на флэшку.
    Ответ написан
    Комментировать
  • Как вычисляется эффективный адрес относительно счетчика команд?

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

    Оттуда, что складываемые числа -- RIP 0x7ff778a06497 и смещение 0x67f9. Смещение записано в поле инструкции mov в формате little endian.

    что это за значение 88 13 00 00 ......... и Val = 5000 ?

    Я так понимаю, что это иллюстрация, что по адресу 0x7ff778a0cc90 оказались байты 0x88, 0x13, 0x00..., которые после загрузки в регистр rax дали значение 0x1388 == 5000
    Ответ написан
    Комментировать
  • Как выучить язык ассемблера?

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

    Читать ассемблерный код. Когда научишься с лёгкостью читать, писать тоже сможешь.
    Посоветуйте какие-нибудь ресурсы по изучению

    Исходники на ассемблере, которые любой компилятор тебе нагенерирует, справочник по инструкциям твоего процессора (например 2й том Intel developer manual) и гугл. Просто бери, читай и разбирайся зачем так.
    Ответ написан
    Комментировать
  • Как узнать возраст файла в Ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне найти возраст файла?

    Сравнить creationTime который возвращает GetFileTime с текущим временем которое возвращает GetSystemTimeAsFileTime. 3 дня -- это 3 * 24 * 60 * 60 * 10000000 100-наносекундных интервала (в таких единицах измеряется FILETIME).
    Чтобы упростить себе задачу можно сравнивать только старшие части (dwHighDateTime) структур FILETIME, вес младшей части -- 429 секунд, меньше 10 минут.
    Типа того:

    invoke GetFileTime, hFile, addr ftCreate, NULL, NULL
      invoke GetSystemTimeAsFileTime, addr ftNow
      mov eax, ftNow.dwHighDateTime
      sub eax, ftCreate.dwHighDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
      jg <файл старше 3 дней>
      /* иначе файл младше 3 дней */

    Если упрощать не хочется и нужно отмерить в точности 3 дня, то хвост можно переписать так:
    mov eax, ftNow.dwHighDateTime
      sub eax, ftCreate.dwHighDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
      jg <файл старше 3 дней>
      jl <файл младще 3 дней>
      mov eax, ftNow.dwLowDateTime
      sub eax, ftCreate.dwLowDateTime
      cmp eax, (3 * 24 * 60 * 60 * 10000000 % 0x100000000)
      jg <файл старше 3 дней>  
      /* иначе файл младше 3 дней */
    Ответ написан
    2 комментария