结构还可以包含其他结构的实例。例如,Rectangle 可以用其左上角和右下角来定义,而它们都是 COORD 结构:
Rectangle STRUCT
UpperLeft COORD <>
LowerRight COORD <>
Rectangle ENDS
Rectangle 变量可以被声明为不覆盖或者覆盖单个 COORD 字段。各种表达形式如下所示:
rect1 Rectangle < >
rect2 Rectangle { }
rect3 Rectangle { {10,10}, {50,20} }
rect4 Rectangle < <10,10>, <50,20> >
下面是对其一个结构字段的直接引用:
mov rect1.UpperLeft.X, 10
也可以用间接操作数访问结构字段。下例用 ESI 指向结构,并把 10 送人该结构左上角的 Y 坐标:
mov esi,OFFSET rect1
mov (Rectangle PTR [esi]).UpperLeft.Y, 10
OFFSET 运算符能返回单个结构字段的指针,包括嵌套字段:
mov edi,OFFSET rect2.LowerRight
mov (COORD PTR [edi]).X, 50
mov edi,OFFSET rect2.LowerRight.X
mov WORD PTR [edi], 50
现在来看一个使用结构的小程序将会有所帮助。下面完成一个“醉汉行走”练习,用程序模拟一个不太清醒的教授从计算机科学假期聚会回家的路线。利用随机数生成器,选择该教授每一步行走的方向。假设教授处于一个虚构的网格中心,其中的每个方格代表的是北、南、东、西方向上的一步。现在按照随机路径通过网格,如下图所示。