汇编语言结构嵌套简述[附带实例]
Rectangle STRUCT
UpperLeft COORD <>
LowerRight COORD <>
Rectangle ENDS
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
mov edi,OFFSET rect2.LowerRight
mov (COORD PTR [edi]).X, 50
mov edi,OFFSET rect2.LowerRight.X
mov WORD PTR [edi], 50
示例:醉汉行走
现在来看一个使用结构的小程序将会有所帮助。下面完成一个“醉汉行走”练习,用程序模拟一个不太清醒的教授从计算机科学假期聚会回家的路线。利用随机数生成器,选择该教授每一步行走的方向。假设教授处于一个虚构的网格中心,其中的每个方格代表的是北、南、东、西方向上的一步。现在按照随机路径通过网格,如下图所示。本程序将使用 COORD 结构追踪这个人行走路径上的每一步,它们被保存在一个 COORD 对象数组中。
WalkMax == 50
DrunkardWalk STRUCT
path COORD WalkMax DUP(<0, 0>)
pathsUsed WORD 0
DrunkardWalk ENDS
以下是完整的程序清单, 需在 32 位模式下运行:
; 醉汉行走 (Walk. asm) ; 醉汉行走程序。教授的起点坐标为(25,25),并在周围徘徊 INCLUDE Irvine32.inc WalkMax = 50 StartX = 25 StartY = 25 DrunkardWalk STRUCT path COORD WalkMax DUP(<0,0>) pathsUsed WORD 0 DrunkardWalk ENDS DisplayPosition PROTO currX:WORD, currY:WORD .data aWalk DrunkardWalk <> .code main PROC mov esi,OFFSET aWalk call TakeDrunkenWalk exit main ENDP ;------------------------------------------------------- TakeDrunkenWalk PROC LOCAL currX:WORD, currY:WORD ; ; 向随机方向行走(北, 南, 东, 西) ; 接收: ESI 为 DrunkardWalk 结构的指针 ; 返回: 结构初始化为随机数 ;------------------------------------------------------- pushad ; 用 OFFSET 运算符获取 path,COORD 对象数组的地址,并将其复制到 EDI. mov edi,esi add edi,OFFSET DrunkardWalk.path mov ecx,WalkMax ; 循环计数器 mov currX,StartX ; 当前 X 的位置 mov currY,StartY ; 当前 Y 的位置 Again: ; 把当前位置插入数组 mov ax,currX mov (COORD PTR [edi]).X,ax mov ax,currY mov (COORD PTR [edi]).Y,ax INVOKE DisplayPosition, currX, currY mov eax,4 ; 选择一个方向 (0-3) call RandomRange .IF eax == 0 ; 北 dec currY .ELSEIF eax == 1 ; 南 inc currY .ELSEIF eax == 2 ; 西 dec currX .ELSE ; 东 (EAX = 3) inc currX .ENDIF add edi,TYPE COORD ; 指向下一个 COORD loop Again Finish: mov (DrunkardWalk PTR [esi]).pathsUsed, WalkMax popad ret TakeDrunkenWalk ENDP ;------------------------------------------------------- DisplayPosition PROC currX:WORD, currY:WORD ; 显示当前 X 和 Y 的位置 ;------------------------------------------------------- .data commaStr BYTE ",",0 .code pushad movzx eax,currX ; 当前 X 的位置 call WriteDec mov edx,OFFSET commaStr ; "," 字符串 call WriteString movzx eax,currY ; 当前 Y 的位置 call WriteDec call Crlf popad ret DisplayPosition ENDP END main现在进一步查看 TakeDrunkenWalk 过程。过程接收指向 DrunkardWalk 结构的指针 (ESI),利用 OFFSET 运算符计算 path 数组的偏移量,并将其复制到 EDI:
mov edi,esi
add edi,OFFSET DrunkardWalk.path
mov ecx, WalkMax ;循环计数器
mov currX, StartX ;当前 X 的位置
mov currY, StartY ;当前 Y 的位置
Again:
; 把当前位置插入数组
mov ax,currX
mov (COORD PTR [edi]).X,ax
mov ax,currY
mov (COORD PTR [edi]).Y,ax
Finish:
mov (DrunkardWalk PTR [esi]).pathsUsed, WalkMax
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频