Я разве так написал? Код (Text): -LARGEADDRESSAWARE:NO Я вообще так делаю: Код (Text): nasm code.asm -f win64 -o code.obj ink code.obj Ws2_32.lib Kernel32.lib -OUT:code.exe -MACHINE:X64 -ENTRY:main Во-вторых, зачем тебе хранить в секции данных локальные переменные?
а как хранятся локальные переменные в nasm ? Может попробывать взять другой линкер? но gcc мне нравится : (
там справка должна быть, поищи в примерах использование local, должно быть что-то типа Код (ASM): DlgFunc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL hLib:DWORD LOCAL buffer[128]:byte LOCAL buffer1[128]:byte LOCAL rect:RECT . . .
Попробуй GoLink Код (Text): nasm code.asm -f win64 -o code.obj GoLink code.obj Ws2_32.dll Kernel32.dll /ENTRY:main Вот с таким кодом: Код (ASM): extern WSAStartup extern WSACleanup extern WSAGetLastError extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind struc in_addr .s_addr: resd 1 .size: endstruc struc sockaddr .sin_family: resw 1 .sin_port: resw 1 .sin_addr: resb in_addr.size .sin_zero: resb 8 .size: endstruc struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resw 1 .iMaxUdpDg: resw 1 .lpVendorInfo: resq 1 .size: endstruc SECTION .bss ws_addr: resb sockaddr.size ws_wsa: resb WSADATA.size SECTION .code port: equ 777 global main main: sub rsp , 0x28 lea rdx , [ws_wsa] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov r13 , rax mov dword [ws_addr + sockaddr.sin_family] , 1 mov qword [ws_addr + sockaddr.sin_addr] , 0 mov ax , port xchg ah , al mov [ws_addr + sockaddr.sin_port] , ax mov r8 , sockaddr.size lea rdx , [ws_addr] mov rcx , r13 call bind call WSAGetLastError mov rdx , 13 mov rcx , r13 call listen mov r8 , 0 lea rdx , [ws_addr] mov rcx , r13 call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx,rax call ExitProcess
Теперь шаг 2 - отладка, или "почему никто не отвечает в телнет" До шага 3 - прячем от АВ, далеко. Дойдем ли до пряток импорта?
Попробовал, всеравно та же ошибка: cmd.obj:cmd.asm.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss'
Ну короче, эта ошибка связана с тем, что вы используете адресацию , где адрес 1 операнда 64 а адрес второго 32. Найдите эти инструкции и измените их. В общем как запостите эти строки сюда, мы вам покажем как их поменять.
Это строки Код (ASM): SECTION .bss sockethandle: resd 1 ... mov dword [sockethandle] , eax и mov ecx , sockethandle
Вообщем с кодом Thetrik, если через gcc, то так сработает, удобно через bat файл, пропиши переменные окружения до nasm в PATH и до папки с ld (это стандартный линковщик gcc, в nasm-e он вроде тоже присутствует), пути до библиотек поправь... Собственно объектный файл нужен в формате coff поскольку ld работает с ними... Код (Text): nasm test.asm -f win64 -o test.o ld -emain -o test.exe test.o -s -lws2_32 -lkernel32 -LC:\MinGW\x86_64-w64-mingw32\lib PAUSE
Ну все понятно. У вас три варианта. 1) Перенести переменную в .data 2) Перенести переменную в стек 3) заменить код на следующий Код (ASM): SECTION .bss sockethandle: resq 1 ... mov [sockethandle] , rax и mov rcx , sockethandle ;только тут наверно всеже логчнее [sockethandle]. Но я логику кода не читал, смотрите сами. Смысл в том, что в 64 битном режиме у вас хендлы тоже имеют размер 64 бита. А ошибка из за того, что bss требует выравнивания по размеру учетверенного слова. В общем попробуйте. Я не запускал, и вообще не смотрел особо ваш код, все советы даю только исходя из ошибок и моих предположений. Во первых - дать вам рабочую версию под gcc так как вы хотите - слишком просто для вас. Нет момента обучения. Так что - вы уж постарайтесь, подумать. Думать - это не простое занятие, видимо по этому этим занимаются столь мало людей.)
Есть еще ulink ftp://ftp.styx.cabel.net/pub/UniLink опции: ulink.exe -q -w- -Z- -ZX- -ap -Tpe+ -eMain "cmd.obj" kernel32.dll ws2_32.dll
В общем сделал пока без переменных Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .data port: equ 777 struc WSADATA .wVersion: resw 1 .wHighVersion: resw 1 .szDescription: resb 256 .szSystemStatus: resb 256 .iMaxSockets: resd 1 .iMaxUdpDg: resd 1 .lpVendorInfo: resq 1 endstruc stWSADATA: istruc WSADATA at WSADATA.wVersion, dw 0 at WSADATA.wHighVersion, dw 0 at WSADATA.szDescription, db 0 at WSADATA.szSystemStatus, db 0 at WSADATA.iMaxSockets, dd 0 at WSADATA.iMaxUdpDg, dd 0 at WSADATA.lpVendorInfo, dq 0 iend struc sockaddr_in .sin_family: resd 1 .sin_port: resd 1 .sin_addr: resq 1 .sin_zero: resb 8 .size: endstruc stsockaddr_in: istruc sockaddr_in at sockaddr_in.sin_family, dd 0 at sockaddr_in.sin_port, dd 0 at sockaddr_in.sin_addr, dq 0 at sockaddr_in.sin_zero, db 0 iend struc in_addr .s_addr: resq 1 endstruc stin_addr: istruc in_addr at in_addr.s_addr, dq 0 iend SECTION .code global main main: lea rdx , [WSADATA] mov rcx , 0x202 call WSAStartup mov r8 , 0 mov rdx , 1 mov rcx , 2 call socket mov r15 , rax mov dword [sockaddr_in.sin_family] , 1 mov qword [sockaddr_in.sin_addr] , 0 mov ax , port xchg ah , al mov word [sockaddr_in.sin_port] , ax mov r8 , sockaddr_in.size lea rdx , [sockaddr_in] mov rcx , r15 call bind mov rdx , 13 mov rcx , r15 call listen mov r8 , 0 lea rdx , [sockaddr_in] mov rcx , r15 call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx , rax call ExitProcess Код (Text): nasm cmd.asm -f win64 -o cmd.obj gcc cmd.obj -lws2_32 -m64 -o cmd.exe pause Не понимаю как указать ссылку на структуру ? Вываливается вот на этом месте и таких ошибок в коде несколько: И socket handle в r15 FFFFFFFFFFFFFFFF
Лучше конечно использовать r13 так как r15 занят, постоянно меняется Но всё жеж, почему call socket возвращает FFFF , вроде вызываю правильно
Это вам винда сообщает ошибку INVALID_SOCKET. Юзайте функцию WSAGetLastError, чтоб понять какая ошибка произошла. Ну и что это у вас за тип протокола такой? (R8 параметр содержит 0).ек Докуметация конечно говорит, что можно оставить 0, на выбор ОС. Но это не тот случай, давайте просто делать указывая явно, все параметры. Там надо 6 поставить, если у вас TCP протокол. Изучайте: тут А чтоб не париться с регистрами - запихивайте данные в стек, что мешает?
push pop? но его придется класть туда несколько раз, мне кажется лучше через r13 или положить один раз и высчитывать смещение? но это мутарно писать
Знаете, на асме все муторно писать. Скажу вам честно, как человек, который проходил и асм и сокеты, и че только не изучал я, ей богу, аж страшно. Сократ бы свернулся в трубочку от такого количества инфы... Так вот - асм и сокеты, это очень такая гремучая смесь. Любая ошибка там стоит огромного кол-ва времени и нервов. По этому мой вам совет. Напишите эту программу на Си. Поймите для начала как работают сокеты. А потом уже переведите на асм (при этом изучив ассемблер в том числе 64 битный, а так же архитектуру компа, как работать со стеком. Просто те, кто уже знают сокеты, не задают вопрос - а почему возвращается -1... Это уже в коре головного мозга прошито как отче наш.
Такой вариант работает Код (ASM): global Main default rel ;kernel32.dll extern \ RtlZeroMemory,\ Sleep,\ ExitProcess ;ws2_32.dll extern \ WSAStartup,\ WSACleanup,\ socket,\ accept,\ listen,\ bind struc WSADATA .wVersion resw 1 .wHighVersion resw 1 .szDescription resb 256+1 .szSystemStatus resb 128+1 .iMaxSockets resw 1 .iMaxUdpDg resw 1 alignb 8 .lpVendorInfo resq 1 endstruc struc SOCKADDR_IN .sin_family resw 1 .sin_port resw 1 .sin_addr resq 1 .sin_zero resb 8 endstruc struc S_un_b .s_b1 resb 1 .s_b2 resb 1 .s_b3 resb 1 .s_b4 resb 1 endstruc struc S_un_w .s_w1 resw 1 .s_w2 resw 1 endstruc struc IN_ADDR .S_un resb S_un_b_size .s_addr resq 1 endstruc SECTION .code Main: struc .locals resq 4 ;.5 resq 1 ;.6 resq 1 ;.7 resq 1 ;.8 resq 1 .wsadata resb WSADATA_size .sockaddr_in resb SOCKADDR_IN_size .in_addr resb IN_ADDR_size alignb 16 resq 1 endstruc sub rsp,.locals_size lea rcx,[rsp+.wsadata] mov edx,WSADATA_size+SOCKADDR_IN_size+IN_ADDR_size call RtlZeroMemory mov ecx,0x2020 ;2.2 lea rdx,[rsp+.wsadata] call WSAStartup mov ecx,2 ;FWP_IP_VERSION_NONE mov edx,1 ;SOCK_STREAM xor r8,r8 ;IPPROTO_IP call socket mov rbp,rax mov word[rsp+.sockaddr_in+SOCKADDR_IN.sin_family],2 ;AF_INET mov word[rsp+.sockaddr_in+SOCKADDR_IN.sin_port],777 mov rcx,rbp lea rdx,[rsp+.sockaddr_in] mov r8d,SOCKADDR_IN_size call bind mov rcx,rbp mov edx,13 call listen mov rcx,rbp lea rdx,[rsp+.sockaddr_in] xor r8,r8 call accept call WSACleanup mov ecx,60000 call Sleep mov rcx,rax call ExitProcess add rsp,.locals_size ret