汇编基础学习9

文章转自 http://www.mcany.cn/article/284.htm

博主 没落的残阳

 

这节我们来讲解下“标志位”。  因为无论何时,当程序执行算术运算时都有可能发生因溢出而导致的错误。。 高级语言并不侦测溢出错误。。 这导致我们往往很难发现BUG。 于此相反,在汇编语言中由于执行每步操作后,检查cpu的状态值。因为(因此)可以很好的控制溢出错误。。。
     所以从以上我们得到结论: “标志位”标示的是我们的cpu的状态值。。。
  

   今天我们讲解的是算术运算的影响的标志,例如ADD SUB INC DEC指令影响的标志。


    那么ADD SUB  INC DEC指令我在这里大致的介绍下。。

   1.ADD 指令将同尺寸的源操作数和目的操作数相相加结果返回给目的操作数。举个例子

    ADD EAX, EBX   那么就等于 EAX  =  EAX + EBX
  
   2.SUB指令将源操作数从目的操作数中减掉,结果同样返回目的操作数。 举个例子

    SUB EAX, EBX    那么就等于 EAX = EAX - EBX

   3.INC DEC指令是将 从操作数中加一或者减1,它只有一个操作数

    例如 INC EAX = EAX + 1        DEC EAX  = EAX - 1


标志位:

1.    首先讲解下“零标志”和 “符号标志”。“零标志” 它的标志位标示是“ZF”,它一般是当算术运算指令的目的操作数被赋以零值的时候,零标志就被相应的设置。。 它是非常有用的,因为很多的跳转指令是检查零标志位,从而进行跳转的。。

     举个例子:
     mov ecx, 1h
     sub ecx, 1h  
   注意此时目的操作数变为0了,那么相应的零标志位就被赋值。此时ZF = 1。 在之前我已经说过 计算机内存是以二进制形式存储数据的,二进制的基数是2.它能标示的也就是"0", "1"
。一般我们把0标示布尔类型的fasle   1标示布尔类型的true 。 因为我们大千世界,往往要发生很多不可预料的事情。那么就需要做出判断。此时假设我们的计算机只有1来标示,那么它就是畅通无阻的,根本就不能判断了。

      

    说了这么多,到底是想表达什么呢。 我只是想说在计算中内存中我们的数据只有两种标示状态1 和 0 。 那么ZF置于1,标示此时操作数结果“的确(真)”是0。  如果ZF置于0,因为0标示false,那么就标示操作数结果“不是(假)”0 。

    在举个例子
    mov eax, 2h
    sub eax, 1h
    此时目的操作数结果eax = 1h ,所以此时ZF标志位 = 0  。 表示目的结果不是0。


    但是我们举的例子都是无符号整数,那么有符号整数是如何影响标志位的呢。。因为有时候需要判断我们的运算结果 目的操作数 到底是否是负数。 因为负数代表的就是有符号了。例如eax = -1h  "-"就是负数的符号标示。 那么我们的符号标志位 是“SF”,如果我们的目的操作数的结果是有符号值的话,那么SF = 1  。

   举例
   mov  eax, -2h
   sub  eax, 1h
   此时因为我们的目的操作数eax寄存器的结果是有符号数值,所以此时SF = 1,标示“的确(真)” 是有符号。呵呵这样理解大家好理解。。
  
  相应的  
  
   mov  eax, -2h
   add  eax, 2h
   此时因为eax寄存器的值是无符号的。所以此时SF =0, 嘿,注意没。eax 结果是0的。所以此时ZF = 1
    



2.接下来讲解“进位标志”。
进位标志一般用于(无符号算术运算) 。

“ 只有当cpu执行无符号算术运算的时候,进位标志才有意义”。 如果无符号加法运算结果对目的操作数而言太大(或者太小)而无法容纳时候,进位标志将被设置。。举例

   MOV AX,9FFF
   ADD AX,9FFF
   此时因为ax = 9FFF+9FFF = 13FFE, 因为ax寄存器是eax寄存器的低16位寄存器,所以只能容纳2个字节也就是只能“3FFE”,那么此时最高位的1将抛弃,此时我们的进位标志CF = 1, 表示“的确(真)进位”。

   例如
   mov ax, 0030h
   add ax, 3333h
   此时ax = 3363h,此时目的操作数结果是2个字节,所以并美誉发生进位操作。此时CF就表示0 。



总结: 这些标志位只有两个状态那就是 "0"->假    "1" -> 真。  例如ZF = 1 ,标示运算结果“真”的为0。 ZF为0 标示运算结果不为0。

这些标志位,大家不用刻意的去记。等用的多了自然就记住了。 不过你如果想记。那么你可以这样。。 例如 ZF = Zero Flags 零标志
SF = Sign Flags 符号标志  这样记得时候就好多了。直接把相应的单词拼写出来,然后写的时候值用各个单词的首字母即可。。 好今天的课程就讲这么多。下节课我们来讲解其他的标志位,以及一些跳转指令所依据的标志位的状态(也是非常重要的,因为在做免杀遇到一些分之语句,有时我们需要通过标志位来判断该怎么修改)

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值