- 浏览: 110358 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《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
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1377内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2306本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1826本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2216来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2628内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4148来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1843来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2187代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1921来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4218来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1361来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2226来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1592来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3729来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 1032215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1449来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1224来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4411来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1492来自于《Intel汇编语言程序设计》(第四版)第六章。 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1350《Intel汇编语言程序 ...
相关推荐
汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析工具源代码合集.zip汇编语言和静态分析...
书中的"code"文件夹很可能包含了与书中章节对应的源代码,读者可以通过分析和运行这些代码来加深对汇编语言的理解。 在学习汇编语言时,了解处理器架构和指令集是非常重要的。例如,x86架构的指令集包括了数据处理...
《汇编语言源代码大全》是一本专注于汇编语言编程实践的资料集合,它涵盖了从基础到高级的各种汇编语言编程技巧和实例。...通过实际动手编写和分析这些代码,读者可以深化对汇编语言的理解,提高编程技能。
通过分析和运行这个源代码,学生可以学习到如何在实际环境中应用汇编语言。 学习汇编语言的过程中,重要的是理解每条指令的作用以及它如何影响CPU的状态。此外,汇编语言编程还需要掌握如何将程序组织成可执行的...
"不错的汇编语言学习源代码"这个标题暗示了这是一个集合,包含了多种用汇编语言编写的示例程序,旨在帮助学习者逐步掌握汇编语言的精髓。 描述中提到的“一些小程序,包含简单图形的显示等”,意味着这些源代码不仅...
- **代码分析**:通过阅读和理解汇编代码,找出程序中的错误或优化点。 8. **汇编语言的学习路径**: - **基础语法**:熟悉基本指令、伪指令和数据类型。 - **实践操作**:通过编写简单的程序来实践,如计算器、...
四、源代码分析 实验的源代码文件(汇编实验)中,可以看到各种汇编指令的实际应用。通过对这些代码的分析,可以了解到汇编语言在实际问题解决中的运用,例如: - 数据处理:如何定义变量,如何进行算术和逻辑运算。...
《汇编语言学习—源代码大全》是一份深入学习汇编语言的重要资源,它包含了丰富的汇编语言程序实例,旨在帮助学习者通过实践理解并掌握汇编语言的基础知识和高级技巧。汇编语言,作为计算机科学中最底层的编程语言之...
通过阅读和运行这些代码,你将逐步熟悉汇编语言的语法和逻辑,提高分析和解决问题的能力。此外,实践这些代码还可以帮助你理解计算机底层的工作原理,对于计算机系统设计和优化有极大的帮助。 在实践中,你可以从...
"汇编语言实现插入恶意代码"这个话题涉及到的是利用汇编语言编写病毒、木马或其他恶意软件,并将这些代码巧妙地插入到合法程序中,以达到攻击或控制目标系统的目的。 汇编语言是低级语言,它与机器语言非常接近,每...
《汇编语言代码集》是一份集合了多种汇编语言编程相关的代码实例,虽然缺乏一个清晰的目录结构,但对想要深入理解汇编语言的读者来说,无疑是一份宝贵的资源。汇编语言,作为计算机科学的基础,是直接与硬件交互的...
WINDOWS下32位汇编语言程序设计 代码 WINDOWS下32位汇编语言程序设计 代码
许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你...
《汇编语言源代码毕业设计》是一份针对学习汇编语言的学生进行毕业设计的重要参考资料,它结合了基础教程和实际的源代码实践,旨在帮助学生深入理解和应用汇编语言。汇编语言,作为计算机科学的基础,是直接与硬件...
在实际学习过程中,读者应结合课件中的案例和源代码,逐步理解并熟练运用汇编指令,同时通过动手实践,提升分析问题和解决问题的能力。王爽教授的教材和配套资源为这一过程提供了坚实的基础,使得汇编语言的学习变得...
通过这些实验,学习者不仅能掌握汇编语言的基本语法和结构,还能理解计算机执行指令的底层过程,这对于计算机系统分析、软件优化和嵌入式系统开发等领域至关重要。每个实验报告都应详细记录了实验步骤、程序代码、...
关于实例源代码,学习汇编语言时,通过实践编写和分析实例代码可以加深对指令集的理解。这些实例可能包括: 1. **基本操作示例**:如数据的加载、存储、算术运算、逻辑运算等,这些都是汇编语言的基础。 2. **控制...
《王爽汇编语言实验代码》是一份涵盖了汇编语言学习者在实验七及后续阶段可能需要用到的实践代码资源。这份压缩包由ster提供,它包括了以"e"开头的实验需求代码和以"t"开头的测试代码,以及一个名为"Course Design...
汇编语言程序设计实例程序代码是学习和掌握汇编语言的关键途径,通过实际编写和分析代码,可以深入理解计算机底层工作原理,提高程序优化能力。 汇编语言的实例通常包括各种类型的任务,例如码字转换和动画效果设计...