Установил NASM, линкер от VS10 - все слинковалось: Нет. Также вместо mov нужно юзать lea либо mov без скобок и выравнивать стек.
Да действительно, это всё моя невнимательность но вот тут не пойму 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
Поправил все грамматические ошибки, но всеравно mov , [WSADATA] 0000000100402000 | mov rdx,qword ptr ds:[0] | rdx:&"/c/Users/hackd/Desktop/NASM/cmd"
Ты вообще читаешь что тебе пишут? И не забудь Начало по крайней мере должно быть таким (не обязательно 0x28, любое число оканчивающееся на 0x8): Код (ASM): sub rsp , 0x28 lea rdx , [ws_wsa]
Thetrik, это зависит от максимального количества параметров передаваемых процедуре -- 28h это для четырех параметров, для пяти и шести будет 38h и т.д
Заем из стека - характерно только для 64 бит версии? В 32 не встречал такого в начале программ. гугл "sub rsp начало программ 64", ясно понятно, можете не отвечать.
Имелся в виду конкретно его пример, все его функции принимают меньше 5 параметров, поэтому выравнивание нужно, т.к. стек сдвинут адресом возврата. А 0x28 это просто из привычки для shadow register space, даже если функция принимает 1 аргумент резервируется 32 байта.
Про смещение lea понял спасибо Код (ASM): extern WSAStartup extern WSACleanup extern socket extern Sleep extern ExitProcess extern accept extern listen extern bind SECTION .bss sockethandle: resd 1 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 sockethandle , eax 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 ecx , sockethandle call bind mov rdx , 13 mov ecx , sockethandle call listen mov r8 , 0 lea rdx , [sockaddr_in] mov ecx , sockethandle call accept mov rcx , 60000 call Sleep call WSACleanup mov rcx , rax call ExitProcess cmd.asm:79: error: invalid combination of opcode and operands это mov sockethandle , eax
Thetrik, это я так, побрюзжать... NASM так же как и FASM самодостаточны, и умеют создавать экзе с ресурсами при этом не используя линкер и компилятор ресурсов. И там и там мощнейшая поддержка макросов PS Orbit, когда выбираешь код -- выбирай еще и язык или обрамляй текст программы тэгами [соdе=asm] и [/соdе]
Код (ASM): C:\Users\hackd\Desktop\NASM>gcc cmd.obj -lws2_32 -m64 -o cmd.exe cmd.obj:cmd.asm:(.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.code+0x62): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.code+0x71): relocation truncated to fit: R_X86_64_32 against `.bss' cmd.obj:cmd.asm:(.code+0x89): relocation truncated to fit: R_X86_64_32 against `.bss' collect2: error: ld returned 1 exit status
Orbit, это вроде то, с чего начинали, нельзя адресоваться напрямую, можно через регистры (см. стр. 1 обсуждения) ; надо бы мне перестать вангованием заниматься, а скачать Nasm и практиковаться
C:\Users\hackd\Desktop\NASM>gcc cmd.obj -LARGE_ADDRESS_AWARE -lws2_32 -m64 -o cmd.exe cmd.obj:cmd.asm.code+0x2a): relocation truncated to fit: R_X86_64_32 against `.bss' Мы уже решали эту проблему с _edge И там предлагают адресовать не напрямую смещение, а загонять его напр. в RAX, и адресовать уже по регистру, т.е. как [RAX] Но код изменился, конечно удобнее записывать в переменную