incognito (09.06.2017 13:14, просмотров: 111) ответил 0men на так а в ассемблере посмотреть, что там неладно?
во время вычисления g[1] затирается значение регистра R13 (переменная C3), ну и все дальнейшие вычисления уже будут не верны.
RSEG `CODE`:CODE:REORDER:NOROOT(1)
// 115 void test(void)
test:
// 116 {
PUSH.W R10
PUSH.W R11
SUB.W #0x6, SP
// 117 unsigned char c1, c2, c3;
// 118 unsigned char g[4];
// 119
// 120 c1 = 0xFF;
MOV.B #0xff, R14
// 121 c2 = 0xFF;
MOV.B #0xff, R15
// 122 c3 = 0xFF;
MOV.B #0xff, R13
// 123
// 124 g[0] = ((c1 & 1) << 2) | ((c2 & 1) << 1) | ((c3 & 1) << 0);
MOV.B R13, R12
AND.B #0x1, R12
MOV.B R15, R10
AND.B #0x1, R10
RLA.B R10
MOV.B R14, R11
AND.B #0x1, R11
RLA.B R11
RLA.B R11
BIS.B R10, R11
BIS.B R12, R11
MOV.B R11, 0(SP)
// 125 g[1] = ((c1 & 2) << 1) | ((c2 & 2) << 0) | ((c3 & 2) >> 1);
RRA.B R13
AND.B #0x1, R13
MOV.B R15, R10
AND.B #0x2, R10
MOV.B R14, R11
RLA.B R11
AND.B #0x4, R11
BIS.B R10, R11
BIS.B R13, R11
MOV.B R11, 0x1(SP)
// 126 g[2] = ((c1 & 4) << 0) | ((c2 & 4) >> 1) | ((c3 & 4) >> 2);
BIT.B #0x4, R13
SUBC.W R10, R10
ADD.B #0x1, R10
MOV.B R15, R11
CLRC
RRC.B R11
AND.B #0x2, R11
MOV.B R14, R12
AND.B #0x4, R12
BIS.B R11, R12
BIS.B R10, R12
MOV.B R12, 0x2(SP)
// 127 g[3] = ((c1 & 8) >> 1) | ((c2 & 8) >> 2) | ((c3 & 8) >> 3);
BIT.B #0x8, R13
SUBC.W R10, R10
ADD.B #0x1, R10
CLRC
RRC.B R15
RRA.B R15
AND.B #0x2, R15
CLRC
RRC.B R14
AND.B #0x4, R14
BIS.B R15, R14
BIS.B R10, R14
MOV.B R14, 0x3(SP)
// 128
// 129 // g[4] = ((c1 & 2) << 1) | ((c2 & 2) << 0) | ((c3 & 2) >> 1);
// 130 }
ADD.W #0x6, SP
POP.W R11
POP.W R10
RET