补码与算术右移指令
补码杂谈
补码的优越性,使得用最高位作符号的原码显得多余。正数的补码是它本身,负数的补码通过对其绝对值进行求补获得。求补运算是将数值按位取反,再加一。不要与补码的概念混淆。它具有许多的优良的特性。
求补过程与反求补过程为同一过程,也就是说,对一个数求补两次后,还是这个数本身。通过补码的物理意义这是很好理解的。也可以分析求补的运算过程来说明。对某数按位取反后,加上1,这时开始从最低位向高位进位,直到某个高位上为零,无法向更高位进位为止(当然有个极端的情况的就是对0求补,而0的求补结果为其本身,大可抛开它不谈)。产生的效果是最低的若干位被取反,且这若干位的形式应该为1加上若干个0(当然可以是0个)。这些被加1影响的若干位就相当于被取反了两次,也就是说得到的是它们原来的样子。而未被加1影响的部分则被取反了一次。再进行一次求补运算,看看会出现什么结果。先取反,这样未被加1影响的部分就进行了两次取反而恢复了原貌。而被加1影响部分取反后得到的形式为一个0带上若干个1(可以为0个1),这样的形式在加上1后会被全部取反,而不影响别的部分。这样这部分又恢复了原貌。所以整个数又恢复了原貌。
用补码进行加法运算的时候,易于判断结算是不是溢出。判断的方法是计算次高位与最高位向其高位的进位的异或,结果若为0则表示正常,否则表示溢出。溢出的情形无非两种,分别为两正数与两负数相加的时候。两正数相加是次高位进位时,显然是溢出的情形,而这时最高位为0,无法再进位,这样进位异或结果为1,反映溢出;两负数相加时,最高位肯定有进位。这样,只有次高位无法进位时,才使异或结果为1。而这时,表示的就是溢出。可以把负数的绝对值看成油罐中的油,其补码除最高位后的部分可以看成油罐中的剩余空间。当两罐油倒成一桶进,如果剩下的空间没有够一罐,那么油一定溢出了。
算术右移指令
算术右移指令SAR(shift arithmetic right)的操作是,将寄存器中的数值右移,最左端用最高位填充,而不是补零。这里分析它为什么不直接补零的原因。为方便讨论,考虑右移一位的情况。右移若干位的情况,也可做相似的分析。
不直接补零的根本原因是为了不改变数值的符号并且使得数值是原来的一半。众所周知,符号数是以补码的形式存储在计算机内的。正数的补码是其本身,最高位为0。 右移1位时,最高位补零,其值缩小一半。这没有什么问题。对于负数,其补码为对其绝对值求补后获得。最高位补1,也相当于次高位补1,能达到缩小一半的效果吗?那要看右移后对应的原码是否为原来的一半了。也就是,在最高位与次高位是不是0。要查看原码,只需对结果求一次补就行了。求补第一步是取反,这样填充的1就成了0,没有出现问题,但还得看第二步加1。哪些情况下加上1可能会影响次高位呢?答案只有两个数。当原来的补码除最高位与最低位都是0的时候,右移一位后除最高位外都是0,在求补进取反后这些0变成了1,加1后,进位会影响到次高位,使之变成1(经取反后,次高位被置成了0),而原码的次高位应该填充0的,这样就没有达到缩小原数的效果。以4位数为例,这样的数为:1000,1001。1000如果要计算机看成符号数的话,会被看成-16!而其它数,因为中间部分有1,取反后变成了0,加1后的进位不能影响到次高位,所有可以达到缩小原数且不改变符号的效果。
计算机求补的情形不多,一是指令中的数含有负号的时候,但如果指令中出现负0,也就是‘-0’汇编器会把它变成0。二是作减法运算的时候。
分享到:
相关推荐
右移则有两种方式,逻辑右移(高位用0填充)和算术右移(高位用符号位填充),在处理负数时要特别注意。 3. **比较操作**:比较两个补码数可以判断它们的大小,通过比较结果来执行条件分支。 4. **位操作**:如AND...
移位指令也是8086/8088指令系统中的重要部分,包括算术左移、算术右移、逻辑右移、非循环移位和循环移位等,它们用于移动操作数的位,有时还会影响标志位,例如进位标志,这对于算术运算和位处理至关重要。...
浮点算术运算指令用于实现浮点数的算术运算。常见的浮点算术运算指令包括: * ADD_R:实数加法 * SUB_R:实数减法 * MUL_R:实数乘法 * DIV_R:实数除法 * ABS:浮点数绝对值运算 * SQR:浮点数平方 * SQRT:浮点数...
- **SAR (Shift Right Arithmetic)**:算术右移指令。 - **格式**:`SAR r/m, data/CL` - **SAL (Shift Left Arithmetic)**:算术左移指令。 - **格式**:`SAL r/m, data/CL` - **ROR (Rotate Right)**:循环...
这些指令用于执行基本的算术运算,包括加、减、乘、除等。 ##### 12. 平方根、平方及对数函数指令 这些指令用于执行更复杂的数学运算。 ##### 13. 三角函数指令 三角函数指令(如SIN、COS)用于执行三角函数运算...
- **SHR/SAR**:用于逻辑右移或算术右移。 - **ROL/ROR/RCL/RCR**:分别用于循环左移、循环右移、通过进位的循环左移和通过进位的循环右移。 这些指令支持直接移位(最多1次)以及由CL寄存器指定的多次移位。 ####...
- 算术右移指令是将操作数的各位向右移动,根据是否保留符号位,分为逻辑右移和算术右移。算术右移会保留符号位,即如果原数为负,则高位补1,正数则补0。 - 原码除法指的是操作数使用原码表示,然后再进行除法...
例如,对于-12的补码表示11111100B,算术右移1位后是11111111B,仍表示-6,因为保留了符号位。 移位操作在实现乘法和除法运算时具有很高的效率。例如,若要计算x乘以10,可以使用左移操作。在32位环境中,可以用...
19. **二位算术右移**:对于8位补码操作数,进行两位算术右移会将符号位复制到最高位。 20. **定点运算**:减法通常通过补码运算的二进制加法器来实现。 21. **浮点运算**:浮点数的加减运算包括对阶、尾数运算、...
NEG指令用于计算操作数的补码,即将操作数取反后再加1,相当于求操作数的相反数。 #### MUL, IMUL - 乘法指令 MUL指令执行无符号乘法,IMUL指令执行带符号乘法。影响的标志位包括C、P、A、Z、S、O。 #### DIV, ...
2. **SHR, SHL, SAR, SAL**:这些指令用于位移操作,包括逻辑右移、逻辑左移、算术右移和算术左移。 3. **ROR, ROL, RCR, RCL**:这些指令用于循环位移,即循环右移、循环左移、循环带进位右移和循环带进位左移。 ...
- 一个负数的补码进行算术右移(保持符号位不变),相当于除以2并向下取整,因此(A5)16进行2位算术右移后得到(E9)16,对应选项C。 5. **其他计算机基础知识**: - CD光盘的信息存储在多条螺旋形的光道上,对应...
- **标志传送指令**:如`LAHF`和`SAHF`用于标志寄存器和AH寄存器之间的数据传递,`PUSHF`和`POPF`用于标志寄存器与堆栈之间的数据交换。 #### 2. 算术运算 - **加法指令**:如`ADD`用于不带进位的加法,`ADC`用于...
### 常用ARM指令集及汇编 ... - **ASR**:算术右移指令。 综上所述,ARM指令集和Thumb指令集各自拥有其独特的优点和应用场景。开发者可以根据具体的需求选择适合的指令集进行编程,以实现高效且资源利用充分的目标。
其中,算术与逻辑运算指令用于完成算术运算或逻辑运算,移位操作指令用于把指定的两个操作数左移或右移一位,转移指令用于解决数据调用次序的需要,特权指令用于系统软件,通常不提供给用户。 3. 零地址的运算类...
- `ASR`:执行算术右移操作。 - `LSL`:执行逻辑左移操作。 - `LSR`:执行逻辑右移操作。 - `ROR`:执行循环右移操作。 **比较指令** - `CMP`:执行比较操作,不保存结果,仅更新条件码。 - `CMN`:执行补码加法...
19. **补码算术右移**:8位补码数据10010101算术右移一位后,最高位(符号位)不变,其余位右移,结果为11001010,即0CAH。 这些题目覆盖了计算机组成原理的核心知识点,对于理解计算机系统的工作原理至关重要。...
在AB PLC中,通常采用算术右移,即在数值右移时,保持最高位(符号位)不变,右侧用原符号位填充。这样可以保留原数值的符号,对于负数尤其重要。例如,二进制数1110(-2,补码表示)右移1位后变成1111(-1)。 3. ...
接着,是算术运算指令: 1. `ADD` 和 `ADC` 指令:执行加法操作,`ADC` 还会考虑进位标志。例如,`ADD AX, BX` 相当于AX + BX,`ADC CX, DX` 则是CX + DX + CF(进位标志)。 2. `SUB` 和 `SBB` 指令:执行减法...