汇编语言标志寄存器OF 标志

  那么,什么是机器所能表示的范围呢?
  比如说,指令运算的结果用 8 位寄存器或内存单元来存放,对于 8 位的有符号数据,机器所能表示的范围是 -128~127,同理对于 16 位有符号数据,机器所能表示的范围是 -32768~32767
  如果运算结果超出了机器所能表达的范围,将产生溢出。
  注意,这里所讲的溢出,只是对有符号数运算而言。含义:我们把运算数当作有符号数的时候,如果超出了最大范围,则把 OF 设置为 1。

 mov al,98
 add al,99

执行后将产生溢出。因为add a1,99进行的有符号数运算是:

(al)=(al)+99=98+99=197

而结果197超出了机器所能表示的8位有符号数的范围:-128-127

mov al,OFOH   ;FOH,为有符号数一16的补码
add al ,088H   ;88H,为有符号数一120的补码

执行后,将产生溢出。因为add a1,088H进行的有符号数运算是:

(al)=(al)+(-120)=(-16)+(-120)=-136

而结果-136超出了机器所能表示的8位有符号数的范围:-128-127
如果在进行有符号数运算时发生溢出,那么运算的结果将不正确。就上面的两个例子来说:

mov al,98
add al,99

add指令运算的结果是((al)=OC5H,因为进行的是有符号数运算,所以al中存储的是有符号数,而C5H是有符号数一59的补码。如果我们用add指令进行的是有符号数运算,则98+99=-59这样的结果让人无法接受。造成这种情况的原因,就是实际的结果197,作为一个有符号数,在8位寄存器al中存放不下。
同样,对于:

mov a1,OFOH    ;FOH,为有符号数一16的补码
add al,088H    ;88H,为有符号数一120的补码

add指令运算的结果是((al)=78H,因为进行的是有符号数运算,所以al中存储的是有符一号数,而78H表示有符号数120。如果我们用add指令进行的是有符号数运算,则-16-120=120这样的结果显然不正确。造成这种情况的原因,就是实际的结果-136,作为一个有符号数,在8位寄存器al中存放不下。
由于在进行有符号数运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。
flag的第11位是OF,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1;如果没有,OF=0
  一定要注意 CF 和 OF 的区别:CF 是对无符号数运算有意义的标志位,而 OF 是对有符号数运算有意义的标志位。另外需要注意的是,一个数可能既是有符号数,也可以是无符号数。也就是说,运算的时候可能会同时影响 CF 和 OF。而对于我们有没有意义倒说不定。前面我们讲过,CPU 在执行 add 等指令的时候,就包含了两种含义:无符号数运算和有符号数运算;对于有符号数运算,CPU 用 CF 位来记录是否产生了进位;对于无符号数运算,CPU 用 OF 位来记录是否产生了溢出。如下所示:

  mov al,0f0h
  add al,88h

  add 指令执行后:CF=1,OF=1。对于无符号数运算,0f0h+88h 有进位,CF=1;对于有符号数运算,0f0h+88h发生溢出,OF=1

  mov al,0f0h
  add al,78h

  add 指令执行后:CF=1,OF=0。对于无符号运算,0f0h+78h 有进位,CF=1;对于有符号数运算,0f0h+78h 不发生溢出,OF=0

  我们可以看出,CF 和 OF 所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,它们之间没有任何关系。

511遇见


发布日期:

所属分类: 编程 标签:  


没有相关文章!