1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

bind cmd

Тема в разделе "NASM", создана пользователем Orbit, 14 дек 2016.

Метки:
  1. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Установил NASM, линкер от VS10 - все слинковалось:
    [​IMG]
    Нет.
    Также вместо mov нужно юзать lea либо mov без скобок и выравнивать стек.
     
  2. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Я вообще хотел собрать программу по лицензии BSD ну или хотя бы с использованием линкера GNU
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.474
    Адрес:
    Russia
    Про ошибку в WSADATA вы там точку поставили - может в этом проблема.
    Внимательнее будьте
     
  4. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Да, спасибо, вы очень внимательны.
    А с остальными двумя что не так?
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Попробуй -LARGEADDRESSAWARE:NO
     
  6. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Да действительно, это всё моя невнимательность
    но вот тут не пойму
    cmd.asm:47: error: non-constant argument supplied to TIMES

    stsockaddr_in:
    istruc sockaddr_in
    at sockaddr_in.sin_famlily, dd 0
    at sockaddr_in.sin_port, dd 0
    at sockaddr_in.sin_addr, dq 0
    at sockaddr_in.sin_zero, db 0
    iend

    ругается на at sockaddr_in.sin_famlily, dd 0
     
  7. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Всё разобрался вроде, много ошибок просто в коде грамматических
     
  8. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Поправил все грамматические ошибки, но всеравно mov , [WSADATA]
    0000000100402000 | mov rdx,qword ptr ds:[0] | rdx:&"/c/Users/hackd/Desktop/NASM/cmd"
     
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Ты вообще читаешь что тебе пишут? И не забудь
    Начало по крайней мере должно быть таким (не обязательно 0x28, любое число оканчивающееся на 0x8):
    Код (ASM):
    1. sub rsp , 0x28
    2. lea rdx , [ws_wsa]
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    Thetrik,
    это зависит от максимального количества параметров передаваемых процедуре -- 28h это для четырех параметров, для пяти и шести будет 38h и т.д
     
  11. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Заем из стека - характерно только для 64 бит версии? В 32 не встречал такого в начале программ.

    гугл "sub rsp начало программ 64", ясно понятно, можете не отвечать.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    да, для 64
     
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Имелся в виду конкретно его пример, все его функции принимают меньше 5 параметров, поэтому выравнивание нужно, т.к. стек сдвинут адресом возврата. А 0x28 это просто из привычки для shadow register space, даже если функция принимает 1 аргумент резервируется 32 байта.
     
  14. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Про смещение lea понял спасибо

    Код (ASM):
    1. extern WSAStartup
    2. extern WSACleanup
    3. extern socket
    4. extern Sleep
    5. extern ExitProcess
    6. extern accept
    7. extern listen
    8. extern bind
    9.  
    10. SECTION .bss
    11.  
    12. sockethandle: resd 1
    13.  
    14. SECTION .data
    15.  
    16. port: equ 777
    17.  
    18. struc WSADATA
    19. .wVersion: resw 1
    20. .wHighVersion: resw 1
    21. .szDescription: resb 256
    22. .szSystemStatus: resb 256
    23. .iMaxSockets: resd 1
    24. .iMaxUdpDg: resd 1
    25. .lpVendorInfo: resq 1
    26. endstruc
    27.  
    28. stWSADATA:
    29. istruc WSADATA
    30. at WSADATA.wVersion, dw 0
    31. at WSADATA.wHighVersion, dw 0
    32. at WSADATA.szDescription, db 0
    33. at WSADATA.szSystemStatus, db 0
    34. at WSADATA.iMaxSockets, dd 0
    35. at WSADATA.iMaxUdpDg, dd 0
    36. at WSADATA.lpVendorInfo, dq 0
    37. iend
    38.  
    39. struc sockaddr_in
    40. .sin_family: resd 1
    41. .sin_port: resd 1
    42. .sin_addr: resq 1
    43. .sin_zero: resb 8
    44. .size:
    45. endstruc
    46.  
    47. stsockaddr_in:
    48. istruc sockaddr_in
    49. at sockaddr_in.sin_family, dd 0
    50. at sockaddr_in.sin_port, dd 0
    51. at sockaddr_in.sin_addr, dq 0
    52. at sockaddr_in.sin_zero, db 0
    53. iend
    54.  
    55. struc in_addr
    56. .s_addr: resq 1
    57. endstruc
    58.  
    59. stin_addr:
    60. istruc in_addr
    61. at in_addr.s_addr, dq 0
    62. iend
    63.  
    64. SECTION .code
    65. global main
    66. main:
    67.  
    68. lea rdx , [WSADATA]
    69. mov rcx , 0x202
    70. call WSAStartup
    71.  
    72. mov r8 , 0
    73. mov rdx , 1
    74. mov rcx , 2
    75. call socket
    76.  
    77. mov sockethandle , eax
    78. mov dword [sockaddr_in.sin_family] , 1
    79. mov qword [sockaddr_in.sin_addr] , 0
    80.  
    81. mov ax , port
    82. xchg ah , al
    83. mov word [sockaddr_in.sin_port] , ax
    84.  
    85. mov r8 , sockaddr_in.size
    86. lea rdx , [sockaddr_in]
    87. mov ecx , sockethandle
    88. call bind
    89.  
    90. mov rdx , 13
    91. mov ecx , sockethandle
    92. call listen
    93.  
    94. mov r8 , 0
    95. lea rdx , [sockaddr_in]
    96. mov ecx , sockethandle
    97. call accept
    98.  
    99. mov rcx , 60000
    100. call Sleep
    101.  
    102. call WSACleanup
    103.  
    104. mov rcx , rax
    105. call ExitProcess

    cmd.asm:79: error: invalid combination of opcode and operands
    это mov sockethandle , eax
     
    Последнее редактирование модератором: 15 дек 2016
  15. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Код (ASM):
    1. mov [sockethandle] , eax
    Т.к. ты пишешь в ячейку по адресу sockethandle.
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    Thetrik,

    это я так, побрюзжать... NASM так же как и FASM самодостаточны, и умеют создавать экзе с ресурсами при этом не используя линкер и компилятор ресурсов. И там и там мощнейшая поддержка макросов


    PS
    Orbit,
    когда выбираешь код -- выбирай еще и язык или обрамляй текст программы тэгами [соdе=asm] и [/соdе]
     
  17. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    Код (ASM):
    1.  
    2. C:\Users\hackd\Desktop\NASM>gcc cmd.obj -lws2_32 -m64 -o cmd.exe
    3. cmd.obj:cmd.asm:(.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss'
    4. cmd.obj:cmd.asm:(.code+0x62): relocation truncated to fit: R_X86_64_32 against `.bss'
    5. cmd.obj:cmd.asm:(.code+0x71): relocation truncated to fit: R_X86_64_32 against `.bss'
    6. cmd.obj:cmd.asm:(.code+0x89): relocation truncated to fit: R_X86_64_32 against `.bss'
    7. collect2: error: ld returned 1 exit status
    8.  
     
    Последнее редактирование: 15 дек 2016
  18. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    669
    Не знаю как в GCC это делается, всю жизнь работаю в VS, но попробуй найти аналог.
     
  19. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    Orbit, это вроде то, с чего начинали, нельзя адресоваться напрямую, можно через регистры (см. стр. 1 обсуждения)

    ; надо бы мне перестать вангованием заниматься, а скачать Nasm и практиковаться
     
    Последнее редактирование: 15 дек 2016
  20. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    109
    Адрес:
    г. Москва
    C:\Users\hackd\Desktop\NASM>gcc cmd.obj -LARGE_ADDRESS_AWARE -lws2_32 -m64 -o cmd.exe
    cmd.obj:cmd.asm:dntknw:.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss'

    Мы уже решали эту проблему с _edge

    И там предлагают адресовать не напрямую смещение, а загонять его напр. в RAX, и адресовать уже по регистру, т.е. как [RAX]

    Но код изменился, конечно удобнее записывать в переменную