CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

汇编中的网络编程,帮忙看看这小段代码有没有问题~

楼主lemony8734(lemony)2006-02-15 16:20:49 在 其他开发语言 / 汇编语言 提问

LOCAL   SockArray[WSA_MAXIMUM_WAIT_EVENTS]:SOCKET  
  LOCAL   SockNum:DWORD  
   
  ;mov   SockNum,0  
  mov   ecx,SockNum  
   
  invoke   socket,AF_INET,SOCK_STREAM,0  
  mov   SockArray[ecx*4],eax  
   
  调试的时候,发现mov   SockArray[ecx*4],eax这句有问题~~  
   
  如果把ecx换成esi寄存器,就不会有问题~~~  
   
  但是我看一些例子上面用的是ecx寄存器  
   
  ecx:计数器  
  esi:32为源变址寄存器  
   
  这里到底改用什么寄存器,还有最重要的是为什么使用改寄存器 问题点数:20、回复次数:17Top

1 楼mydo(侯佩|hopy|ks)回复于 2006-02-15 18:31:25 得分 0

ecx   初值正确么?单步调试了没有?按讲是不会的。Top

2 楼lemony8734(lemony)回复于 2006-02-15 19:23:13 得分 0

我换成了esi寄存器~~~  
   
  已经正常了~~~  
   
  我想要问问,使用这些寄存器是不是没有特定的规则Top

3 楼lemony8734(lemony)回复于 2006-02-15 19:26:55 得分 0

还有一个问题~~  
   
  LOCAL   test1:BYTE  
  LOCAL   test2[100]:BYTE  
   
  mov   test2[0],test1  
   
  编译报错invalid   instruction   operands  
   
  换成  
  test2[0],BYTE   PTR   test1  
  也还是报错~~  
   
  是不是只能这样?  
   
  mov   al,test1  
  mov   test2[0],al  
   
  难道第一种方法不可以吗?  
   
  还是需要类型转换一下?Top

4 楼Leomaxking(害怕孤独,但已习惯孤独)回复于 2006-02-16 08:29:50 得分 0

mov指令不可以执行内存单元之间的数值传递Top

5 楼lemony8734(lemony)回复于 2006-02-16 10:30:42 得分 0

LOCAL   body1[100]:BYTE  
   
  mov   esi,0  
  .repeat  
  invoke   wsprintf,addr   body1,addr   tmp2,err[esi]  
  invoke   lstrlen,addr   body1  
  invoke   WriteFile,hOut,addr   body1,eax,addr   cb,NULL  
  inc   esi  
  .until   esi   ==   lengthof   err  
  ret  
   
  上面的代码是打印出err中每一个字符的16禁止,为什么开始的几个字母打印不出来,只能打印出后面的几位字母Top

6 楼mydo(侯佩|hopy|ks)回复于 2006-02-16 10:43:50 得分 0

写全一点Top

7 楼lemony8734(lemony)回复于 2006-02-16 10:49:04 得分 0

就是这样啊~~  
   
  还有一些变量  
   
  .data  
  tmp2 db "<0x%x>",0  
   
  .data?  
  db                                     db         DWORD   ?Top

8 楼lemony8734(lemony)回复于 2006-02-16 10:50:14 得分 0

err是一个字符串  
   
  .data  
  err db "Error",0Top

9 楼mydo(侯佩|hopy|ks)回复于 2006-02-16 11:10:09 得分 0

do   like   this:  
   
  .386  
  .model   flat,stdcall  
  option   casemap   :none  
   
  include c:\masm32\include\windows.inc  
  include   c:\masm32\include\user32.inc  
  include   c:\masm32\include\kernel32.inc  
  includelib c:\masm32\lib\user32.lib  
  includelib c:\masm32\lib\kernel32.lib  
   
  .data?  
   
  .const  
  err db "Error",0  
  ft db '%x',0  
  cp db 'windows   xp',0  
   
  .code  
  ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  doit proc  
  local stbody[100]:byte  
   
  mov   esi,0  
  .repeat  
  xor ebx,ebx  
  mov bl,byte   ptr   err[esi]  
  invoke   wsprintf,addr   stbody,addr   ft,ebx  
  invoke   MessageBox,NULL,addr   stbody,addr   cp,0  
   
  inc   esi  
  .until   esi   ==   lengthof   err  
  ret  
   
  doit endp  
  ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  start:  
  invoke doit  
  invoke ExitProcess,NULL  
  ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  end startTop

10 楼lemony8734(lemony)回复于 2006-02-16 11:21:35 得分 0

每看懂这两句  
   
  mov bl,byte   ptr   err[esi]  
  invoke   wsprintf,addr   stbody,addr   ft,ebx  
   
  既然把err的第esi位腹给了ebx的低位,下一句是不是应该  
  invoke   wsprintf,addr   stbody,addr   ft,bl  
   
  ???  
   
  我按照你的代码写了一遍,还是打不出来Top

11 楼mydo(侯佩|hopy|ks)回复于 2006-02-16 12:26:59 得分 0

使用   ebx   而不用   bl   因为该形参要求是双字长度。  
  WriteFile   设输出缓冲长度为1字节,内容为   body   的第一个字节Top

12 楼lemony8734(lemony)回复于 2006-02-16 12:42:35 得分 0

xor ebx,ebx  
   
  这句是不是把ebx置为0?Top

13 楼lemony8734(lemony)回复于 2006-02-16 12:57:20 得分 0

.386  
  .model   flat,stdcall  
  option   casemap:none  
   
  include   windows.inc  
  include   user32.inc  
  include   kernel32.inc  
   
  includelib   user32.lib  
  includelib   kernel32.lib  
   
  print proto Databuf:DWORD,Datasize:DWORD  
  .data  
  test1 db "test",0  
  .data?  
  hOut HANDLE ?  
  cb DWORD ?  
  .const  
   
  .code  
  tmp db "<0x%x>",0  
   
  start:  
  invoke   GetStdHandle,STD_OUTPUT_HANDLE  
  mov   hOut,eax  
  invoke   lstrlen,addr   test1  
  invoke   print,addr   test1,eax  
  invoke   ExitProcess,0  
  print proc Databuf:DWORD,Datasize:DWORD  
  LOCAL   _Temp[10]:BYTE  
   
  mov   ecx,0  
  .repeat  
  xor   ebx,ebx  
   
  mov   bl,BYTE   PTR   Databuf[ecx]  
  invoke   wsprintf,addr   _Temp,addr   tmp,ebx  
  invoke   lstrlen,addr   _Temp  
  invoke   WriteFile,hOut,addr   _Temp,eax,addr   cb,NULL  
   
  inc   ecx  
  .until   ecx   ==   Datasize  
  ret  
   
  print   endp  
  end   start  
   
  看看我写的这段代码~~~  
   
  哪里出了问题?Top

14 楼mydo(侯佩|hopy|ks)回复于 2006-02-16 13:58:07 得分 0

ecx   的值被不断改变。图懒的方法是:  
   
  .386  
  .model   flat,stdcall  
  option   casemap:none  
   
  include   c:\masm32\include\windows.inc  
  include   c:\masm32\include\user32.inc  
  include   c:\masm32\include\kernel32.inc  
   
  includelib   c:\masm32\lib\user32.lib  
  includelib   c:\masm32\lib\kernel32.lib  
   
  print proto Databuf:DWORD,Datasize:DWORD  
  .data  
  test1 db "test",0  
  .data?  
  hOut HANDLE ?  
  cb DWORD ?  
  .const  
   
  .code  
  tmp db '<0x%x>',0  
   
  start:  
  invoke   GetStdHandle,STD_OUTPUT_HANDLE  
  mov   hOut,eax  
  invoke   lstrlen,addr   test1  
  invoke   print,addr   test1,eax  
  invoke   ExitProcess,0  
   
  print proc Databuf:DWORD,Datasize:DWORD  
  LOCAL   _Temp[10]:BYTE  
  local tmpecx:dword  
   
  mov   ecx,0  
                  mov   tmpecx,0  
  mov   edx,Databuf  
  .repeat  
  xor   ebx,ebx  
  mov   ecx,tmpecx  
  mov   bl,BYTE   PTR   [edx][ecx]  
  invoke   wsprintf,addr   _Temp,addr   tmp,ebx  
  mov   ecx,tmpecx  
  invoke   lstrlen,addr   _Temp  
  mov   ecx,tmpecx  
  invoke   WriteFile,hOut,addr   _Temp,eax,addr   cb,NULL  
  mov   ecx,tmpecx  
   
  inc   ecx  
  mov   tmpecx,ecx  
  .until   ecx   ==   Datasize  
  ret  
   
  print   endp  
  end   startTop

15 楼lemony8734(lemony)回复于 2006-02-16 14:30:25 得分 0

你的代码好像也有问题啊~~  
   
  打印出了的值不对Top

16 楼mydo(侯佩|hopy|ks)回复于 2006-02-16 14:41:07 得分 20

不好意思,edx   值也要保存:  
   
  .386  
  .model   flat,stdcall  
  option   casemap:none  
   
  include   c:\masm32\include\windows.inc  
  include   c:\masm32\include\user32.inc  
  include   c:\masm32\include\kernel32.inc  
   
  includelib   c:\masm32\lib\user32.lib  
  includelib   c:\masm32\lib\kernel32.lib  
   
  print proto Databuf:DWORD,Datasize:DWORD  
  .data  
  test1 db "test",0  
  .data?  
  hOut HANDLE ?  
  cb DWORD ?  
  .const  
   
  .code  
  tmp db '<0x%x>',0  
   
  start:  
  invoke   GetStdHandle,STD_OUTPUT_HANDLE  
  mov   hOut,eax  
  invoke   lstrlen,addr   test1  
  invoke   print,addr   test1,eax  
  invoke   ExitProcess,0  
   
  print proc Databuf:DWORD,Datasize:DWORD  
  LOCAL   _Temp[10]:BYTE  
  local tmpecx  
  local       tmpedx  
   
  mov   ecx,0  
                  mov   tmpecx,0  
  mov   edx,Databuf  
  mov   tmpedx,edx  
  .repeat  
  xor   ebx,ebx  
  mov   ecx,tmpecx  
  mov   edx,tmpedx  
  mov   bl,BYTE   PTR   [edx][ecx]  
  invoke   wsprintf,addr   _Temp,addr   tmp,ebx  
  mov   ecx,tmpecx  
  mov   edx,tmpedx  
  invoke   lstrlen,addr   _Temp  
  mov   ecx,tmpecx  
  mov   edx,tmpedx  
  invoke   WriteFile,hOut,addr   _Temp,eax,addr   cb,NULL  
  mov   ecx,tmpecx  
   
  inc   ecx  
  mov   tmpecx,ecx  
  .until   ecx   ==   Datasize  
  ret  
   
  print   endp  
  end   start  
   
  Top

17 楼lemony8734(lemony)回复于 2006-02-16 14:57:53 得分 0

恩,代码没有问题了~~~  
   
  不过这样保存过来保存过去,看的有点晕~~  
   
  我慢慢研究一下~~~  
   
  再请问一小段代码~~  
   
  C语言的一段代码:  
  char   buf[100];  
  short   port   =   1000;  
   
  short   =   htons(port);  
   
  CopyMemory(&buf[10],&port,sizeof(port))  
  or  
  *(short*)&buf[10]   =   htons(port);  
   
  上面的代码的意思应该很容易理解吧~~  
  如果翻译成汇编码是怎样的呢?  
  我写了一小段  
   
  LOCAL   buf[100]:BYTE  
  LOCAL   port:DWORD  
   
  invoke   htons,port  
   
  invoke   RtlMoveMemory,Recvbuf[8],ax,2  
   
  这样对吗?但是我看最后的结果好像有些问题~Top

相关问题

  • 汇编程序
  • TC程序代码和汇编程序代码链接出来的程序运行不正常
  • 请问这段代码错在哪里?(精通C,汇编混合编程的人请进)
  • 看汇编程序时开头经常有这些代码,org 100 ; push ds;sub ax,ax;push ax
  • 用什么编译软件,可以看到汇编程序编译后的目标代码??
  • 请问为什么汇编程序连接后代码段在数据段的前面?
  • 汇编程序设计
  • 一道汇编程序
  • 谁有3D汇编程序?
  • 求助汇编程序

关键词

  • 代码
  • ecx
  • masm
  • eaxinvoke
  • incinclude
  • 寄存器
  • addr
  • ebxmov
  • hout
  • bytemov

得分解答快速导航

  • 帖主:lemony8734
  • mydo

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo