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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У тебя есть уже такая же точно ситуация с ExitProcess, и даже есть код, который это делает:
    push NULL
    call [ExitProcess]

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Меня напрягает вечное указание размера функции

    Это не размер функции. Это размер передаваемых параметров. И это часть ABI stdcall, документированная здесь, к gcc не имеющая отношения.

    Можно ли это как-то убрать, и просто объявлять: _MessageBox, _ExitProcess, как с msvcrt: _printf, __getch и т.д?

    На ассемблере? Ну разве что написав по макросу для каждой из этих функций.
    Ответ написан
  • Не работает инструкция строк movsb gas syntax, кто-нибудь может объяснить почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Оригинальный код прекрасно работает как есть:

    $ gcc -nostartfiles -static str.s -o str
    $ gdb ./str
    ...
    (gdb) b *0x40102f
    Breakpoint 1 at 0x40102f
    (gdb) r
    Starting program: /home/jcmvbkbc/tmp/toster/str 
    
    Breakpoint 1, 0x000000000040102f in _start ()
    (gdb) x/3b $rsi - 3
    0x402000 <source>:      1       2       3
    (gdb) x/3b $rdi - 3
    0x402010 <dest>:        1       2       3
    Ответ написан
    Комментировать
  • Почему не работает перенос ворда массива в регистр(gas syntax)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не работает
    leaw arrayW, %si
    movw (%si), %ax


    Потому что ты в 32-битной программе пытаешься адресоваться 16-битным регистром.
    Вот так всё прекрасно работает:

    leal arrayW, %esi
    movw (%esi), %ax

    :

    $ gcc -m32 -static -nostartfiles load.s -o load
    $ gdb ./load
    (gdb) b _start
    Breakpoint 1 at 0x8049000
    (gdb) r
    Starting program: /home/jcmvbkbc/tmp/toster/load
    
    Breakpoint 1, 0x08049000 in _start ()
    (gdb) si
    0x08049006 in _start ()
    (gdb) 
    0x08049009 in _start ()
    (gdb) p/x $esi
    $1 = 0x804a000
    (gdb) p/x $ax
    $2 = 0x5
    Ответ написан
    Комментировать
  • Почему появляется ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему появляется ошибка?

    Потому что директива public недоступна в формате PE64. По логике у вас должно быть entry _start а не public _start.
    Ответ написан
    Комментировать
  • Для чего развивают GNU Assembler, когда есть Netwide Assembler с хорошей документацией?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для чего развивают GNU Assembler

    - это ассемблер который штатно работает с gcc;
    - это ассемблер который поддерживает дофига ( больше 70 ) процессорных архитектур, а не только x86.

    GAS практически не документирован

    Чего именно тебе не хватает здесь?
    Ответ написан
    2 комментария
  • Настоящее низкоуровневое программирование на ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    синтаксис не тот, не зажигает он меня.

    А синтаксис ассемблера и не проектировали с целью "зажигать". Его проектировали имея в виду в первую очередь простоту трансляции его в машинный код.

    получается какой-то высокоуровневый код, который меня не привлекает.

    Высокоуровневость кода не в том, как он выглядит, а в том, что он делает. Загляни, например, в исходники qemu, в основном коде вообще ни строчки на ассемблере, всё на С. Тем не менее, местами это офигенно низкоуровневый код.
    Ответ написан
    1 комментарий
  • FASM. Как объявить процедуру с аргументом - строкой?

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

    Это же ассемблер, какой "аргумент строка"? Всё -- регистры или слова в памяти.
    proc getel text
    endp

    text -- это указатель на твою строку.

    У fasm есть кучка примеров, где можно посмотреть, как там что делается.
    Ответ написан
  • Как работать с отрицательными числами в Ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    signed __int8 numerator = 0;
    signed __int16 denominator = 0;


    extern numerator:sword
    extern denominator:sbyte
    ...
    mov denominator, al

    Ты видишь, что типы в C и в ассемблере не совпадают?
    По-хорошему надо заменить __int8 numerator на __int16 numerator, extern denominator:sbyte на extern denominator:sword а mov denominator, al на mov denominator, ax, чтобы стало как надо.
    В остальном всё выглядит хорошо.
    Ответ написан
    3 комментария
  • Как корректно подключить cinvoke в FASM под ELF64?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    include 'linInclude/proc64.inc'

    В стандартной поставке fasm нет ведь такого файла? Где ты его взял?

    У меня заработал вот такой код:
    format ELF64 executable 3
    
      include '/usr/share/fasm/examples/elfexe/dynamic/import64.inc'
      interpreter '/lib64/ld-linux-x86-64.so.2'
    
      needed  'libc.so.6'
    
      import  exit, printf
    
    segment readable executable
    entry $
    
            lea rdi, [fmtS]
            lea rsi, [msg]
            call [printf]
            call [exit]
    
    segment readable writeable
            msg db 'Hello, World!', 0xA, 0
            fmtS db '%s', 0xA, 0
    Ответ написан
    2 комментария
  • Как реализовать этот код на си?

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

    примерно так: https://godbolt.org/z/qMsqvx , строки 10 и 11. 0x18 == 24
    Ответ написан
    Комментировать
  • Почему идёт бесконечный цикл?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov     cx, 3
    cellValues:
            mov     edx, lenBM
            mov     ecx, borderMiddle
            mov     ebx, 1
            mov     eax, 4
            int     0x80
            loop    cellValues

    Думал, терётся cx от ecx

    Трётся, и не cx, а ecx. И инициализировать и сохранять/восстанавливать надо ecx, потому что в 32-битном коде ecx работает счётчиком для опкода loop.
    С другой стороны, использование опкода loop в наше время выглядит анахронизмом. Если есть регистр который не меняется системным вызовом лучше использовать его и делать явный dec и jnz.
    Ответ написан
  • Как передать переменную в команды BSF/BCF?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    подскажите хотя бы с переменной в эти BSF/BCF

    Набираешь в гугле "pic datasheet", (если знаешь какой именно PIC у тебя -- уточни, получишь более релевантный результат) получаешь ссылку на спецификацию конкретного процессора. Открываешь её и ищешь в оглавлении раздел "Instruction Set" или похожий по смыслу, в нём ищешь свою инструкцию. Если это сделать, то ты найдёшь такой текст:
    For bit-oriented instructions, ‘b’ represents a bit field designator
    which selects the bit affected by the operation, while ‘f’ represents
    the address of the file in which the bit is located.

    и такую картинку:
    5ee43a094f624209976491.png
    из чего ты сможешь сделать вывод, что нельзя этими инструкциями поменять бит по номеру, записанному в переменной, можно только явно указать в инструкции номер бита который надо поменять.

    Выйти из положения можно несколькими способами, самый простой на мой взгляд -- иметь регистр в котором установлен единственный бит, соответствующий самому старшему биту, который должен быть установлен в наборе огоньков (а набор непрерывный, если я правильно понял задание). Этот бит можно двигать на 1 влево и вправо инструкциями rlf/rrf и операцией xorwf добавлять/убирать из набора огоньков.
    Ответ написан
  • Как узнать адрес стека в x86 архитектуре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как мне найти его адрес?

    Поставить метку в нужном месте. Загрузить адрес метки в регистр
    section .bss
    stack_bottom:
    resb 8192
    stack_top:
    .text
    mov eax, stack_bottom
    Ответ написан
    3 комментария
  • Как происходит выборка команды в процессоре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Допустим, значение счетчика равно 0000, я должен записать байт 10h. Как я понял, команду нужно указать через пульта управления на RAM (слева). Например, указал 10h, то получается что во все 3 защелки записывается 10h (То есть 10h 10h 10h) ???

    Нет, не получается. Если значение счётчика равно 0000, то байт 10h ты запишешь только по адресу 0. А машина будет извлекать три байта по адресам 0000, 0001 и 0002 в защёлки:
    В нашем сумматоре каждая ко-
    манда занимает по 3 байта и извлекается из памяти побайто-
    во. Выборка одной команды занимает три цикла синхронизи-
    рующего сигнала, а полный командный цикл — четыре цикла
    синхронизирующего сигнала.


    А как записать команду 10h 00 00??

    Надо перейти к адресу 0001 и записать байт 00, затем к адресу 0002 и записать байт 00.
    В предыдущей главе написано, как можно программировать такую память.
    Ответ написан
    3 комментария
  • Как определить смещение в Assembler?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1000 – это адрес (А), но только относительный. Чему равно смещение (Х).

    Судя по таблице инструкций этого микропроцессора и по примеру №6 на стр. 10, смещение должно быть равно разности целевого адреса и адреса следующей команды. Т.е. X = 1000 - 504, с учётом вашей системы счисления. 504 потому что 2 байта занимает команда (которая будет выглядеть как 020567) и ещё два байта -- индексное слово, т.е. X.
    Ответ написан
    Комментировать
  • Как изменить программу для подсчета единиц в 32-разрядном числе?

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

    Количество нулей в 32-битном числе равно 32 - (количество единиц). Но если хочется именно посчитать -- замени jnc на jc.
    Ответ написан
  • Как вывести результат сложения в Nasm (MACOS, 64bit)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сделать так, чтобы оно выводило число?

    Перевести число в строковую форму и эту строковую форму выводить. Системный вызов write выводит байты как есть.
    "как"? -- например, в цикле беря остаток от деления на 10 (или какое ты хочешь основание системы счисления), прибавляя к остатку '0' (или 'a' - 10, если он 10 или больше) и записывая результат в буфер, начиная с конца. Типа того:
    mov rbx, 10
        mov rsi, str + 20
    l1:
        mov rdx, 0
        idiv rbx
        add dl, '0'
        mov byte [rsi], dl
        add rsi, -1
        test rax, rax
        jnz l1
    ; rsi + 1 указывает на начало строки
    ; длина строки -- str + 20 - rsi
    Ответ написан
    Комментировать
  • Как определить время выполнения адресации?

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как вывести массив данных?

    Перевести каждое число в строковое представление и вывести строки на экран.

    Есть код, который пока что только складывает

    А если посмотреть внимательно, то не только складывает, но и что-то переводит и что-то печатает.
    Ответ написан