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

在win32中如何实现二维数组?

misslucky 发布于 2009-08-15 14:01, 1448 次点击
我想定义一个二维数组,表示平年和闰年的每月天数
不知是否这样定义?
 month db 31,28,31,30,31,30,31,31,30,31,30,31
       db 31,29,31,30,31,30,31,31,30,31,30,31
如何访问这个数组中的每一个数?请高人指教!
6 回复
#2
东海一鱼2009-08-15 15:25
数据组织非常灵活的,这样当然可以。

访问的话:
 
程序代码:
mov esi,offset month             //地址放入esi

xor  ecx,ecx                     //清空计数器

while (ecx < 017h)               //17h ==23,线性数组长度
   mov al,byte ptr[esi + ecx]    //访问每一个数组元素
   .......                       //你的处理语句
   inc ecx                       //计数器加一,移动下标
.endw
#3
misslucky2009-08-15 16:11
谢谢!按照你的方法写了判断一年中某月的第一天是整年的第几天的函数,
DayPosition proc umonth:DWORD,uleap:DWORD    //umonth表示某月,uleap闰年的判断标志,是闰年uleap==1,否则为0
        mov esi,offset month         //month为开始定义的数组,见贴
        xor ecx,ecx
        xor eax,eax
        .if uleap==1                 //如果是闰年就是用数组中的第二行,偏移量加12
            add esi,12
        .endif
        .while ecx<umonth-1           //计算前(umonth-1)个月的天数和  
            mov al,byte ptr[esi + ecx]
            inc ecx
        .endw
        inc eax            //某月的第一天,所以加1
        ret
        DayPosition endp
#4
东海一鱼2009-08-15 16:23
,注意一点,esi是公用约定寄存器,使用前需要保存。

所以:

DayPosition proc uses esi umonth:DWORD,uleap:DWORD

汇编器会将其展开为

push esi      //入栈保存

........   

........

pop esi      //恢复

ret          //返回
#5
misslucky2009-08-15 17:06
非常感谢!不知哪些寄存器使用前一定要保存呢?
是不是可以不用uses,而直接在代码开始和结尾处分别加上pushad和popad指令来一次保存所有寄存器就可以了?
#6
东海一鱼2009-08-15 17:36
ebx\esi\edi\esp\ebp都需要保护。

eax\ecx\edx可以自由使用,其中ecx会被某些C++编译器当做类对象的this指针使用,所以如果要与C++模块交互的话,保险

起见最好将ecx也进行保护。

是不是可以不用uses,而直接在代码开始和结尾处分别加上pushad和popad指令来一次保存所有寄存器就可以了?

完全可以,但是太没有效率。pushad要比个别寄存器入栈所占的机器时钟周期要高得多。

不过话又说回来了,似乎现在的人没有人在乎这个。毕竟现在的硬件速度要比过去强悍太多了。

[ 本帖最后由 东海一鱼 于 2009-8-15 17:38 编辑 ]
#7
misslucky2009-08-15 17:41
O(∩_∩)O谢谢!
1