Код
(*1)
if ((dw & 0x0FFFFFFFul) == 0x01234567ul) {
puts0("\n\r _1");
} else {
puts0("\n\r _2");
}
0x0000012c: e59f6058 X`.. LDR r6,0x18c ; грузим 0x01234567
0x00000130: e1a04000 .@.. MOV r4,r0 ; r0,r4 = dw
0x00000150: e1a00204 .... MOV r0,r4,LSL #4 ; ?????????
0x00000154: e1500226 &.P. CMP r0,r6,LSR #4 ; ?????????
0x00000158: 1a000002 .... BNE {pc} + 0x10 ; 0x168
0x0000015c: e28f003c <... ADD r0,pc,#0x3c ; #0x1a0
0x00000160: ebfffffe .... BL puts0 ; "\n\r _1"
0x00000164: ea000001 .... B {pc} + 0xc ; 0x170
0x00000168: e28f0038 8... ADD r0,pc,#0x38 ; #0x1a8
0x0000016c: ebfffffe .... BL puts0 ; "\n\r _2"
0x00000170: e28f0038 8...
0x0000018c: 01234567 gE#. DCD 1908874
if ((dw & 0x0FFFFFFFul) == 0x01234567ul) {
puts0("\n\r _1");
} else {
puts0("\n\r _2");
}
0x0000012c: e59f6058 X`.. LDR r6,0x18c ; грузим 0x01234567
0x00000130: e1a04000 .@.. MOV r4,r0 ; r0,r4 = dw
0x00000150: e1a00204 .... MOV r0,r4,LSL #4 ; ?????????
0x00000154: e1500226 &.P. CMP r0,r6,LSR #4 ; ?????????
0x00000158: 1a000002 .... BNE {pc} + 0x10 ; 0x168
0x0000015c: e28f003c <... ADD r0,pc,#0x3c ; #0x1a0
0x00000160: ebfffffe .... BL puts0 ; "\n\r _1"
0x00000164: ea000001 .... B {pc} + 0xc ; 0x170
0x00000168: e28f0038 8... ADD r0,pc,#0x38 ; #0x1a8
0x0000016c: ebfffffe .... BL puts0 ; "\n\r _2"
0x00000170: e28f0038 8...
0x0000018c: 01234567 gE#. DCD 1908874
Особенно интересует строки помеченные "?????????"
дело в том, что я явно задаю переменную dw = 0x01234567ul
и такой код
Код
(*2)
if (dw == 0x01234567) {
puts0("\n\r 1");
} else {
puts0("\n\r 2");
}
if (dw == 0x01234567) {
puts0("\n\r 1");
} else {
puts0("\n\r 2");
}
проходит на ура!
забил строчки асма (*1) в асм файле, на дебаггер и правда, сравнение не проходит!
( ADS на макс оптимизации.)
а вот код (*1)при отключенной оптимизации:
Код
0x0000016c: e1a04000 .@.. MOV r4,r0 // в r0 dw, грузим в r4
0x00000190: e1a00204 .... MOV r0,r4,LSL #4; //
0x00000194: e59f1034 4... LDR r1,0x1d0 // грузим в r1 0x01234567
0x00000198: e1510220 .Q. CMP r1,r0,LSR #4
0x0000019c: 1a000002 .... BNE {pc} + 0x10 ; 0x1ac
0x00000190: e1a00204 .... MOV r0,r4,LSL #4; //
0x00000194: e59f1034 4... LDR r1,0x1d0 // грузим в r1 0x01234567
0x00000198: e1510220 .Q. CMP r1,r0,LSR #4
0x0000019c: 1a000002 .... BNE {pc} + 0x10 ; 0x1ac
и сравнение проходит!
строки сравнения отличаются от того что было ранее, баг компилера?
p.s. Самое интересное что в другом(!) месте программы код (*1)
при макс оптимизации дебагом проходился нормально.