Intel汇编语言程序设计学习-第六章 条件处理-下
6.6 应用:有限状态机
这个东西说了半天,感觉就是把逻辑弄得跟有向图一样,没看出来什么高端的东西,下面就整理下书上说的概念:
有限状态机(FSM,Finite-State Machine)是依据输入改变状态机器或程序。使用图来表示一个有限状态机是非常简单的,图种方块(或原)称为节点,节点之间带箭头的线称为边(edge)或弧(arc)。
6.6.1 输入字符串的验证
读取输入流程的程序通常必须执行一定的错误检查步骤以验证输入。比如我们定义如下几条规则:
1.字符串必须以字母x开始,以字母z结束。
2.在第一个和最后一个字符之间,可以有0或多个字符,但字符必须在范围{‘a’~’y’}之内。
6.6.2 有符号整数的验证
有限状态机很容易翻译成汇编代码。图中的每个状态(A,B,C...)都由程序中一个标号标识,各标号处执行以下动作:
A:调用输入过程,从输入中读取下一个字符。
B:如果是终结状态,则检查用户是否输入了回车结束输入。
C:使用一条或多条比较指令检查从当前状态到其他状态的可能转换,每条比较指令后面都紧跟一条跳转指令。
实现下上面的那和输入检测:
TITLE Finite State Machine (Finite.asm)
INCLUDE Irvine32.inc
ENTER_KEY = 13
.data
InvalidinputMsg BYTE "Invalid input" ,13 ,10 ,0
.code
main PROC
call Clrscr
StateA:
call Getnext
cmp al ,'+'
je StateB
cmp al ,'-'
je StateB
call IsDigit
jz StateC
call DisplayErrorMsg
jmp Quit
StateB:
call Getnext
call IsDigit
jz StateC
call DisplayErrorMsg
jmp Quit
StateC:
call Getnext
call IsDigit
jz StateC
cmp al ,ENTER_KEY
je Quit
call DisplayErrorMsg
jmp Quit
Quit:
call Crlf
exit
main ENDP
;--------------------------------
Getnext PROC
;
;Read a character from standard input.
;Receives : nothing
;Returns : nothing
;--------------------------------
call ReadChar
call WriteChar
ret
Getnext ENDP
;--------------------------------
DisPlayErrorMsg PROC
;Display an error message indicating that
;the input stream contains illegal input.
;Receives : nothing
;Returns : nothing
;--------------------------------
push edx
mov edx ,OFFSET InvalidInputMsg
call WriteString
pop edx
ret
DisPlayErrorMsg ENDP
END main
对应的流程图:
6.7 决策伪指令
MASM的决策伪指令{.IF .ELSE .ELSEIF .ENDIF}使得在编写涉及到多路分支逻辑的代码时更加容易。汇编器在幕后为这些伪指令自动生成CMP和条件跳转指令。
.IF condition1
statements
[.ELSEIF condition2
statements ]
[.ELSE
statements ]
.ENDIF
方括号是是可选部分,但是.IF和.ENDIF是必须的。可支持的关系运算符如下:
6.7.1 有符号比较和无符号比较
这一节想表达的意思是.IF...比较有符号和无符号的时候,汇编器最后翻译的代码是不一样的。这个很好理解 比如
JA JB 对应的是
JG JL等等。
6.7.2 复合表达式
这一节是说.IF等可以直接使用
&& || ..等逻辑算数符,和高级语言一样。
6.7.3 .REPEAT和.WHILE伪指令
.WHILE 和C++等语言里的while差不多,格式是这样
.WHILE condition
statements
.ENDW
而.REPEAT则类似
DO...WHILE格式是这样:
.REPEAT
statements
.UNTILE condition
写个小例子,计算数组中大于等于4小于6的所有数之和:
刚开始写这个简答的小程序的时候有个小插曲,
在 .IF [esi] >= 4
的地方编译不过去,然后 .IF DWORD PTR[esi]可以编译过去,但是add eax ,[esi]却可以,woc我突然忘记怎么遍历数组了。于是就又查了之前的笔记,下面我用三种方式实现(为了练习):
1.
TITLE Finite State Machine (Finite.asm)
INCLUDE Irvine32.inc
ENTER_KEY = 13
.data
intArray DWORD 1,2,3,4,5,6,7,8,9,10
.code
main PROC
mov esi ,OFFSET intArray
mov edx ,0
mov eax ,0
.WHILE edx < 10
.IF DWORD PTR [esi] >=4 && DWORD PTR[esi] < 6
add eax ,DWORD PTR [esi]
.ENDIF
add edx ,1
add esi ,TYPE DWORD
.ENDW
call WriteInt
exit
main ENDP
END main
2.
TITLE Finite State Machine (Finite.asm)
INCLUDE Irvine32.inc
ENTER_KEY = 13
.data
intArray DWORD 1,2,3,4,5,6,7,8,9,10
.code
main PROC
mov esi ,OFFSET intArray
mov edx ,0
mov eax ,0
.WHILE edx < 10
.IF DWORD PTR[esi] >=4 && DWORD PTR[esi] < 6
add eax ,[esi]
.ENDIF
add edx ,1
add esi ,TYPE DWORD
.ENDW
call WriteInt
exit
main ENDP
END main
3.
TITLE Finite State Machine (Finite.asm)
INCLUDE Irvine32.inc
ENTER_KEY = 13
.data
intArray DWORD 1,2,3,4,5,6,7,8,9,10
.code
main PROC
mov esi ,0
mov edx ,0
mov eax ,0
.WHILE edx < 10
.IF intArray[esi] >=4 && intArray[esi] < 6
add eax ,intArray[esi]
.ENDIF
add edx ,1
add esi ,TYPE DWORD
.ENDW
call WriteInt
exit
main ENDP
END main
运行结果:(第三种)
6.8本章小结
我没有必要去总结书上的总结,还是直接粘贴过来:
Intel汇编语言程序设计学习-第六章 条件处理-下的更多相关文章
- Intel汇编语言程序设计学习-第六章 条件处理-上
条件处理 本章要点 1.简介 2.布尔和比较指令 3.条件跳转 4.条件循环指令 5.条件结构 6.应用:有限状态机 7.决策伪指令 6.1 简介 本章,读者将看到高级条件分支如何翻译成底层的实现代 ...
- Intel汇编语言程序设计学习-第六章 条件处理-中
6.3 条件跳转 6.3.1 条件结构 在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现.执行条件语句包括两个步骤:首先,使用CMP,AND,SUB ...
- Intel汇编语言程序设计学习-第五章 过程-下
5.3.3 库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...
- Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下
4.3 和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...
- Intel汇编语言程序设计学习-第五章 过程-上
过程 5.1 简介 需要阅读本章的理由可能很多: 1.读者可能想要学习如何在汇编语言中进行输入输出. 2.应该了解运行时栈(runtime stack),运行时栈是子过程(函数)调用以及从子过程返回 ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
3.4 定义数据 3.4.1 内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...
- Intel汇编语言程序设计学习-第三章 汇编语言基础-上
汇编语言基础 3.1 汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov eax,5 ;5送EAX寄存器 add ...
- Intel汇编语言程序设计学习-第一章 基本概念
第一章基本概念 1.1 简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...
随机推荐
- 关于 PDB 文件你需要知道什么?
引言 大多数人知道 PDB 文件是用来帮助我们 debug 的,但也仅此而已. 本文主要介绍当你遇到 PDB 文件时(windows 开发中),你必须要知道的内容. 重要的事情说三遍 PDB 文件和源 ...
- uni-app(二)接口请求封装,全局输出api
在项目 main.js 同级创建 utils 文件夹, utils里创建 config.js文件,存储重要参数 // 获取平台信息 const { system, } = uni.getSystemI ...
- MyBatis(九):MyBatis类型处理器(TypeHandler)详解
TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...
- python基础学习之简化占位符和格式化的概念
简化版占位符有哪些? %s 字符串占位符,代表该位置有一个字符串待替换(万能) %d 数字占位符,代表该位置有一个数字待替换 %f 同上,这里是浮点数,float[默认保留6位小数] % ...
- MongoDB4.2 分片扫盲说明
说明: 在扫盲MongoDB相关的一些知识的时候,顺手做下笔记.本文将说明分片相关的内容.在比较早之前已经对这些有过说明,可以看MongoDB 分片的原理.搭建.应用.分片(sharding)是指将数 ...
- POJ3278_Catch That Cow(JAVA语言)
思路:bfs裸题.三个选择:向左一个单位,向右一个单位,向右到2*x //注意,需要特判n是否大于k,大于k时只能向左,输出n-k.第一次提交没注意,结果RE了,, Catch That Cow Ti ...
- SetWindowsHookEx 消息钩取进程卡死
<逆向工程核心原理> windows消息钩取部分的例子在win10下卡死,失败.通过搜索发现,要保证钩取的进程与注入的dll要保持cpu平台相同 SetWindowsHookEx可用于将d ...
- 【故障公告】阿里云 RDS SQL Server 数据库实例 CPU 100% 引发全站故障
非常抱歉,今天 8:48 开始,我们使用的阿里云 RDS SQL Server 数据库实例突然出现 CPU 100% 问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故障后立即进行主备切换,和 ...
- Hive中静态分区和动态分区总结
目录 背景 第一部分 静态分区 第二部分 动态分区 第三部分 两者的比较 第四部分 动态分区使用的问题 参考文献及资料 背景 在Hive中有两种类型的分区:静态分区(Static Partitioni ...
- ECharts绘制折线图
首先看实现好的页面 实现 首先引入echarts工具 // vue文件中引入echarts工具 let echarts = require('echarts/lib/echarts') require ...