⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 walk.asm

📁 想学习汇编语言的
💻 ASM
字号:
TITLE Drunkard's Walk              (Walk.asm)

; Drunkard's walk program. This is a simple version that
; starts at coordinate 50,50 and wanders around the immediate area.
; Last update: 8/14/01.

INCLUDE Irvine32.inc

WalkMax = 30
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
;
; Take a walk in random directions (north, south, east,
; west).
; Receives: ESI points to a DrunkardWalk structure
; Returns:  the structure is initialized with random values
;-------------------------------------------------------
	pushad

; Point EDI to the array of COORD objects.
	mov edi,esi
	add edi,OFFSET DrunkardWalk.path
	mov ecx,WalkMax	; loop counter
	mov currX,StartX	; current X-location
	mov currY,StartY	; current Y-location

Again:
	; Insert current location in array.
	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	; choose a direction (0-3)
	call RandomRange

	.IF eax == 0	; North
	  dec currY
	.ELSEIF eax == 1	; South
	  inc currY
	.ELSEIF eax == 2	; West
	  dec currX
	.ELSE	; East (EAX = 3)
	  inc currX
	.ENDIF

next:
	add edi,TYPE COORD	; point to next COORD
	loop Again

finish:
	mov ax,WalkMax	; count the steps taken
	sub ax,cx
	mov (DrunkardWalk PTR [esi]).pathsUsed, ax
	popad
	ret
TakeDrunkenWalk ENDP

;-------------------------------------------------------
DisplayPosition PROC currX:WORD, currY:WORD
;
; Display the current X and Y positions.
; Optional: used for debugging.
;-------------------------------------------------------
.data
commaStr BYTE ",",0
.code
	pushad
	movzx eax,currX	; current X position
	call WriteDec
	mov edx,OFFSET commaStr	; "," string
	call WriteString
	movzx eax,currY	; current Y position
	call WriteDec
	call Crlf
	popad
	ret
DisplayPosition ENDP
END main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -