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汇编语言程序设计学习-第六章 条件处理-下的更多相关文章

  1. Intel汇编语言程序设计学习-第六章 条件处理-上

    条件处理 本章要点 1.简介 2.布尔和比较指令 3.条件跳转 4.条件循环指令 5.条件结构 6.应用:有限状态机 7.决策伪指令 6.1  简介 本章,读者将看到高级条件分支如何翻译成底层的实现代 ...

  2. Intel汇编语言程序设计学习-第六章 条件处理-中

    6.3  条件跳转 6.3.1  条件结构 在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现.执行条件语句包括两个步骤:首先,使用CMP,AND,SUB ...

  3. Intel汇编语言程序设计学习-第五章 过程-下

    5.3.3  库测试程序 测试程序#1:整数I/O 该测试程序把输出文本的颜色改为蓝底黄字,然后以十六进制数显示七个数组的内容,最后提示用户输入一个有符号整数,再分别以十进制.十六进制和二进制格式重复 ...

  4. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

  5. Intel汇编语言程序设计学习-第五章 过程-上

    过程 5.1  简介 需要阅读本章的理由可能很多: 1.读者可能想要学习如何在汇编语言中进行输入输出. 2.应该了解运行时栈(runtime stack),运行时栈是子过程(函数)调用以及从子过程返回 ...

  6. Intel汇编语言程序设计学习-第三章 汇编语言基础-下

    3.4  定义数据 3.4.1  内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...

  7. Intel汇编语言程序设计学习-第三章 汇编语言基础-中

    3.2  例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...

  8. Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3.1  汇编语言的基本元素 有人说汇编难,有人说汇编简单,我个人不做评价,下面是一个简单的实例(部分代码): main PROC mov  eax,5  ;5送EAX寄存器 add   ...

  9. Intel汇编语言程序设计学习-第一章 基本概念

    第一章基本概念 1.1  简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...

随机推荐

  1. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...

  2. ijkplayer接入使用

    1.ijkplayer简介 ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器.FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播 ...

  3. 从零学脚手架(三)---webpack属性详解

    如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli 在上一篇中,介绍了webpack的entry.output.plugins属性. 在这一篇,接着介绍其它配置属性 ...

  4. h5移动端常见的问题及解决方案

    01.ios端兼容input高度 #问题描述 input输入框光标,光标的高度和父盒子的高度一样,而android手机没问题 android ios #产生原因 通常我们习惯用height属性设置行间 ...

  5. 鸿蒙第三方组件——SwipeCaptcha滑动拼图验证组件

    目录:1.组件效果展示2.Sample解析3.<鸿蒙第三方组件>系列文章合集 前言 基于安卓平台的滑动拼图验证组件SwipeCaptcha( https://github.com/mcxt ...

  6. 卷积神经网络学习笔记——轻量化网络MobileNet系列(V1,V2,V3)

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和Mo ...

  7. 在vscode中go编码发生的问题整理

    引言 使用VsCode进行Go程序开发,我们肯定会碰到一些问题,这些问题有些是IDE的配置问题,有些是下载包的版本不一致问题,本文主要针对在开发过程中碰到的问题做一个简单的回顾和整理. 前期准备,必看 ...

  8. LuckyStar hctf2018

    LuckyStar hctf2018 程序注册有TLS回调函数 char __stdcall TlsCallback_0(int a1, int a2, int a3) { char result; ...

  9. (四)SpringBoot启动过程的分析-预处理ApplicationContext

    -- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇(三)SpringBoot启动过程的分析-创建应用程序上下文,本文将分析上下文创建完毕之后的下一步操作:预处理上下文容器. 预处理上下文 ...

  10. Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖

    1. 背景知识.需求描述与公共依赖 1.1. 背景知识 & 需求描述 Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个 ...