addi II 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба Здравствуйте! Есть один и тот же код, который по-разному интерпретируются похожими компиляторами Вот код: #define mips32_bissr(set) mips32_bs_c0(C0_SR,set) #define mips32_bs_c0(selreg, set) \ __extension__ ({ \ register reg32_t __o; \ __o = mips32_get_c0 (selreg); \ mips32_set_c0 (selreg, __o | (set)); \ __o; \ }) #define SR_IE 0x00000001 /* interrupt enable */ mips32_bissr(SR_IE); Есть два компилятора: 1. mips-mti-elf 2. Mips Toolchain для Eclipse Как я понимаю MIPS Toolchain собирался с того же bare-metal Как резултат: 1-ый компилирует этот код в следующем виде для mips64: mips32_bissr (SR_IE); ffffffffb5013fe4: 40026000 mfc0 $2,$12 ffffffffb5013fe8: 00021000 sll $2,$2,0x0 ffffffffb5013fec: 34420001 ori $2,$2,0x1 ffffffffb5013ff0: 40826000 mtc0 $2,$12 ffffffffb5013ff4: 000000c0 sll $0,$0,0x3 2-ой для mips32/microAptive в следующем виде: mips32_bissr(SR_IE); a0002630: 40026000 mfc0 v0,c0_status a0002634: 0040f825 move ra,v0 a0002638: 03e01025 move v0,ra a000263c: 0040f825 move ra,v0 a0002640: 37e20001 ori v0,ra,0x1 a0002644: 40826000 mtc0 v0,c0_status a0002648: 000000c0 ehb В случае для mips64 все работает а в случае mips32/microAptive в ra записывается зачем-то значение регистра статуса ядра и соответственно далее идем в исключение по "плохому адресу" Прошу помочь разобраться, откуда компилятор решил записывать значение регистра в адрес возврата Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 25 18 августа, 2023 Опубликовано 18 августа, 2023 · Жалоба Глюк компилятора? Нужна следующая/предыдущая версия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 18 августа, 2023 Опубликовано 18 августа, 2023 · Жалоба не понятно, как такое вообще могло написатся компилятором, попробую с версиями поиграться, спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться