Ответы пользователя по тегу Assembler
  • Как в system V amd64 abi поместить метку в регистр?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я хочу поместить метку "L0" в регистр %rbx.
    relocation R_X86_64_32S against `.text' can not be used when making a shared object

    Если это локальная метка -- то по смещению от PC:
    leaq L0(%rip), %rbx
    Если это метка из другой динамической библиотеки -- то через plt:
    movq L0@gotpcrel(%rip), %rbx
    Ответ написан
    1 комментарий
  • Как передать управление сопрограмме?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ну, с таким псевдокодом всё должно работать.

    Можете подсказать в чём проблема?

    В реализации, похоже на то.
    Ответ написан
    Комментировать
  • Команды COSMAC ELF 1802?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Сначала идёт команда 7A - погасить лампочку. Команда загружает в регистр R0 число 2. Почему?

    Поскольку у тебя P = 0, то R(0) используется как program counter. Инструкция 7А должна его увеличить на 1, т.е. после неё в R(0) должно быть 1.

    Далее идёт команда F8 Описание этой команды M(R(P)) → D; R(P) + 1 → R(P)
    Команда F8 загружает в регистр F8 число 3, хотя команда, судя по описанию, должна прибавлять к регистру R0 число 1 и сохранять результат в R0, значит в R0 должно оказаться число 1.

    Нет, не так. Сначала команда загружается в регистры I и N, а R(0) увеличивается на 1. После этого достаётся байт из памяти по адресу R(0) и помещается в D, а R(0) увеличивается ещё на 1.

    Дизассемблированная программа:
    0: 7A -- reset Q (Q = 0)
    1: F8 -- ldi 10 (D = 10)
    2: 10
    3: B1 -- phi 1 (R(1).1 = D, т.е. R(1) = 1000)
    4: 21 -- dec 1 (R(1) = R(1) - 1, т.е. R(1) = fff)
    5: 91 -- ghi 1 (D = R(1).1, т.е. D = f)
    6: 3A -- bnz 4 (переход к адресу 4, пока D != 0)
    7: 04
    8: 31 -- bq 0 (переход к адресу 0 если Q == 1)
    9: 00
    a: 7B -- set Q (Q = 1)
    b: 30 -- br 1 (переход к адресу 1)
    с: 01
    d: 00 -- idle (никогда не попадаем сюда).


    В середине просто цикл задержки на счётчике.
    Ответ написан
    Комментировать
  • Как увидеть входные параметры ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть исходный код на Си, который вызывает функцию на ассемблере, но передаваемые аргументы как получить,

    Гуглить словосочетание "имя целевой процессорной архитектуры" + ABI.
    Например: x86_64 abi, x86 abi, arm64 abi...
    В найденном документе искать раздел "parameter passing", "function calling" или с похожим по смыслу названием.
    Ответ написан
    2 комментария
  • Ассемблер что не так с кодом?

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

    В видеорежиме 100h нет гарантии, что вся видеопамять доступна одним непрерывным куском. И если вызвать функцию 0x4f01 прерывания 0x10, то она вернёт структуру, в которой указан размер окна. Мне она возвращает 64К (0x40), что существенно меньше 640 * 400 = 256000:
    0x7c00:      mov    $0x4f01,%ax
       0x7c03:      mov    $0x100,%cx
       0x7c06:      mov    $0x7c77,%di
       0x7c09:      int    $0x10
    (gdb) x/6hx $di
    0x7c77: 0x00bb  0x0007  0x0040  0x0040  0xa000  0x0000

    Чтобы обратиться к остальной видеопамяти, нужно либо переключать банки видеопамяти функцией 0x4f05, либо как-то включать линейный доступ к видеопамяти.
    Ответ написан
    Комментировать
  • Assembler как работать с видеопамятью в защищенном режиме?

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

    По многим причинам:
    - ты забыл загрузить ds и es после перехода в защищённый режим
    - тебе нечем их загрузить, поскольку в gdt нет сегментов доступных для записи
    - адрес видеопамяти -- 0xa0000, а на 0xa000 как у тебя
    Ответ написан
    4 комментария
  • Ассемблер как работает адресация в защищенном режиме?

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

    https://en.wikipedia.org/wiki/Global_Descriptor_Table в чём сложность?

    db 0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00

    Segment limit: 0xfffff
    Base address: 0x00000000
    Type: 0xa
    S: 1
    DPL: 0
    P: 1
    A: 0
    DB: 1
    G: 1
    Т.е. этот сегмент действительный (P = 1), не системный (S = 1), начинается с адреса 0, покрывает 4Г, исполняемый и доступный для чтения (Type = 0xa), доступен из кольца защиты 0 (DPL = 0), не читанный (A = 0), со страничной гранулярностью (G = 1).

    Я не могу понять именно как происходит этот прыжок
    jmp 00001000b:pm_entry
    use32
    pm_entry:

    В cs попадает 0x8, т.е. CPL = 0, использовать 1ю запись в GDT, в pc -- pm_entry.
    Ответ написан
    Комментировать
  • Где посмотреть номера системных вызовов ядра Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    - старое архитектурно-специфичное представление (определения в arch/*/include/uapi/asm/unistd.h, на примере MIPS)
    - старое архитектурно-независимое представление (определения в include/uapi/asm-generic/unistd.h, ими пользуется, например, ARM64)
    - новое представление (отдельный файл определений из которого генерируются заголовочные файлы),
    Ответ написан
    Комментировать
  • Как считать строку из файла и записать числа в массив?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне дан файл input.txt, в котором находится строка, где через пробел указаны числа (их число неизвестно). Требуется узнать их сумму.
    ...
    мне кажется, что тут всё запутано и можно легче. Подскажите как.

    не заводить промежуточных массивов, считать всё на лету:
    0) нужно держать текущую сумму (S), инициализировать её нулём
    1) нужно держать значение прочитанного на данный момент числа (V), инициализировать его нулём
    2) читать из файла посимвольно
    -- если прочитанный символ -- цифра (d), добавить её к текущему числу: V = V * 10 + d
    -- если прочитанный символ -- не-цифра или конец файла, добавить текущее число к сумме и занулить текущее число: S = S + V; V = 0
    3) если конец файла, то вывести S и закончить работу, иначе продолжить с п. 2
    Ответ написан
    Комментировать
  • Нужен ли ASSEMBLER специалисту по информационной безопасности?

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

    Нужен ли алфавит специалисту по информационной безопасности?
    ...
    В интернете все разделились на 2 лагеря: одни говорят, что алфавит устарел и на замену ему пришли эмодзи...
    Ответ написан
    3 комментария
  • Расскажите подробно про механизм #1 доступа к пространству конфигурации PCI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    линк на osdev.org не кидайте, я как раз там и читал.

    Ок, вот тебе главное оттуда:
    Two 32-bit I/O locations are used, the first location (0xCF8) is named CONFIG_ADDRESS, and the second (0xCFC) is called CONFIG_DATA. CONFIG_ADDRESS specifies the configuration address that is required to be accesses, while accesses to CONFIG_DATA will actually generate the configuration access and will transfer the data to or from the CONFIG_DATA register.

    -- пишешь в первый порт, к какому адресу в конфиг-спейсе будет доступ, после чего пишешь или читаешь второй порт. В этом состоит механизм доступа #1 на x86.
    Понимания чего тебе не хватает?
    Ответ написан
    Комментировать
  • Откуда брать multiboot table с адресом фреймбуфера, загрузчик GRUB 2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Откуда брать multiboot table с адресом фреймбуфера

    Адрес структуры multiboot_info загрузчик передаёт ядру в регистре EBX.
    Ответ написан
    Комментировать
  • Может ли exe-шник редактировать сам себя?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может ли exe-шник редактировать сам себя

    Может. Но не должен. Потому что не нужно.
    Ответ написан
    Комментировать
  • Linux NASM чтение и вывод содержимого файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    какая-то беда нету вывода никакого

    запусти свою программу под strace: strace -i -v test и увидишь, какие системные вызовы и с какими аргументами она делает с каких адресов.
    Ответ написан
    1 комментарий
  • Забивается буфер клавиатуры как быть?

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

    Что мешает вставить код опроса и чтения клавиатуры внутрь цикла задержки?
    Ответ написан
    2 комментария
  • Assembler как работать со спикером на прямую?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Комментировать
  • "Jump if equal" не работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Когда байт по адресу RCX равен нулю и программа достигает строки `je ..@15.endwhile`, инструкция JE просто не перескакивает на метку `..@15.endwhile`.

    Почему?

    Потому что не должна. Потому что cmp [rcx], dword 0 -- это вообще странная запись. Канонично было бы написать cmp dword ptr [rcx], 0. Но в любом случае, вы не "байт по адресу RCX" сравниваете с 0, а целое слово. Ну и между строчками ok и err нет целого слова нулей, но вот после err, очевидно, есть.
    Как сделать правильно? cmp byte ptr [rcx], 0
    Ответ написан
    Комментировать
  • Сегмент и смещение, сколько где и чего?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Допустим есть сегмент нулевой, вроде так
    0000:0000

    Какое значение будет следующего сегмента. И сколько их может быть.

    Следующий -- 0001:0000. Всего их -- 65536.

    не понимаю как работает адресация в реальном режиме.

    Есть линейный адрес (A). Он вычисляется из адреса вида сегмент:смещение (S:O) следующим образом:
    A = S * 16 + O. Всё.
    Ответ написан
    4 комментария
  • Возможно ли вывести "Hello world" на assembler (fasm) под win 64bit?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Стоит задача вывести на экран сообщение с текстом "Hello world", программу нужно написать на ассемблере (fasm).

    Можно написать консольное приложение под win32 на ассемблере. Уровень сложности примерно тот же самый, что и при написании COM.
    Ответ написан
    Комментировать
  • Использование прерываний в ОС Windows?

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

    Зависит от того, какие прерывания вы имеете в виду. Если досовский int 21h -- то в винде есть свой API, если вы имеете в виду "самому обрабатывать прерывания" -- то нужен ядерный драйвер.
    Функции использовать можно вообще везде.
    Ответ написан