Перенос под 64 бита

Тема в разделе "WASM.BEGINNERS", создана пользователем cmpayc, 17 янв 2010.

  1. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Нашлась другая программа, которая тоже использует вставки на 32-битном ассемблере. http://zsnes.com/ Для работы требует несколько 32-битных библиотек, но собирается без установки 32-битного окружения. Ковыряю, как собирается она. Как минимум, требуются ключи GCC -m32 и -march-athlon64 и для Nasm -f elf. Правда, модуль обработки SPC в ней глючит :)
     
  2. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    s/-march-athlon64/-march=athlon64/
     
  3. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    cmpayc. совет один - не лепите в сишную прогу асмовый код. лучше перепишите всё на си.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    cupuyc
    cmpayc
    Или, если асм всё же необходим, вынести соответствующие функции в отдельный модуль и вызывать их по мере необходимости.
     
  5. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Полторы тысячи строк на ассемблере. Неохота переписывать :) Благо он отдельным файлом и линкуется в отдельную библиотеку. И, кажется, понял, как такие программы собирать.
     
  6. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Так там и сделано. Вопрос был в том, как это скомпилировать и слинковать, не ставя вторую ОС в чрут :) Предложенный выше оверлей требует пересобирать половину установленных пакетов, поэтому я его пока отключил обратно.
     
  7. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Ничего не работает из invoke api причём всё кампилится, в чём дело не пойму. :dntknw:

    Переделанный beer не пашет
    Код (Text):
    1. include '%fasm%\win64ax.inc'
    2. entry start
    3.  
    4. section '.idata' import data readable writeable
    5.         library kernel32,'KERNEL32.DLL',winmm,'WINMM.DLL'
    6.         include '%fasm%\api\kernel32.inc'
    7.         import winmm,mciSendString,'mciSendStringA'
    8.  
    9. _cmd_eject db 'set cdaudio door open',0
    10.  
    11. start:
    12.         invoke  mciSendString,_cmd_eject,0,0,0
    13. exit:
    14.         invoke  ExitProcess,0
    Добавление format PE64 GUI 5.0 ничего не даёт.

    И даже такое не пашет
    Код (Text):
    1. format PE64 GUI 5.0
    2. include '%fasm%\win64ax.inc'
    3. entry start
    4.  
    5. section '.idata' import data readable writeable
    6.         library kernel32,'KERNEL32.DLL'
    7.         include '%fasm%\api\kernel32.inc'
    8.  
    9. start:
    10.         invoke  Sleep,5000
    11. exit:
    12.         invoke  ExitProcess,0
    И тут я заметил, что с указанием секций
    section '.code' executable, что тоже важно и для .data
    стало заводиться даже без директивы format PE64,
    хотя в xp x86 это и без секций работало.
    Однако, api тут кривые. А какой смысл тогда в инклюдах!
    Удивительно, что из examples\win64 всё работает :]
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Походу только invoke Sleep,5000 и валидно!
    Почему же элементарное не пашет!
    invoke ShellExecute,NULL,NULL,lpFile,NULL,NULL,SW_HIDE
     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Semiono
    А что за код генерится на инвоке?
    В 64 другие конвенции вызова, может дело в этом?
     
  10. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    А я знаю! =)
    Какраз и хотелось бы услышать об этом. Я сам макросы в таком объёме читать не решаюсь.
    Просто хотелось побыстрому перекампилить все фишки что у меня накопились, и посмотреть
    что из этого получиться.
    Вообще спрашивается зачем тогда ворох целый инклюдов, причём они все в win64ax.inc включены,
    если всё надо пушем самому готовить! 8)
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Semiono
    гы... добавил, как в примере, в начале sub rsp, 8*5 - работает, падла... beer, по крайней мере пашет :)
     
  12. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    0_0 +1 :)
    Крута!
    А как называедся api которая разрешает приложению system32\ DLL юзать?
    Или апи запрещающая редирект в sysWOW64, или нет таких?
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Типа неработает почему-то

    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2. entry start
    3.  
    4. section '.rsrc' resource data readable
    5.         directory RT_ICON,icons,RT_GROUP_ICON,group_icons,RT_VERSION,versions
    6.  
    7.         resource icons,\
    8.         1,LANG_NEUTRAL,icon_data1,\
    9.         2,LANG_NEUTRAL,icon_data2,\
    10.         3,LANG_NEUTRAL,icon_data3,\
    11.         4,LANG_NEUTRAL,icon_data4
    12.         resource group_icons,17,LANG_NEUTRAL,main_icon
    13.         resource versions,1,LANG_NEUTRAL,version
    14.  
    15.         icon main_icon,\
    16.         icon_data1,'%fasm%\exec1.ico',\
    17.         icon_data2,'%fasm%\exec2.ico',\
    18.         icon_data3,'%fasm%\exec3.ico',\
    19.         icon_data4,'%fasm%\exec4.ico'
    20.  
    21.         versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
    22.                     'FileDescription','restart...',\
    23.                     'LegalCopyright','2001-2005 GmbH',\
    24.                     'FileVersion','1.0.0.0',\
    25.                     'ProductVersion','1.0.0.0',\
    26.                     'OriginalFilename','restart.exe',\
    27.                     'Company','Semiono'
    28.  
    29. section '.idata' import data readable writeable
    30.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    31.         include '%fasm%\api\kernel32.inc'
    32.         include '%fasm%\api\shell32.inc'
    33.  
    34. lpFile db 'shutdown.exe',0
    35. lpParameters db '-r -f -t 00',0
    36.  
    37. start:
    38.         invoke  ShellExecute,NULL,NULL,lpFile,lpParameters,NULL,SW_HIDE
    39. exit:
    40.         invoke  ExitProcess,0
    Бинарь лежит в system32, то-есть в пути, даже если кликнуть его не работает.
    Причём другие команды из ShellExecute() выполняются.
    У меня есть код програмной перезагрузки, но тут дело принципа почему это не пашет?
     
  14. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Semiono
    Потому что код положено размещать в секции с атрибутом executable.
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    774
    Да, точно! Я забыл, я заметил, что в x64 системе это более критично, сам заметил.
    В x86 это было по барабану. :) Угу! Ок!