Код
tst R0,#0x3
ldrh R0,[R0, #+0]
lsrne R0,R0,#+8
А это правильно работает? Проверяли?
У меня такой тест:
Код
{
BYTE a[8];
DWORD i;
for(i=0; i<sizeof(a); i++) a[i] = (BYTE)(i+1);
dprintf("\r\n%08X %08X %08X %08X",
*((PDWORD)&a[0]),
*((PDWORD)&a[1]),
*((PDWORD)&a[2]),
*((PDWORD)&a[3]));
dprintf("\r\n%08X %08X %08X %08X %08X %08X %08X %08X",
*((PWORD)&a[0]),
*((PWORD)&a[1]),
*((PWORD)&a[2]),
*((PWORD)&a[3]),
*((PWORD)&a[4]),
*((PWORD)&a[5]),
*((PWORD)&a[6]),
*((PWORD)&a[7]));
}
Дает такой результат:
04030201 01040302 02010403 03020104
00000201 01000002 00000403 03000004 00000605 05000006 00000807 07000008
То есть, если читаем ldrh по смещению +1 - вместо 0x0302 получаем коктейль из 1 и 2. Если читать по +3, то вместо ожидаемых 0x0504 получаем опять смесь 3 и 4. Это для внутренней памяти на LPC23.
Фрагмент листинга такой (чтобы было видно ldr и ldrh)
Код
\ 000001B8 03009DE5 LDR R0,[SP, #+3]
\ 000001BC 01002DE9 PUSH {R0}
\ 000001C0 06309DE5 LDR R3,[SP, #+6]
\ 000001C4 05209DE5 LDR R2,[SP, #+5]
\ 000001C8 04109DE5 LDR R1,[SP, #+4]
\ 000001CC E80E84E2 ADD R0,R4,#+3712
\ 000001D0 ........ _BLF tn_debug_printf,??tn_debug_printf??rA
\ 000001D4 BB00DDE1 LDRH R0,[SP, #+11]
\ 000001D8 01002DE9 PUSH {R0}
\ 000001DC BE00DDE1 LDRH R0,[SP, #+14]
\ 000001E0 01002DE9 PUSH {R0}
\ 000001E4 B101DDE1 LDRH R0,[SP, #+17]
\ 000001E8 01002DE9 PUSH {R0}
\ 000001EC B401DDE1 LDRH R0,[SP, #+20]
\ 000001F0 01002DE9 PUSH {R0}
\ 000001F4 B701DDE1 LDRH R0,[SP, #+23]
\ 000001F8 01002DE9 PUSH {R0}
\ 000001FC BA31DDE1 LDRH R3,[SP, #+26]
\ 00000200 B921DDE1 LDRH R2,[SP, #+25]
\ 00000204 B811DDE1 LDRH R1,[SP, #+24]
\ 00000208 9800A0E3 MOV R0,#+152
\ 0000020C E00E80E3 ORR R0,R0,#0xE00
\ 00000210 040080E0 ADD R0,R0,R4
\ 00000214 ........ _BLF tn_debug_printf,??tn_debug_printf??rA
\ 00000218 18D08DE2 ADD SP,SP,#+24 ;; stack cleaning
"И чего люди не придумают - лишь бы "на картошку" не ехать"

BTW, мне не нравится как компилятор стеком распрядился - на 4 слова можно и меньше было бы.