ASM код в win32 приложении

Тема в разделе "WASM.BEGINNERS", создана пользователем Tohey, 5 окт 2006.

  1. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    Вот столкнулся с проблемой, win32 приложение вызывая ASM функцию выдаёт ошибку! Может нужно ещё какой то регистер спрятать в стэк?

    без возвращения значения ошибки нет...
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    pusha -> pushad
    popa -> popad
     
  3. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Проверил - у меня никаких ошибок. VS2003. Только смысла делать два раза подряд neg al я не понял...
     
  4. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31

    Я понял что ругается не на АСМ код, ошибка происходит на закоментированных строках.
    Ошибка типа: "попытка чтения по какому то там адресу..."

    neg 2 раза для того чтобы найти чётный ASKII символ(не изменяя его), ну а потом взвести в нём старший неиспользуемый бит(and al,0x80)...
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ???
     
  6. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    :lol:
    То есть найти символы с чётным количеством разрядов
     
  7. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Не, ошибка не в закоментированных участках. В этих участках происходит обращение по левому адресу, но это другое дело. Ошибка в формировании этого самого адреса - либо строки buf, либо индекса i. Т.е. либо индекс выходит за границы строки, причём довольно далеко, т.к. добирается до нераспределённых участков памяти, либо адрес buf сразу кривой. Запускаешь под отладчиком и убеждаешься...

    А про neg я так и не понял. У меня на машине neg al меняет в al биты 1 на 0, а 0 на 1. И всё. Т.е. два neg-а подряд просто вернут в al то, что там было. Как ты при этом умудряешься "найти символы с четным количеством битов" я не понял. В твоём асмовом коде нет ни одного условного перехода, так что не ясно, где именно символы с чётным количеством битов отделются от символов с нечётным количеством битов.

    Кроме того, and al, 0x80 это не совсем установка старшего разряда. Установкой будет or al, 0x80.
     
  8. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    Правильно, это инверсия разрядов регистра al! Но ещё эта команда устанавливает Parity Flag (флаг чётности) в регистре флагов, в зависимости от результата выполнения.

    полный код:
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Tohey
    Правильно, но еще флаг PF устанавливает куча других операций, не изменяющих регистр AL, в частности test al,al и cmp al,0
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    sergh
    У Вас какая-то особенная машина, раз вместо neg выполняет not :)
     
  11. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    Спасибо, теперь буду знать и перепишу на test.
    А вообще я за скоростью не гоняюсь и просто впихнул первую попавшуюся из списка команду которая меняет PF...
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    где в al один бит, и тот знаковый :)
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. jnp np
    2. np:
    хм. хитрая конструкция =)
     
  14. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    бугогагага.. я валяюсь(извините, если кого оскорбляю)... а что - убрать jnp не судьба?
     
  15. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    я дико извеняюсь перед всеми за невыполнимую и грубую ошибку :
    Раздел вроде для новичков, а ракритиковали по полной.
     
  16. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    дело в том, что, хотя между новичком и полным тупицей знака равенства нет, такое чувство, что большинство авторов топиков в BEGINNERS соревнуются в создании самых тупых топиков, показывая при этом полное отсутствие мозгов, вот народ и привык к такому положению дел и реагирует соответственно даже на вполне нормальные топики.
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    За что извинятся-то? Меня не уязвляет такой код :))
    Зато потом не будешь допускать таких ошибок.
     
  18. Tohey

    Tohey New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    31
    Лан проехали.
    Эт первый мой код на АСМе, просто поспешил выложить
     
  19. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    А, ну тогда извиняй... А на будущее так сказать, если видишь что-то вроде:

    Код (Text):
    1. jne NE
    2. je Equal
    Делай лучше:

    Код (Text):
    1. jne NE
    2. jmp Equal
    Ну или что-то в этом роде - скорость она тоже важна, да и просто не люблю грузить проц...
     
  20. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    обычно jmp equal не нужен, так как существует только 2 состояния %)