Ответы пользователя по тегу Assembler
  • Для чего нужен ассемблер?

    15432
    @15432
    Системный программист ^_^
    А ещё знание ассемблера нужно, если вы хотите понять, как работает та или иная скомпилированная программа (и затем написать схожую по функциональности свою или модифицировать эту).
    В сфере информационной безопасности обязательно. Простой пример - в лаборатории Касперского вручную анализировать неизвестные вирусы. (если интересно, ЛК проводит курсы по этой теме и нанимает на стажировку)
    Ответ написан
    Комментировать
  • Сложить две строки?

    15432
    @15432
    Системный программист ^_^
    конкатенация?
    1) выделить память под новую строку длины, равной сумме длин двух первых строк (+ 1)
    2) скопировать первую строку в начало выделенной памяти
    3) скопировать вторую строку сразу после первой строки в новом буфере
    4) не забыть терминирующий ноль в конце
    Ответ написан
  • Как выполнить ассемблерную команду в Java или C++?

    15432
    @15432
    Системный программист ^_^
    Это вам нужно интерпретатор ассемблера писать. И да, он по сути состоит из кучи кейсов.
    Ответ написан
  • Правильно ли я понял как устроена RAM?

    15432
    @15432
    Системный программист ^_^
    -- Просьба отвечать да или нет и не углубляться.
    как хотите

    1) нет
    2) да
    3) и да и нет
    4) да
    Ответ написан
    3 комментария
  • Что означает DS: в языке ассемблера?

    15432
    @15432
    Системный программист ^_^
    Программе при запуске операционной системой выделяется участок адресов физической памяти. Внутри программа оперирует адресами вида 4020D8, но реальный физический адрес переменной будет [ds]+4020D8, ds это тоже регистр, в котором записан адрес "начала" сегмента данных, того самого диапазона адресов, выделенного программе. Ну это если по-простому
    Ответ написан
    Комментировать
  • Как оборудование "понимает" программу?

    15432
    @15432
    Системный программист ^_^
    Микроконтроллер не понимает, а тупо исполняет инструкции. Это ваша программа должна правильно сконфигурировать аппаратный порт микроконтроллера, чтобы на его выходе появилась логическая единица и светодиод зажёгся.
    Порядок действий отличается в зависимости от микроконтроллера. Где-то достаточно записать бит по определенному адресу памяти, где-то используются специальные ассемблерные команды для управления портами, и т.д.

    Программируется всё это обычно на уровне абстракций, с использованием готовых библиотек. Тот же Arduino поглядите. Глубокие знания электроники требуются для разработки устройств с этими микроконтроллерами.
    Ответ написан
  • Как записать в EEPROM?

    15432
    @15432
    Системный программист ^_^
    Описание недостаточно подробное - какая архитектура, что записать в порт, где он находится, в чем заключается затруднение, и т.д.

    Ну вот, например, код PowerPC:
    li r4, source_data_address-4
    li r5, data_size
    mtctr r5
    li r6, 0
    read_loop:
    lbzu r3, 4(r4) //читаем побайтно и суммируем
    add r6, r6, r3
    bdnz read_loop
    andi r3, r6, 0x10 //проверяем пятый бит
    beq skip_write
    li r4, portb_address
    stw r6, 0(r4) //запишем сумму в адрес порта
    skip_write:
    blr
    Ответ написан
    Комментировать
  • Чтение и запись в память(озу) на FASM?

    15432
    @15432
    Системный программист ^_^
    MyVar dq 0
    mov rax, MyVar ; поместить в rax адрес MyVar

    MyVar dq 0
    mov [MyVar], rax ; записать в адрес MyVar содержимое регистра rax

    MyVar dq 0
    mov rax, [MyVar] ; прочитать в регистр rax значение по адресу MyVar

    MyVar dq 0
    mov MyVar, rax ; присвоить адресу (константному числу) значение из регистра rax ?? - ошибка
    Ответ написан
  • Как работает этот assembler code?

    15432
    @15432
    Системный программист ^_^
    На Си это выглядит примерно как

    int temp[10];
    int i ;
    for ( i = 0; i != 10; ++i)
    {
    temp[i] = i + 48;
    //Не уверен, может даже *(int*)((char*)temp + i) = i + 48
    }

    Единственное сомнение по поводу +eax... Для индексации dword вроде надо еще на 4 умножить

    В любом случае, eax модифицируется только в команде inc
    Ответ написан
  • Ассемблер, как решить задачу?

    15432
    @15432
    Системный программист ^_^
    Сравнение происходит действительно через cmp, но дальнейший прыжок (jmp) можно сделать по нескольким условиям. Команда cmp выполняет обычное вычитание, и устанавливает флаги в соответствии с результатом. Среди флагов есть, например, ZF - Zero Flag, устанавливается, если результат равен нулю, то есть сравниваемые числа были равны. Вы как раз применили команду jz - Jump if Zero (перейти, если ноль), проверяющую именно этот флаг.
    Для сравнения "меньше либо равно" следует использовать команду jle (Jump if Less or Equal), переход на указанный в ней адрес произойдет только если в сравнении первое число было меньше или равно второму.
    Другие варианты команд перехода расписаны здесь
    Ответ написан
  • Как поместить значение из регистра в память, если в регистре лежит адрес?

    15432
    @15432
    Системный программист ^_^
    Сначала из адреса в регистр, потом из регистра в память

    MOV EAX, [ECX]
    MOV lnx, EAX
    Ответ написан