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

    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
    Как вывести массив данных?

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

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

    А если посмотреть внимательно, то не только складывает, но и что-то переводит и что-то печатает.
    Ответ написан
  • Как получить информацию о процессоре в biose FASM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я создаю программу

    "Разрабатываю", создатель ты наш.

    Прошу сердечно адаптировать его под FASM конкретно для BIOS.
    Пожалуйста прокомментируйте каждую строчку.

    Почему бы тебе не сделать это самому, а мы почитаем и скажем, правильно ли ты всё понял или где накосячил?
    Ответ написан
  • Как скомпилировать программу в nasm macos?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    nasm: fatal: unable to open input file `hello5.asm'
    Пробовал в команде указать путь к файлу, но такая же ошибка.
    nasm -f elf /Users/dmitry/Desktop/hello5.asm
    Как мне запустить эту программу?

    С виду всё правильно делаешь, остаётся разобраться с правильным полным именем hello5.asm.
    Ответ написан
    Комментировать
  • [MASM32] Как преобразовать строку в число?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне нужно текст в text1 преобразовать в число, повысить его на +1 и установить в hwndEdit2

    Это можно сделать не преобразовывая строку в число и обратно: нужно найти конец строки и двигаясь к началу проверять текущий символ. Если он -- '9' -- { заменить его на '0'. Если это был первый символ в строке -- приписать перед ним '1' и закончить, иначе продолжить просмотр. } Если он не '9' -- увеличить его код на 1 и закончить.
    '9' -- для десятичной системы.
    Ответ написан
  • Кто знает какие-то уроки по программированию Assembler aarch64?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gcc -S преподаёт отличные уроки, рекомендую!
    Ответ написан
    4 комментария
  • Как записать команду в Intel синтаксисе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    .text
            .att_syntax
    foo:
            movb    $4, %al
    
            .intel_syntax
    
            mov     %al, 4


    $ gcc -c att-intel.S 
    $ objdump -d att-intel.o
    
    att-intel.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <foo>:
       0:   b0 04                   mov    $0x4,%al
       2:   b0 04                   mov    $0x4,%al


    Деасемблирование дало такой результат:
    mov ds:0x0,al
    Может мне кто-то объяснить что это значит ds:0x0

    Значит что дизассемблировал что-то не то.
    Ответ написан
  • Как ввести и вывести число в assembler(AT&T, GAS синтаксис)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пишу под Linux(Ubuntu), следовательно приходится осваивать синтаксис GAS(AT&T)

    Не, не "следовательно". gas умеет как синтексис intel (.intel_syntax) так и синтаксис at&t (.att_syntax).

    addb $str, i
    relocation truncated to fit: R_X86_64_8 against `.data'

    Потому что при сборке под 64 бита надо адресоваться относительно %rip. Если оно тебе не надо, проще собирать под 32 бита.

    int $0x80

    Не работает в 64-битных программах. Ну ты понел. (с)
    Ответ написан
    Комментировать
  • Как правильно решить задачу на работу с двумя массивами в asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужно из c++ переместить этот массив в ассемблерную вставку, а там уже перенести из этого массива в другой массив все элементы, которые равны сумме соседних.
    То есть регистры e*x нельзя брать. Кто может подсказать, где найти материал по этой теме, либо же предложить пример кода для решения поставленной задачи?

    Можно написать этот код так, что он не будет использовать никакие конкретные регистры явно. Конкретные регистры будут подставлены компилятором. Например (gcc):
    #include <stdint.h>
    
    void f(void)
    {
        uint32_t a[16] = {1, 2, 3, 1, 5, 4, -1, }, b[16] = {0};
        void *a1, *b1;
        uint32_t tmp, cnt = 14;
    
        asm (
            "lea %[a], %[a1]\n\t"
            "lea %[b], %[b1]\n"
            "1:\n\t"
            "mov (%[a1]), %[tmp]\n\t"
            "add 8(%[a1]), %[tmp]\n\t"
            "cmp 4(%[a1]), %[tmp]\n\t"
            "jne 2f\n\t"
            "mov %[tmp], (%[b1])\n\t"
            "add $4, %[b1]\n"
            "2:\n\t"
            "add $4, %[a1]\n\t"
            "dec %[cnt]\n\t"
            "jnz 1b\n\t"
            : [cnt] "=&r" (cnt), [tmp] "=&r" (tmp),
              [a1] "=&r" (a1), [b1] "=&r" (b1),
              [b] "=m" (b)
            : [a] "m" (a));
    }
    Ответ написан
  • Что за ошибка в коде вложенного ассемблера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    asm (
        "mov a, %eax \n\t"
        "mov b, %ebx \n\t"
        "add %eax, %ebx \n\t"
        "mov %ebx, c \n\t"
      );


    Так в gcc не работает. Должно быть например так:
    asm (
        "mov %[a], %%eax \n\t"
        "mov %[b], %%ebx \n\t"
        "add %%eax, %%ebx \n\t"
        "mov %ebx, %[c] \n\t"
        : [c] "=rm" (c)
        : [a] "rm" (a), [b] "rm" (b)
        : "eax", "ebx", "cc"
      );

    Что это всё значит можно почитать тут.

    Компилирую, а тут фигня происходит:

    Ошибка говорит о том, что код попытался обратиться к глобальному символу a, но такого символа нет. Потому что переменная a размещена на стеке и символьного имени у неё и правда нет. Если бы она (вместе с b и c) была глобальной, всё равно была бы ошибка (по крайней мере при компиляции под 64 бита), но другая.
    Ответ написан
    3 комментария
  • В чем моя ошибка в AVR, где я должен зациклить, или что вообще сделать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот где код вырывается в память 0xfffff

    Вот в конце же, после последнего nop.
    Ответ написан
    Комментировать
  • Как написать программу со следующим алгоритмом (NASM assembler)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я не знаю, как сделать алгоритм для задачи

    в чём конкретно сложность?

    найти во введенной строке все цифры

    это понятно как сделать?

    для каждой найденной цифры установить в «1» в регистре ax бит, номер которого равен этой цифре.

    если известно значение цифры, то маску для нужного бита можно получить применив инструкцию shl к 1. маску можно добавить к значению регистра инструкцией or.

    Вывести на экран содержимое регистра ax в виде нулей и единиц

    проверять младший бит регистра (или старший, если хочется выводить биты от старших к младшим), выводить 0 или 1, сдвигать регистр вправо (или, соответственно, влево). повторять 16 раз.
    Ответ написан
    1 комментарий