assembly 如何做十六进制减法和它如何影响手臂标志

lsmd5eda  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(85)

我是新来的。
所以我有如下的指令

SUBS R2, R4, R3
Initial condition N = 0, Z = 0, C = 1, V = 0, Q = 0

寄存器中的值有符号

R2 = 0000 0000 H
R3 = 7FFF FFFE H 
R4 = 8000 0002 H

我学到的一个方法是直接减去

8000 0002 H
- 7FFF FFFE H 
-------------
  0000 0004 H

但使用两个补码-7FFF FFFE H --> +8000 0002

8000 0002 H
+ 8000 0000 H 
-------------
1 0000 0004 H

但这没有任何意义,因为8000 0002 H是一个负数,减去7FFF FFFE H是一个正数,这应该给予一个大负数。是否溢出,初始条件的进位是否受到影响?
因为在解书中,我得到C=0,没有溢出。

q5iwbnjs

q5iwbnjs1#

使用减法你必须借用,你忘记了借用最高位
例如,在基数10中。

500
-600
====

我们划掉5,从它旁边的零借用(无限)

1400
  • 600 ==

如果你想在基数2中做减法,你还必须借用。

000
-100
=====

1000
-100
=====

纠正你的减法:

1
  8000 0002 H
- 7FFF FFFE H 
-------------
  0000 0004 H

使用二进制补码(处理器会看到它)

1
  8000 0002
+ 8000 0001
==============

 1000000001
  8000 0002
+ 8000 0001
==============
  0000 0004

二进制补码不会破坏数学,这就是它与二进制逻辑实现很好地工作的一点,将减法转换为加法,这是一个更简单的逻辑(有些人可能会争论它更简单,我认为你需要一个进位输入/输出和一个单独的借位输入/输出减法,但加法只是进位)
寄存器限制为32位,您无法神奇地将位添加到寄存器以使其成为33位。
你可以做实验,看看你是否认为手臂是一个反进位,并进行减法。有些架构可以,有些则不行。
永远不要假设进位标志=进位输出(比较/减法),总是确认。

相关问题