`
qdujunjie
  • 浏览: 110358 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言醉汉走路代码分析(15)

 
阅读更多

来自于《Intel汇编语言程序设计》(第四版)第10章----结构和宏。

所谓醉汉走路,即在一个XY坐标的二维地图中,模拟一个醉汉走路的轨迹(原书中说的是一个喝醉了酒还未清醒的教授)。此处仍然用到了结构和宏,来看一下原书代码:

 

 

TITLE Drunkard's Walk                   (Walk.asm)

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

;

; Take a walk in random direction (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 count

          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

          inc currY

          .ELSEIF eax==1            ; south

          dec currY

          .ELSEIF eax==2            ; west

          dec currX

          .ELSE                            ; east (eax = 3)

           inc currX

          .ENDIF

          add edi,TYPE COORD    ; point to next COORD

          loop Again

Finish:

          mov (DrunkardWalk PTR [esi]).pathsUsed,WalkMax

          popad

          ret

TakeDrunkenWalk ENDP

;------------------------------------------------------------------------------

DisplayPosition PROC currX:WORD,currY:WORD

; Display the current X and Y position.

;------------------------------------------------------------------------------

.data

commaStr BYTE ",",0

.code

           pushad

           movzx eax,currX                          ; current X postion

           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

 

 

让我们用代码注释来具体分析:

 

 

TITLE Drunkard's Walk                   (Walk.asm)

INCLUDE Irvine32.inc                              ; 包含了作者的库,许多函数就来自于这个库,比如WriteString,WriteDec,RandomRange函数等等

WalkMax = 50                                         ; 最多能行走的步数

StartX = 25                                             ; 开始X坐标

StartY = 25                                             ; 开始Y坐标

DrunkardWalk STRUCT                              ; 一个醉汉的结构

         path COORD WalkMax DUP(<0,0>)  ; 一个存储行走过得坐标位置的COORD类型的结构数组

         pathsUsed WORD 0                         ; 存储行走过的步数

DrunkardWalk ENDS                                 ; 结构结束

DisplayPosition PROTO currX:WORD,currY:WORD        ;  DisplayPosition 函数的原型声明

.data

aWalk DrunkardWalk <>                            ; 声明了一个DrunkardWalk 结构变量aWalk

.code

main PROC                                                 ; 开始主程序

        mov esi,offset aWalk                          ; 将aWalk 的偏移地址赋值到esi中

        call TakeDrunkenWalk                        ; 调用本逻辑的主要函数TakeDrunkenWalk,让“醉汉”走起来

        exit

main ENDP

;------------------------------------------------------------------------------

TakeDrunkenWalk PROC

LOCAL currX:WORD,currY:WORD

;

; Take a walk in random direction (north ,south,east,west).        

; Receives : ESI points to a DrunkardWalk structure                  ;记得调用之前把aWalk赋给了ESI吗?本函数接收esi为参数

; Returns : the structure is initialized with random values

;------------------------------------------------------------------------------

          pushad                                                                                ; 以防万一,将所有寄存器压入堆栈

; Point EDI to the array of  COORD objects.

          mov edi,esi                                                                          ; 将ESI赋到edi中

          add edi,OFFSET DrunkardWalk.path                                    ; 计算出了aWalk结构中的path成员地址

          mov ecx,WalkMax                 ; loop count                            ; 最多能走的步数赋到ecx中

          mov currX,StartX                   ; current X-location                 ; 开始X坐标赋到currX中

          mov currY,StartY                    ; current Y-location                ; 开始Y坐标赋到currY中

Again:

          ; insert current location in array

          mov ax,currX                                       ; 将currX保存到ax中

          mov (COORD PTR [edi]).X , ax             ; 将ax赋到aWalk结构中的path成员的X成员,因为是间接引用,所以这里使用了PTR

          mov ax,currY

          mov (COORD PTR [edi]).Y , ax

          INVOKE DisplayPosition , currX , currY              ; 调用DisplayPosition 打印目前的XY坐标

          mov eax,4            ; choose a direction (0-3)    ; 将4赋值到eax中,用来生成随机数,范围为0-3

          call RandomRange                                            ; 生成随机数,仍然保存在eax中

          

          .IF eax==0                    ; north                         ; 判断生成的随机数到底是哪个方向,然后分情况进行相应计算

          inc currY

          .ELSEIF eax==1            ; south

          dec currY

          .ELSEIF eax==2            ; west

          dec currX

          .ELSE                            ; east (eax = 3)

           inc currX

          .ENDIF

          add edi,TYPE COORD    ; 指向path成员的下一个坐标地址

          loop Again                    ; 接着走醉步

Finish:

          mov (DrunkardWalk PTR [esi]).pathsUsed,WalkMax    ; 不知道这里要为什么要赋回去

          popad

          ret

TakeDrunkenWalk ENDP

;------------------------------------------------------------------------------

DisplayPosition PROC currX:WORD,currY:WORD                           

; 用来将X,Y坐标输出的函数,接收X,Y坐标作为参数

;------------------------------------------------------------------------------

.data

commaStr BYTE ",",0

.code

           pushad

           movzx eax,currX                          ; current X postion

           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

0
0
分享到:
评论

相关推荐

    汇编语言和静态分析工具源代码合集.zip

    汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析...

    汇编语言程序设计代码

    书中的"code"文件夹很可能包含了与书中章节对应的源代码,读者可以通过分析和运行这些代码来加深对汇编语言的理解。 在学习汇编语言时,了解处理器架构和指令集是非常重要的。例如,x86架构的指令集包括了数据处理...

    汇编语言源代码大全汇编语言源代码大全

    《汇编语言源代码大全》是一本专注于汇编语言编程实践的资料集合,它涵盖了从基础到高级的各种汇编语言编程技巧和实例。...通过实际动手编写和分析这些代码,读者可以深化对汇编语言的理解,提高编程技能。

    汇编语言源代码

    通过分析和运行这个源代码,学生可以学习到如何在实际环境中应用汇编语言。 学习汇编语言的过程中,重要的是理解每条指令的作用以及它如何影响CPU的状态。此外,汇编语言编程还需要掌握如何将程序组织成可执行的...

    不错的汇编语言学习源代码

    "不错的汇编语言学习源代码"这个标题暗示了这是一个集合,包含了多种用汇编语言编写的示例程序,旨在帮助学习者逐步掌握汇编语言的精髓。 描述中提到的“一些小程序,包含简单图形的显示等”,意味着这些源代码不仅...

    《汇编语言源代码大全》.rar

    - **代码分析**:通过阅读和理解汇编代码,找出程序中的错误或优化点。 8. **汇编语言的学习路径**: - **基础语法**:熟悉基本指令、伪指令和数据类型。 - **实践操作**:通过编写简单的程序来实践,如计算器、...

    汇编语言实验源代码和报告

    四、源代码分析 实验的源代码文件(汇编实验)中,可以看到各种汇编指令的实际应用。通过对这些代码的分析,可以了解到汇编语言在实际问题解决中的运用,例如: - 数据处理:如何定义变量,如何进行算术和逻辑运算。...

    汇编语言学习—源代码大全

    《汇编语言学习—源代码大全》是一份深入学习汇编语言的重要资源,它包含了丰富的汇编语言程序实例,旨在帮助学习者通过实践理解并掌握汇编语言的基础知识和高级技巧。汇编语言,作为计算机科学中最底层的编程语言之...

    汇编语言代码大全--精通汇编

    通过阅读和运行这些代码,你将逐步熟悉汇编语言的语法和逻辑,提高分析和解决问题的能力。此外,实践这些代码还可以帮助你理解计算机底层的工作原理,对于计算机系统设计和优化有极大的帮助。 在实践中,你可以从...

    汇编语言实现插入恶意代码

    "汇编语言实现插入恶意代码"这个话题涉及到的是利用汇编语言编写病毒、木马或其他恶意软件,并将这些代码巧妙地插入到合法程序中,以达到攻击或控制目标系统的目的。 汇编语言是低级语言,它与机器语言非常接近,每...

    汇编语言代码集

    《汇编语言代码集》是一份集合了多种汇编语言编程相关的代码实例,虽然缺乏一个清晰的目录结构,但对想要深入理解汇编语言的读者来说,无疑是一份宝贵的资源。汇编语言,作为计算机科学的基础,是直接与硬件交互的...

    WINDOWS下32位汇编语言程序设计 代码

    WINDOWS下32位汇编语言程序设计 代码 WINDOWS下32位汇编语言程序设计 代码

    汇编语言相关课程设计源代码

    许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你...

    汇编语言源代码毕业设计

    《汇编语言源代码毕业设计》是一份针对学习汇编语言的学生进行毕业设计的重要参考资料,它结合了基础教程和实际的源代码实践,旨在帮助学生深入理解和应用汇编语言。汇编语言,作为计算机科学的基础,是直接与硬件...

    《汇编语言》课件及源代码(王爽)

    在实际学习过程中,读者应结合课件中的案例和源代码,逐步理解并熟练运用汇编指令,同时通过动手实践,提升分析问题和解决问题的能力。王爽教授的教材和配套资源为这一过程提供了坚实的基础,使得汇编语言的学习变得...

    汇编语言所有实验报告

    通过这些实验,学习者不仅能掌握汇编语言的基本语法和结构,还能理解计算机执行指令的底层过程,这对于计算机系统分析、软件优化和嵌入式系统开发等领域至关重要。每个实验报告都应详细记录了实验步骤、程序代码、...

    汇编语言工具和实例源代码

    关于实例源代码,学习汇编语言时,通过实践编写和分析实例代码可以加深对指令集的理解。这些实例可能包括: 1. **基本操作示例**:如数据的加载、存储、算术运算、逻辑运算等,这些都是汇编语言的基础。 2. **控制...

    王爽汇编语言实验代码

    《王爽汇编语言实验代码》是一份涵盖了汇编语言学习者在实验七及后续阶段可能需要用到的实践代码资源。这份压缩包由ster提供,它包括了以"e"开头的实验需求代码和以"t"开头的测试代码,以及一个名为"Course Design...

    汇编语言程序设计实例程序代码

    汇编语言程序设计实例程序代码是学习和掌握汇编语言的关键途径,通过实际编写和分析代码,可以深入理解计算机底层工作原理,提高程序优化能力。 汇编语言的实例通常包括各种类型的任务,例如码字转换和动画效果设计...

Global site tag (gtag.js) - Google Analytics