结构体作为参数,赋值问题~

sunchaohuang 2010-02-25 08:02:47
汇编中的结构作为方法的接收参数:
TMsgHead STRUCT
nMsgLen DWORD ?
nCmdId DWORD ?
nSeq DWORD ?
nMagic DWORD ?
sVersion db 8 dup(?)
sProtocolVer db 4 dup(?)
TMsgHead ENDS

stMsgHead TMsgHead <?>

用这种方式给结构体赋值:
push dword ptr [eax]
push dword ptr [eax+4]
push dword ptr [eax+8]
push dword ptr [eax+12]

pop stMsgHead.nMagic
pop stMsgHead.nSeq
pop stMsgHead.nCmdId
pop stMsgHead.nMsgLen

问题一:
sVersion和sProtocolVer不知道如何赋值。。。。。

问题二:
是否可以使用assume指令代替PUSH POP的赋值方式
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gch12109 2010-02-27
  • 打赏
  • 举报
回复
你为什么不顺序写下去呢?
push dword ptr [eax]
..............
push qword ptr [eax+17]
push word ptr [eax+26]

pop stMsgHead.sVersion
pop stMsgHead.sProtocolVer
pop stMsgHead.nMagic
..............
cnzdgs 2010-02-26
  • 打赏
  • 举报
回复
TestFunction PROC STDCALL, Param:TMsgHead
ret
TestFunction ENDP

invoke TestFunction, stMsgHead

按这种方式生成的代码是逐个push,如果结构较大,可以改成下面的方式调用:
mov ecx, 28H
sub esp, ecx
lea esi, stMsgHead
mov edi ,esp
rep movsb
call TestFunction
sunchaohuang 2010-02-25
  • 打赏
  • 举报
回复
。。。。。。。应该用esi的用错了

invoke lstrcpy,addr stMsgHead.sVersion,[esi+16]
invoke lstrcpy,addr stMsgHead.sProtocolVer,[esi+20]
sunchaohuang 2010-02-25
  • 打赏
  • 举报
回复
显示不出来然道要将

sVersion db 8 dup(?)
sProtocolVer db 4 dup(?)

合并成一个。。
sunchaohuang 2010-02-25
  • 打赏
  • 举报
回复
invoke lstrcpy,addr stMsgHead.sVersion,[eax+16]
invoke lstrcpy,addr stMsgHead.sProtocolVer,[eax+20]

这样子赋值的话后面的addr stMsgHead.sProtocolVer就显示不出来了
永磁体呵呵哒 2010-02-25
  • 打赏
  • 举报
回复
只要是8个db怎么赋都可以和其它的没有区别
sunchaohuang 2010-02-25
  • 打赏
  • 举报
回复
invoke lstrcpy,addr stMsgHead.sVersion,[eax+16]

这样就可以啦,可是能不能用assume呢

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧