首页
社区
课程
招聘
[求助]汇编高手请进!
发表于: 2005-8-23 18:15 7274

[求助]汇编高手请进!

2005-8-23 18:15
7274
小弟我是一个菜鸟,刚刚开始学习汇编.最近我用汇编编写了一个小程序.这个程序非常的简单,就是打开本机的1984端口,然后一有连接就发送一个字符串.奇怪的是这个程序编译和链接都没有问题,但就是不能打开端口,而我用C++编写的一个几乎相同的程序却可以正常运行.这让我百思不得其解,实在是不知道究竟是哪里出了问题.源程序如下,还请各位多多指教,在下感激不尽!

;test.asm
        .386
        .model flat,stdcall
         option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                kernel32.inc
includelib        kernel32.lib
include                wsock32.inc
includelib        wsock32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TCP_PORT        equ        1999

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?

hSocket                dd        ?
hnewSocket        dd        ?
       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szhellow         db     'hellow',0

        .code
_SOCKET                proc
                local          @stmysockaddr:sockaddr_in
                local     @sttheirsockaddr:sockaddr_in
                local     @stWsa:WSADATA
        invoke  RtlZeroMemory,addr @stmysockaddr,sizeof  @stmysockaddr
        invoke        WSAStartup,101h,addr @stWsa
        invoke        socket,AF_INET,SOCK_STREAM,0
        mov        hSocket,eax
        invoke  htons,TCP_PORT
        mov     @stmysockaddr.sin_port,ax
        mov     @stmysockaddr.sin_family,AF_INET
        mov     @stmysockaddr.sin_addr,INADDR_ANY
        invoke  bind,hSocket,addr @stmysockaddr,sizeof @stmysockaddr
        invoke  listen,hSocket,3
        invoke  accept,hSocket,addr  @sttheirsockaddr,sizeof @sttheirsockaddr
        mov     hnewSocket,eax
        invoke   send,hnewSocket,addr szhellow,20,0
        invoke  closesocket,hSocket
        invoke  closesocket,hnewSocket
        ret
       
_SOCKET  endp       
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
start:
        call   _SOCKET
        invoke ExitProcess,NULL
       
       
end  start

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我看你已经是个高手了

你学这些东西学了多久了?
2005-8-25 20:32
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学到第七章了...但学过了又忘了...痛苦呀
2005-8-26 10:41
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
invoke  accept,hSocket,addr  @sttheirsockaddr,sizeof @sttheirsockaddr

The accept function permits an incoming connection attempt on a socket.

SOCKET accept(
  SOCKET s,
  struct sockaddr* addr,
  int* addrlen
);

你最后一个参数传错了,应该传一个int *,而不是int
2005-8-26 14:21
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
accept函数错误

accept,s,lpsockaddr,lpaddrlen

其中参数 s 为监测套接字句柄,参数lpsockaddr为返回请求连接的的sockaddr_in信息,lpaddrlen为一个32位的变量,变量返回lpsockaddr信息的长度

这两个涵数可以为NULL

我试了你的这个程序,并修改了我自已的请求连接客户端的端口为1999

连你的服务器端时,accept后的两个参数改为null是,顺利得到hello消息
但当对accept后两个参数设值时,碰些小麻烦,但最还好是顺利通过

使用这两个参数要注意的地方是:
lpsockaddr参数可以为全局变量或局部变量(是一个指针!)
lpaddrlen参数不可以为局部变量(不知为什么,局部变量不能通过),只有用全局变量,才能通过.这个参数不是一个指针,而是一个32位的变量,只是在变量的值中返回lpscokaddr的长度

关于lpaddrlen不能是局部变量,哪位前辈知道为什么呀?
2005-9-8 16:54
0
雪    币: 401
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主你已经很厉害了,我才学第二章,有二个题目不会做,我又没老师教,大家能帮帮我吗?题目如下:
根据要求,写出相应的汇编语言指令:
1,将AH寄存器中的高四位和低四位数据互换。
2,清除以寄存器SI间接寻址的存储器字单元,同时清除CF标志位。
我也没有标准答案可以参考,求大家帮我呀!谢谢。
2005-9-13 19:56
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也是菜鸟
第一个问题,俺就写个比较笨的方面(好的方法我还不会,呵呵
xor al,al ;先把AX的低八位清0
shr ax,4  ;把ah,的低4位移到al的高4位
mov bl,al ;al中的值传给bl
shr ax,8  ;把ah中的高4位移入al的底4位中
or  al,bl ;或运算之后,al中的高4位是ah低4位的值,al中的低4位是ah高4位的值

shl ax,8  ;把al的值移入ah,就得到结果了
2005-9-14 13:21
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
最初由 酷酷 发布
我也是菜鸟
第一个问题,俺就写个比较笨的方面(好的方法我还不会,呵呵
xor al,al ;先把AX的低八位清0
shr ax,4 ;把ah,的低4位移到al的高4位
mov bl,al ;al中的值传给bl
........

呵呵,第一题不用那么麻烦,一条指令就可以解决。
第二题不明白他所指,清除CF标志位可以用CLC指令。
2005-9-14 17:10
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵,谢谢指正
2005-9-15 12:17
0
雪    币: 401
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢酷酷和小虾和解答,由于是自学,又没有人可以请教,所以才会问这样的问题。前几天很忙,没来上网,今天看了一下书,第一题的指令是不是这样的:
rol ah,4
第二题题目我是看着书写的,没有错啊?
(6)清除以寄存器SI间接寻址的存储器字单元,同时清除CF标志位。
是不是错在没有标明操作数的存储器是哪个?
2005-9-16 16:12
0
游客
登录 | 注册 方可回帖
返回