Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2010, 01:20   #1
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию ASM и WinSock

И снова здрасьте.Лазил по гуглу,но так ничего вразумительного и не нашёл,кроме иходников,а нужны объяснения = (.Во всяком случае,на русском не нашёл)).Как работать с сим чудом на MASM ?( Все исходники магическим образом написаны на масм).
Wardrag вне форума Ответить с цитированием
Старый 15.08.2010, 06:50   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Также как и в С, С++, Делфи... только с другим синтаксисом операторов. Это ВинАПИ.
p51x вне форума Ответить с цитированием
Старый 15.08.2010, 07:51   #3
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Цитата:
Лазил по гуглу,но так ничего вразумительного и не нашёл,кроме иходников,а нужны объяснения
Нужно было не по гуглу, а сразу сюда: http://wasm.ru/publist.php?list=16
r9m вне форума Ответить с цитированием
Старый 15.08.2010, 18:08   #4
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию

Пасип за инфу,но возникла трабла с васстартапом:

wsa_ver dw 2.2,0
WSADATA ws <>

invoke WSAStartup,wsa_ver,offset ws

второй параметр структура и требует адрес.Также было написано,что можно параметр опустить,т.е. указать нулл или ноль.
Версия - слово (WORD)


Выдало:


Код:

C:\winasm\Projects\server.asm(16) : error A2008: syntax error : WSADATA
C:\winasm\Projects\server.asm(18) : error A2006: undefined symbol : ws
C:\winasm\Projects\server.asm(18) : error A2114: INVOKE argument type mismatch : argument : 2
C:\winasm\Projects\server.asm(18) : error A2107: cannot have implicit far jump or call to near label
Гы)Чето похоимичил и получилось такое:

Код:

.data

wsa_ver dw 2.2,0
check db "rabotaet",0
check_2 db "ne rabotaet",0

.data?

wdata dd ?


.code

start:

invoke WSAStartup,2h,offset wdata

.if eax == 0

invoke MessageBox,0,offset check,offset check,0
invoke ExitProcess,0

.else


invoke MessageBox,0,offset check_2,offset check_2,0
invoke ExitProcess,0


.endif
Работает без ошибок : )


Вот только непонятно - по описанию функции,она требует указатель на структуру:

int WSAStartup( WORD wVersionRequested, (in) LPWSADATA lpWSAData (out) );


А где я в коде указал структуру ?! ( Кстати,при всём желании,синтаксис её объявления знаю только nameofstruct struct nameofstruct EndS - других не знаю(

ЗЫ: Судя по проототипу,всастартап принимает два параметра типа дворд и возвращает целочисленное значение,в данном случае - 0.

При объявлении SOCKET и sockaddr_in,тоже выдаёт ошибки:

s1 SOCKET ?
s2 SOCKET ?
sin1 sockaddr_in <>
sin2 sockaddr_in <>

в секции .data?

Последний раз редактировалось Stilet; 16.08.2010 в 08:27.
Wardrag вне форума Ответить с цитированием
Старый 15.08.2010, 19:06   #5
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

нигде. ты ее не обьявил даже. исправь

"wdata dd ?" на "wData WSADATA <>" <<- это и есть. и перемести это в .data. А типа работает у тебя из за того, что ты указатель послал конечно, но указатель на что? На двойное слово. Процессору пофик чё куда пихать, указатель - это число. Вообще там на wasm.ru всё прекрасно написано.

Цитата:
wsa_ver dw 2.2,0
wsa_ver dw 202h

Цитата:
s1 SOCKET ?
s2 SOCKET ?
sin1 sockaddr_in <>
sin2 sockaddr_in <>
По какой статье ты занимаешься и какие ошибки?

Цитата:
sin1 sockaddr_in <>
sin2 sockaddr_in <>
Их в .data

Цитата:
s1 SOCKET ?
s2 SOCKET ?
Это что? Дескрипторы сокетов? У тебя чё там из Си примеры? Используй DWORD.

Последний раз редактировалось r9m; 15.08.2010 в 19:18.
r9m вне форума Ответить с цитированием
Старый 15.08.2010, 19:18   #6
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию

http_://www.ronybc.8k.com/sparcz.htm - Пример
http_://club.shelek.ru/viewart.php?id=35 - Статья

На васм слишком сложно описано...Хоть и не всеми.Ищу где попроще.
Ща вроде поправил ошибки вообще пропали.

Не могу понять,что за *<>* такое и чем он от *?* отличается и почему *<>* нельзя применить к этим апи структурам.Последнее вроде показывает,что данные неинициализированы(пустые в общем)

Да ещё и бред с типами какой-то.В С/С++ видел объявления WORD,BYTE,стоящие впереди имени переменной,хотя должно быть выражение вида имя параметира тип параметра..

Мне всего-то нужно открыть конкретный порт на своей машине,соединиться с 80-ым портом удаленного сервера,получить ответ и вывести его : )

Последний раз редактировалось Stilet; 16.08.2010 в 08:29.
Wardrag вне форума Ответить с цитированием
Старый 15.08.2010, 19:46   #7
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Цитата:
Да ещё и бред с типами какой-то.В С/С++ видел объявления WORD,BYTE,стоящие впереди имени
Это верно для си\си++. А причём тут вообще они?

Цитата:
Не могу понять,что за *<>* такое и чем он от *?* отличается и почему *<>* нельзя применить к этим апи структурам
Как раз к структурам <> и применяется.

Ты подключил себе в проект

wsock32.inc
wsock32.lib ?

Последний раз редактировалось r9m; 15.08.2010 в 19:48.
r9m вне форума Ответить с цитированием
Старый 15.08.2010, 19:49   #8
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию

Ой,не заметил втоего сообщения.Да,подключил9покопавшись в описании).Пока вот что получилось:

Код:

.486
.model flat,stdcall



include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\ws2_32.inc
include \masm32\include\wsock32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
includelib \masm32\lib\ws2_32.lib
includelib \masm32\lib\wsock32.lib

.data

wdata WSADATA <>
check db "rabotaet",0
check_2 db "ne rabotaet",0
server_ip db

.data?

s1 SOCKET ?
s2 SOCKET ?
sin1 sockaddr_in <>
sin2 sockaddr_in <>

.code

start:

invoke WSAStartup,202h,offset wdata

.if eax == 0

je continue

.else

invoke ExitProcess,0

.endif


continue:


invoke socket,AF_INET,SOCK_STREAM,0h
mov s1,eax
mov sin1.sin_family,AF_INET
invoke htons,80
mov sin1.sin_port,ax
mov sin1.sin_addr

end continue
end start
end

Не знаю,как в sin_addr засунуть адрес нужного мне удаленного веб сервера(гугла к примеру).

Последний раз редактировалось Wardrag; 15.08.2010 в 19:52.
Wardrag вне форума Ответить с цитированием
Старый 15.08.2010, 19:56   #9
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

доступ к полям структур осуществляется через точку. Нужно внимательно читать статью, ссылку на которую ты дал. Там сказано:

Цитата:
//адрес сервера. Т.к. TCP/IP представляет адреса в числовом виде, то для перевода
// адреса используем функцию inet_addr.
Очень нужно тебе подлатать основы ассемблера. Удачи.
r9m вне форума Ответить с цитированием
Старый 15.08.2010, 21:16   #10
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию

про структуры там оч мало написано(

Код:
.486
.model flat,stdcall



include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\ws2_32.inc
include \masm32\include\wsock32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
includelib \masm32\lib\ws2_32.lib
includelib \masm32\lib\wsock32.lib

.data

        ip      db '127.0.0.1', 0
        wdata   WSADATA <>
        saddr   sockaddr_in <>
        hello   db 'GET http://localhost/hello.php HTTP/1.0', 10, 13,'Host: localhost', 13,10,13,10,0
        
        
        .data?
        
        sock dd ?
        
        .code
        
        
       invoke  WSAStartup,0101h,offset wdata
        invoke  socket, AF_INET, SOCK_STREAM, 6
        mov     [sock], eax
        mov     [saddr.sin_family], AF_INET
        invoke  htons, 80
        mov     [saddr.sin_port], ax
        invoke  inet_addr, ip
        mov     [saddr.sin_addr], eax
        invoke  connect, [sock], saddr, sizeof.sockaddr_in
        invoke  lstrlen
        invoke  send, [sock], hello, eax,0
        invoke  closesocket, [sock]
        invoke  ExitProcess, 0
        
       

end start
end
Нашёл и переделал под себя,но не работает.Интернал ассемблер еррор в функции коннект() (Впервые лицезрею)
Wardrag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Winsock n3sh C/C++ Сетевое программирование 2 25.07.2010 17:55
WinSock ImmortalAlexSan Работа с сетью в Delphi 7 06.06.2010 22:41
WinSock ImmortalAlexSan Работа с сетью в Delphi 1 11.05.2010 14:42
WinSock profi Win Api 8 11.01.2010 21:13
WinSock Killbrum Win Api 1 18.10.2009 15:15