- 浏览: 108724 次
- 性别:
- 来自: 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 1328内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2256本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1798本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2178来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2575内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4095来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1791来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2129代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1889来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4174来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1319来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2178来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1563来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3698来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 996215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1402来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1186来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4338来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言表格驱动分支选择代码分析(4)
2009-10-16 14:48 1451来自于《Intel汇编语言程序设计》(第四版)第六章。 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1304《Intel汇编语言程序 ...
相关推荐
汇编语言源代码大全汇编语言源代码大全汇编语言源代码大全汇编语言源代码大全
WINDOWS下32位汇编语言程序设计 代码 WINDOWS下32位汇编语言程序设计 代码
许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你需要的许多汇编语言源代码 有你...
在Linux的核心代码中,还是存在相当一部分的汇编语言代码。如果你想顺利阅读Linux代码的话,你不可能绕过这一部分代码。在Linux使用的汇编语言代码中,主要有两种格式:一种是直接写成汇编语言源程序的形式,这一...
贪吃蛇汇编语言完整源代码哦,可以直接运行,功能强大。
汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言...
汇编语言学习源代码,都是一些小程序,包含简单图形的显示等
Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全)
汇编语言 基础教程 源代码 毕业设计汇编语言 基础教程 源代码 毕业设计汇编语言 基础教程 源代码 毕业设计
professional assembly language 汇编语言程序设计 by richard blum。源代码。
汇编语言START:MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H MOV IE,#88H SETB TR1 MOV SP,#60H MOV 20H,#20 ;秒技术器 MOV 21H,#60 ;分技术器 MOV 22H,#60 ;时技术器 ;中断次数
汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言汇编语言
好东西哈哈哈哈哈哈汇编语言 词法分析汇编语言 词法分析汇编语言 词法分析汇编语言 词法分析哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
《汇编语言源代码大全》.rar
网卡源代码 汇编语言 网卡源代码 汇编语言 网卡源代码 汇编语言 网卡源代码 汇编语言 网卡源代码 汇编语言
汇编语言 王爽 实验七 独立完成 汇编语言 王爽 实验七 独立完成
汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM, TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象...
汇编语言 源代码 总共有27个基础实例 汇编语言 源代码 总共有27个基础实例 汇编语言 源代码 总共有27个基础实例
汇编语言程序产生的代码运行效率高。因此,到目前为止,许多软件系统(例如操作系统等)的核心部分仍然用汇编语言来编写。 计算机专业所培养的学生,不应仅仅满足于利用他人已开发出来的软件和软件工具来解决实际...
汇编语言代码集,东西比较散而多,没有目录,有精力的可以下来看看。