8位汇编:添加2个16位数字而不会溢出?

问题描述 投票:0回答:1

您好,我想添加2个short int并以short int形式获取结果。如果结果大于32767,则结果必须变为32767,如果结果小于-32768,则必须变为-32768。任何人都可以帮忙请给我吗?

.include "m32def.inc" 
  LDS R5,0x63 
  LDS R4,0x62 
  LDS R3,0x61 
  LDS R2,0x60 
  LDI R31,high(32767) 
  LDI R30,low(32767) 
  LDI R29,high(-32768) 
  LDI R28,low(-32768) 
  MOVW R17:R16,R5:R4 
  ADD R16,R2 
  ADC R17,R3 
  CP R16,R28 
  CPC R17,R29 
  BRGE loop1 
  CP R30,R16 
  CPC R31,R17 
  BRGE loop2 
loop1: MOV R16,R30 
  MOV R17,R31 
telos1: RJMP telos1 
loop2: MOV R16,R28 
  MOV R17,R29 
telos2: RJMP telos2 
assembly atmel atmega32
1个回答
0
投票

欢迎来到论坛。您的问题中遗漏了很多信息,可能对我们有用。对于您使用的是汇编语言而非C语言,我感到有些惊讶。

取决于您的处理器,short可能不是16位值,但是正如您提到的32767和-32768一样,我认为是。

请原谅我,如果您已经知道这一点,但是您的问题使我认为您不知道。

16位有符号值可以采用-32768至32767的值,该值由二进制的1111 1111 1111 11110111 1111 1111 1111表示-前导位表示该值为负。

16位无符号可以采用0到65535(1111 1111 1111 1111)的值,因为前导位没有表示负数。

我认为您的计算就像:

short a = 32767;
short b = 1;
short result = a + b;

当您在计算中使用signed值(short而不是unsigned short)时,这就是为什么大于32767的值变为负数的原因。 32767 +1 => -32768(0111 1111 1111 1111 +0000 0000 0000 0001=> 1000 0000 0000 0000

理想情况下,在执行计算时,应确保接收数据类型足够大以容纳该值,因此,在这种情况下,如果32位更好,则应选择int

然后您可以针对32767和-32768的限制测试结果。

© www.soinside.com 2019 - 2024. All rights reserved.