??? 03/24/12 07:25 Read: times |
#186851 - Both Carry and MSB Responding to: ???'s previous message |
No both the carry flag and the most significant bit must be examined after subtraction of signed integers. A better solution is to offset both operands into unsigned space before subtracting by 'adding' 0x8000. Here's what SDCC generates:
;------------------------------------------------------------ ;Allocation info for local variables in function 'sub' ;------------------------------------------------------------ ;y Allocated with name '_sub_PARM_2' ;x Allocated to registers r6 r7 ;------------------------------------------------------------ ; sub.c:1: char sub (int x, int y) ; ----------------------------------------- ; function sub ; ----------------------------------------- _sub: mov r6,dpl mov r7,dph ; sub.c:3: return x < y; clr c mov a,r6 subb a,_sub_PARM_2 mov a,r7 xrl a,#0x80 mov b,(_sub_PARM_2 + 1) xrl b,#0x80 subb a,b clr a rlc a mov dpl,a ret And the zero flag only reflects the most sigificant byte. For equality checking you'd better use CJNE. |
Topic | Author | Date |
16 bit vs 8bit signed compare | 01/01/70 00:00 | |
8051 arithmetic 16 bit signed integer | 01/01/70 00:00 | |
The answer is MSB bit | 01/01/70 00:00 | |
Both Carry and MSB | 01/01/70 00:00 | |
< Have tried "Tutorials" there? | 01/01/70 00:00 |