Hi!
This one's easy.
Looking at the stdlib.h, abs() is defined as
extern __inline__ int abs(int __x)
{
return (__x < 0) ? -__x : __x;
}
This means, the return value is SIGNED int. And signed (short) int cannot be
32768.
If you think that is an unfortunate implementation, you're not alone. But this
is the C standard definition.
JMGross
--=-bic8ezq2hpUbpjqBInWI
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Here is a sample program show the problem:
#include <io.h>
int main()
{
short i = -32768;
unsigned long n = abs(i);
unsigned long o = -i;
LPM0;
}
Program received signal SIGINT, Interrupt.
main () at main2.c:8
8 }
(gdb) p i
$1 = -32768
(gdb) p n
$2 = 4294934528
(gdb) p o
$3 = 4294934528
(gdb) p /x i
$4 = 0x8000
(gdb) p /x n
$5 = 0xffff8000
(gdb) p /x o
$6 = 0xffff8000
(gdb)
The problem occurs independent of gdb and optimization options. Attached
is the lst output.
Carl
--=-bic8ezq2hpUbpjqBInWI
Content-Disposition: attachment; filename=main2.lst
Content-Type: text/plain; name=main2.lst; charset=UTF-8
Content-Transfer-Encoding: 7bit
GAS LISTING /tmp/cckfHnzP.s page 1
1 .file "main2.c"
2 .arch msp430x2618
3
4 /* Hardware multiplier registers: */
5 __MPY=0x130
6 __MPYS=0x132
7 __MAC=0x134
8 __MACS=0x136
9 __OP2=0x138
10 __RESLO=0x13a
11 __RESHI=0x13c
12 __SUMEXT=0x13e
13
21 .Ltext0:
22 .p2align 1,0
23 .global main
25 /***********************
26 * Function `main'
27 ***********************/
28 main:
29 .LFB0:
30 .LM1:
31 0000 3140 0000 mov #(__stack-10), r1
32 0004 0441 mov r1, r4
33 .LCFI0:
34 /* prologue ends here (frame size = 10) */
35 .L__FrameSize_main=0xa
36 .L__FrameOffset_main=0xc
37 .LM2:
38 0006 B440 0080 mov #llo(-32768), 8(r4)
38 0800
39 .LM3:
40 000c 1F44 0800 mov 8(r4), r15
41 0010 0F93 tst r15
42 0012 0234 jge .Lae9
43 0014 3FE3 inv r15
44 0016 1F53 inc r15
45 .Lae9:
46 0018 844F 0400 mov r15, 4(r4)
47 001c 9444 0400 mov 4(r4), 4+2(r4)
47 0600
48 0022 9454 0600 rla 4+2(r4)
48 0600
49 0028 9474 0600 subc 4+2(r4), 4+2(r4)
49 0600
50 002e B4E3 0600 inv 4+2(r4)
51 .LM4:
52 0032 1F44 0800 mov 8(r4), r15
53 0036 3FE3 inv r15
54 0038 1F53 add #1, r15
55 003a 844F 0000 mov r15, @r4
56 003e A444 0200 mov @r4, 2(r4)
57 0042 9454 0200 rla 2(r4)
57 0200
58 0048 9474 0200 subc 2(r4), 2(r4)
58 0200
59 004e B4E3 0200 inv 2(r4)
GAS LISTING /tmp/cckfHnzP.s page 2
60 .LM5:
61 /* #APP */
62 ; 7 "main2.c" 1
63 0052 32D0 1000 bis #16, r2
64 ; 0 "" 2
65
66 /* epilogue: frame size = 10 */
67 .LM6:
68 /* #NOAPP */
69 0056 3150 0A00 add #10, r1
70 .LCFI1:
71 005a 3040 0000 br #__stop_progExec__
72 .LFE0:
73 .Lfe1:
75 ;; End of function
76
108 .Letext0:
GAS LISTING /tmp/cckfHnzP.s page 3
DEFINED SYMBOLS
*ABS*:00000000 main2.c
/tmp/cckfHnzP.s:5 *ABS*:00000130 __MPY
/tmp/cckfHnzP.s:6 *ABS*:00000132 __MPYS
/tmp/cckfHnzP.s:7 *ABS*:00000134 __MAC
/tmp/cckfHnzP.s:8 *ABS*:00000136 __MACS
/tmp/cckfHnzP.s:9 *ABS*:00000138 __OP2
/tmp/cckfHnzP.s:10 *ABS*:0000013a __RESLO
/tmp/cckfHnzP.s:11 *ABS*:0000013c __RESHI
/tmp/cckfHnzP.s:12 *ABS*:0000013e __SUMEXT
/tmp/cckfHnzP.s:28 .text:00000000 main
UNDEFINED SYMBOLS
__stack
__stop_progExec__