zoukankan      html  css  js  c++  java
  • 标志寄存器02 零基础入门学习汇编语言55

    第十一章:标志寄存器02

     

    让编程改变世界

    Change the world by program


     

    CF标志

     

    flag的第0位是CF,进位标志位。

    一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。   [caption id="attachment_384" align="aligncenter" width="300"] 进位标志位[/caption]   我们知道,当两个数据相加的时候,有可能产生从最高有效位向更高位的进位。 比如,两个8 位数据:98H+98H,将产生进位。   由于这个进位值在8位数中无法保存,我们在前面的课程中,就只是简单地说这个进位值丢失了。 其实CPU在运算的时候,并不丢弃这个进位值,而是记录在一个特殊的寄存器的某一位上。 8086CPU 就用flag的CF位来记录这个进位值。   在Debug中,我们可以看到类似下面的信息: [caption id="attachment_385" align="aligncenter" width="300"] 进位标志位[/caption] [caption id="attachment_386" align="aligncenter" width="300"] 进位标志位[/caption]   比如,下面的指令:

    mov al,98H

    add al,al 

    执行后: (al)=30H,CF=1   CF记录了最高有效位向更高位的进位值

    add al,al  

    执行后: (al)=30H,CF=0, 演示:详细过程请看视频中小甲鱼操作^_^   另外一种情况,而当两个数据做减法的时候,有可能向更高位借位。 比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。 而flag的CF位也可以用来记录这个借位值。 比如,两个 8 位数据:97H-98H,将产生借位,借位后,相当于计算197H-98H。 而flag的CF位也可以用来记录这个借位值。  

    演示:详细过程请看视频中小甲鱼操作^_^

     

    OF标志

      我们先来谈谈溢出的问题。 在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。   那么,什么是机器所能表示的范围呢? 比如:add al,3 ,那么对于 8 位的有符号数据,机器所能表示的范围就是-128~127。 如果运算结果超出了机器所能表达的范围,将产生溢出。 注意,这里所讲的溢出,只是对有符号数运算而言。(就像进位只是相对于无符号数而言!)  

    下面我们看两个溢出的例子。

    示例一: 相关代码下载 示例二: 相关代码下载   如果在进行有符号数运算时发生溢出,那么运算的结果将不正确。 就上面的两个例子来说:

    mov al,98

    add al,99

      add指令运算的结果是(al)=0C5H ,因为进行的是有符号数运算,所以 al中存储的是有符号数,而0C5H是有符号数-59的补码。 如果我们用add 指令进行的是有符号数运算,则98+99=-59这样的结果让人无法接受。 造成这种情况的原因,就是实际的结果 197,作为一个有符号数,在 8 位寄存器al中存放不下。 由于在进行有符号数运算时,可能发生溢出而造成结果的错误。所以CPU需要对指令执行后是否产生溢出进行记录。因此有了OF~  

    记住,一定要注意CF和OF的区别:

    CF是对无符号数运算有意义的标志位;

    而OF是对有符号数运算有意义的标志位。

    对于无符号数运算,CPU用CF位来记录是否产生了进位; 对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出,当然,还要用SF位来记录结果的符号。  

    计算机连他妈妈是谁都不知道

    对于有无符号,计算机是分不清楚状况的,因此他必须两种都记载着,要怎么用,看的是你当他是什么! 例如:

    mov al, 98d

    add al, 99d

    对于无符号数运算,98+99没有进位,CF=0 对于有符号数运算,98+99发生溢出,OF=1  

    adc指令

     

    adc是带进位加法指令 ,它利用了CF位上记录的进位值。

    格式:adc 操作对象1,操作对象2 功能:操作对象1=操作对象1+操作对象2+CF 比如:adc ax,bx 实现的功能是:(ax) = (ax) + (bx) + CF  

    adc指令执行过程演示:

    [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/11_adc指令.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]

    adc指令示例(一)

    mov ax,2

    mov bx,1

    sub bx,ax

    adc ax,l

    执行后,(ax)=4。 adc执行时,相当于计算: (ax) + 1 + CF = 2 + 1 + 1 = 4  

    adc指令示例(二)

    mov ax,1

    add ax,ax

    adc ax,3

    执行后,(ax)=5 adc执行时,相当于计算: (ax) + 3 + CF = 2 + 3 + 0 = 5  

    adc指令示例(三)

    mov al,98H

    add al,al

    adc al,3

    执行后,(ax)=34H adc执行时,相当于计算: (ax) + 3 + CF = 30H + 3 + 1 = 34H   在执行 adc 指令的时候加上的 CF 的值的含义,由 adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。 显然,如果CF 的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。  

    我们来看一下两个数据:0198H和0183H如何相加的:

    [caption id="attachment_388" align="aligncenter" width="300"] 0198H和0183H如何相加的[/caption]  

    可以看出,加法可以分两步来进行:

    (1)低位相加; (2)高位相加再加上低位相加产生的进位值。   下面的指令和add ax , bx具有相同的结果:add al,bl adc ah,bh 看来CPU提供 adc 指令的目的,就是来进行加法的第二步运算的。 adc指令和add指令相配合就可以对更大的数据进行加法运算。  

    编程任务

      编程计算1EF000H + 201000H 结果放在ax(高16位)和 bx(低16位)中。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LNQNXRHDFSCA']视频下载[/Downlink]
  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3847029.html
Copyright © 2011-2022 走看看