汇编中的网络编程,帮忙看看这小段代码有没有问题~
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




