注册 登录
编程论坛 汇编论坛

有关参数很多的涵数的问题如何有效得到想要的值?

onepc 发布于 2009-09-21 08:41, 765 次点击
比如得到系统时间的函数。这个结构有好多个成员。。

我用以下方法得到这个时间,但是要设这么多变量,有别的方法么?

还有这个默认是dd型,若是其它字型之类的一定要转成dd么?

比如下面这个。我用push压栈的话,我用什么函数来读成?这个push是压的16位的吧?

那个数值的读取是否只有wspritf这个函数?????

_sjproc proc   _hWnd,uMsg,_idEvent,_dwTime
        local @stTimer:SYSTEMTIME
        local @year,@mon,@day,@hour,@min,@sec  ;默认是DWORD类型
pushad
        invoke RtlZeroMemory,addr @stTimer,sizeof @stTimer
        invoke GetLocalTime,addr @stTimer
        movzx eax,@stTimer.wYear
        mov @year,eax
        movzx eax,@stTimer.wMonth
        mov @mon,eax
        movzx eax,@stTimer.wDay
        mov @day,eax
        movzx eax,@stTimer.wHour
        mov @hour,eax
        movzx eax,@stTimer.wMinute
        mov @min,eax
        movzx eax,@stTimer.wSecond
        mov @sec,eax
        invoke wsprintf,addr szBuffer,addr szFmat,@year,@mon,@day,@hour,@min,@sec
        invoke SetDlgItemText,hMain,IDC_ETIME,addr szBuffer
popad
ret
_sjproc endp
9 回复
#2
zklhp2009-09-21 12:33
有些东西就是很麻烦~~~

那个数值的读取是否只有wspritf这个函数?????

是 输出 罢~

win32压栈只能压32位的 所以~~~ 这个时间的函数一直很麻烦

aogo上的一个高手写过一个宏 比较方便 不过 用宏不大好~
#3
onepc2009-09-21 15:48
程序代码:
嗯。。。不过aogo那个论坛怎么看的?随便看一下,太难看了。。。闪了。

对了。还有比如判断是星期几。
szx1 db '星期一',0
szx2 db '星期二',0
szx3 db '星期三',0
szx4 db '星期四',0
szx5 db '星期五',0
szx6 db '星期六',0
szx7 db '星期日',0



    movzx eax,@stTimer.wDayOfWeek
        mov @dday,eax
        .if @dday==1
            mov @dday,offset szx1
        .endif
         
        .if @dday==2
            mov @dday,offset szx2
        .endif

invoke wsprintf,addr szBuffer,addr szFmat,@dday
我这样设置呢。
有简单一点的么?
#4
东海一鱼2009-09-21 20:00
   
程序代码:
     movzx eax,@stTimer.wYear
        mov @year,eax
        movzx eax ,@stTimer.wMonth
        mov @mon,eax
        movzx eax,@stTimer.wDay
        mov @day,eax
        movzx eax,@stTimer.wHour
        mov @hour,eax
        movzx eax,@stTimer.wMinute
        mov @min,eax
        movzx eax,@stTimer.wSecond
        mov @sec,eax
上面的代码没有任何必要,太罗嗦了。
因为你已经声明了一个结构变量local @stTimer:SYSTEMTIME。所以直接对其成员访问即可。

invoke RtlZeroMemory,addr @stTimer,sizeof @stTimer
invoke GetLocalTime,addr @stTimer
invoke wsprintf,addr szBuffer,addr szFmat,@stTimer.wYear ,@stTimer.wMonth,@stTimer.wDay
程序代码:
szx1 db '星期一',0  
szx2 db '星期二',0  
szx3 db '星期三',0  
szx4 db '星期四',0  
szx5 db '星期五',0  
szx6 db '星期六',0  
szx7 db '星期日',0
改为:

程序代码:
szx1 db '星期一',0,0                ;对齐
szx2 db '星期二',0,0   
szx3 db '星期三',0,0   
szx4 db '星期四',0,0   
szx5 db '星期五',0,0   
szx6 db '星期六',0,0   
szx7 db '星期日',0,0

这样,对字符串的匹配就简单了:

movzx ecx,@stTimer.wDayOfWeek       ;索引
.if (eax >= 1) && (ecx <= 7)
   dec ecx                             ;以 0 为基
   mov eax,0ffset szx1                 ;基址
   invoke wsprintf,addr szBuffer,addr szFmat,[eax + ecx * 8]    ;基址 + 偏移(索引 * 比例),\"\"
.endif



[ 本帖最后由 东海一鱼 于 2009-9-21 20:20 编辑 ]
#5
onepc2009-09-22 07:58
谢谢。。学习了。
呃 。我一直以为那个wsprintf也是要dd 型才行的。
#6
onepc2009-09-22 08:19
程序代码:
szx1 db '星期一',0,0                ;对齐
szx2 db '星期二',0,0   
szx3 db '星期三',0,0   
szx4 db '星期四',0,0   
szx5 db '星期五',0,0   
szx6 db '星期六',0,0   
szx7 db '星期日',0,0  
 
这样,对字符串的匹配就简单了:
 
movzx ecx,@stTimer.wDayOfWeek       ;索引  
.if (eax >= 1) && (ecx <= 7)
   dec ecx                             ;以 0 为基
   mov eax,0ffset szx1                 ;基址  
   invoke wsprintf,addr szBuffer,addr szFmat,[eax + ecx * 8]    ;基址 + 偏移(索引 * 比例)


很巧妙。。。。。。。的方法。学习。。。这方便好多了。。。。

不过ecx<=7这个有必要么/?因为movzx ecx,..这里本身就是在0-6的范围'
搜了下原型getlocaltime好像是viod型所以是没返回值,这个eax》=1是那来的呢?
看上去不用这个.if语句就行了。。。不知是否这样?


#7
onepc2009-09-22 09:07
error A2114: INVOKE argument type mismatch : argument : 0
不知为什么会报错?????
#8
东海一鱼2009-09-22 11:19
.if (eax >= 1) && (ecx <= 7)

eax >= 1 因该是 ecx >=1, 我的手误。

目的就是判断值范围的合法性,这是‘防御性’编程的一种手段。防止GetLocalTime失败,@stTimer.wDayOfWeek可能会有意想不到的数值。      
#9
onepc2009-09-23 14:40
嗯。不过若是要排错。应直接》0 《6哦。若是》1的话因为ecx等于0时就显不出来了。

invoke wsprintf,addr szBuffer,addr szFmat,[ebx + edx * 8]
会报错啊。[]这里的面的寄存器我换了好多个。。

error A2114: INVOKE argument type mismatch : argument : 0
#10
东海一鱼2009-09-23 20:15
mov eax,[eax + ecx * 8]

invoke wsprintf,addr szBuffer,addr szFmat,eax
1