ряд вопросов по FASM

Assembler programming questions
  • punk_joker
    Приведенный кусок кода правильный, однако есть вероятность что в части кода, который отсутствует, что то неправильно, так что без полной портянки ответ дать не могу. Также я не вижу каким способом ты получил данные находящиеся в EAX, после чтения корневой директории. Возможно проблема как раз в этом.

    З.Ы. Просьба в следующий раз применять тег CODE для цитируемых кусков кода, иначе форматирование сбивается и труднее воспринимать.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Вот весь набор исходников. Процедура GetDisk из tmpdisk.asm
    Attachments
    Tmpdisk.7z (19.39 KiB)
    Downloaded 382 times
    to infinity and beyond
  • punk_joker
    Ну, так правильно - сам же затер root_pach, когда запустил процедуру convert. В результате читается дефолтный накопитель, а это в текущей системе рамдиск - как раз 75.

    З.Ы. В таких непонятных ситуациях полезно бывает на доску выводить еще и сам путь. Ситуация, когда одни данные затирают другие, когда они на одном общем куске памяти находятся, вполне частая вещь.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • получил список устройств через Ф70.1, посмотрел в отладчике, все нормально. Допустим в eax, адрес по которому лежит имя устройства. Как вывести на доску отладки?
    to infinity and beyond
  • mov edx, eax
    call debug_outstr
  • punk_joker
    Лучше сразу переходи на FDO. Там более удобные макросы.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • В eax лежит адрес строки с именем устройства ( получено ф70.1) Мне надо узнать, является ли первая буква имени буквой t.
    Пишу:
    cmp eax, 't'
    jnz @f
    print '1'
    @@:
    какието действия

    но в результате выполнения ничего не выводится (т.е. 1 не печатается на доску), всегда перескакивает на метку, хотя должно быть одно совпадение.
    to infinity and beyond
  • punk_joker
    лежит адрес строки

    Code: Select all

    cmp [eax], byte 't'
    Ты точно на Юрова не потратил время.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Подскажите как работает следующая инструкция:
    rep movsb
    to infinity and beyond
  • punk_joker wrote:Подскажите как работает следующая инструкция:
    rep movsb
    Данная инструкция побайтово копирует блок памяти, который начинается с адреса ds:esi в блок памяти по адресу es:edi, размер блока находится в ecx (количество байт). Это общая суть того, для чего эта инструкция обычно используется.

    Если более подробно, то сначала стоит рассмотреть, что делает команда movsb без префикса rep:

    1) Берет байт по адресу ds:esi и записывает его по адресу es:edi.
    2) Смотрит на флаг DF (Direction flag), если флаг установлен в 0 (инструкцией cld), то значения в регистрах esi и edi увеличиваются на 1. Если DF=1 (установить DF в 1 можно инструкцией std), то значения в esi и edi уменьшаются на 1. То есть, с помощью DF=1 можно копировать байты, начиная с конца (esi и edi в этом случае указывают на конец блоков и двигаются в сторону уменьшения адресов).

    Префикс rep заставляет процессор выполнить инструкцию movsb то количество раз, которое указано в ecx (то есть образуется цикл). При каждом выполнении ecx уменьшается на 1 и цикл останавливается, когда ecx становится равен 0.

    Еще есть аналогичные инструкции movsw и movsd, которые копируют по 2 и 4 байта за раз. esi и edi при этом тоже увеличиваются/уменьшаются на 2 или 4, по очевидным причинам.

    С точки зрения прикладных программ на регистры ds и es можно не обращать особого внимания, так как обычно ими заведует ОС.

    Данный пост может содержать неточности/неправильные формулировки, автор ответственности не несет :)
    Но в целом, кажется, я описал все довольно подробно и без фактических ошибок.
  • Имеется массив координат кнопок по х и у
    pos_x db 13, 13, 13, 83
    pos_y db 60, 85, 110, 60
    (кнопок на самом деле 12)
    Размеры скажем 60 по х, 20 по у
    так вот, как првильней всего будет их создать?
    )
    to infinity and beyond
  • punk_joker wrote:Имеется массив координат кнопок по х и у
    pos_x db 13, 13, 13, 83
    pos_y db 60, 85, 110, 60
    (кнопок на самом деле 12)
    Размеры скажем 60 по х, 20 по у
    так вот, как првильней всего будет их создать?
    )
    Как факт, последовательно, при условие, что окна без наложения друг на друга.
    Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!
  • Я так понял, это сетка кнопок 4*3, тогда лучше не массивом, а циклом
    http://pastebin.com/7xWNLYCq

    Code: Select all

    macro cmpe a, b, c {
      cmp   a, b
      je    c
    }
    
    macro cmpne a, b, c {
      cmp   a, b
      jne   c
    }
    
      mov   eax, 8
      mov   edx, 0x10 ; номер
      mov   edi, 13 ; x
      mov   esi, 60 ; y
    
    .loop_start:
      mcall , <edi, 32>, <esi, 16>
    
      inc   edx
      add   edi, 70
      cmpne edi, 293, @f  ;; if x === 13 + 70 * 4
      mov   edi, 13
      add   esi, 25
      cmpe  esi, 135, .loop_end ;; if y === 60 + 25 * 3
    @@:
      jmp   .loop_start
    .loop_end:
    писал на коленке, так что может не работать, но суть уловить можно
  • Спасибо. Хватит и этого.
    to infinity and beyond
  • Who is online

    Users browsing this forum: No registered users and 2 guests