Created
May 4, 2020 02:49
-
-
Save ciniml/96c15cf4f2f5b0269d2e06eee61100ae to your computer and use it in GitHub Desktop.
ESP32 Unaligned access compare disassembly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.PHONY: all | |
XTENSA_PREFIX ?= xtensa-esp32-elf- | |
XTENSA_BIN ?= $(HOME)/xtensa-esp32-elf/1.22.0-80/bin | |
CC := $(XTENSA_BIN)/$(XTENSA_PREFIX)gcc | |
CXX := $(XTENSA_BIN)/$(XTENSA_PREFIX)g++ | |
CC := $(XTENSA_BIN)/$(XTENSA_PREFIX)ld | |
OBJDUMP := $(XTENSA_BIN)/$(XTENSA_PREFIX)objdump | |
CXXFLAGS := -g -Os -std=c++11 | |
all: test.lst | |
clean: | |
-$(RM) test.lst test.elf test.o | |
%.lst: %.elf | |
$(OBJDUMP) -dSC $< > $@ | |
test.elf: test.o | |
$(CXX) -g -nostdlib -nostartfiles -o $@ $^ | |
%.o: %.cpp | |
$(CXX) -c $(CXXFLAGS) -o $@ $< | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdint> | |
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca}; | |
bool __attribute__((noinline)) unaligned_compare_ub() | |
{ | |
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff; | |
return sch == 0xaad9ff; | |
} | |
bool __attribute__((noinline)) unaligned_compare_ok() | |
{ | |
return b[2] == 0xff && b[3] == 0xd9 && b[4] == 0xaa; | |
} | |
static volatile bool result_ub; | |
static volatile bool result_ok; | |
int main() | |
{ | |
result_ub = unaligned_compare_ub(); | |
result_ok = unaligned_compare_ok(); | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
test.elf: file format elf32-xtensa-le | |
Disassembly of section .text: | |
00400074 <unaligned_compare_ub()-0x10>: | |
400074: 400107 bnone a1, a0, 4000b8 <unaligned_compare_ok()+0x8> | |
400077: 260100 lsi f0, a1, 152 | |
40007a: 12ff55 call4 413070 <_end+0x12f5c> | |
40007d: 004001 l32r a0, 3c0180 <unaligned_compare_ub()-0x3ff04> | |
400080: 400111 l32r a1, 3d0084 <unaligned_compare_ub()-0x30000> | |
... | |
00400084 <unaligned_compare_ub()>: | |
#include <cstdint> | |
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca}; | |
bool __attribute__((noinline)) unaligned_compare_ub() | |
{ | |
400084: 004136 entry a1, 32 | |
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff; | |
400087: fffb21 l32r a2, 400074 <unaligned_compare_ub()-0x10> | |
40008a: 822b addi.n a8, a2, 2 | |
40008c: 0202a2 l8ui a10, a2, 2 | |
40008f: 030222 l8ui a2, a2, 3 | |
400092: 112280 slli a2, a2, 8 | |
400095: 2092a0 or a9, a2, a10 | |
400098: 020822 l8ui a2, a8, 2 | |
return sch == 0xaad9ff; | |
40009b: fff781 l32r a8, 400078 <unaligned_compare_ub()-0xc> | |
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca}; | |
bool __attribute__((noinline)) unaligned_compare_ub() | |
{ | |
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff; | |
40009e: 112200 slli a2, a2, 16 | |
return sch == 0xaad9ff; | |
4000a1: 202290 or a2, a2, a9 | |
4000a4: 828a add.n a8, a2, a8 | |
4000a6: 190c movi.n a9, 1 | |
4000a8: 020c movi.n a2, 0 | |
4000aa: 832980 moveqz a2, a9, a8 | |
} | |
4000ad: f01d retw.n | |
... | |
004000b0 <unaligned_compare_ok()>: | |
bool __attribute__((noinline)) unaligned_compare_ok() | |
{ | |
4000b0: 004136 entry a1, 32 | |
return b[2] == 0xff && b[3] == 0xd9 && b[4] == 0xaa; | |
4000b3: fff081 l32r a8, 400074 <unaligned_compare_ub()-0x10> | |
4000b6: ffa0a2 movi a10, 255 | |
4000b9: 020892 l8ui a9, a8, 2 | |
4000bc: 020c movi.n a2, 0 | |
4000be: 749090 extui a9, a9, 0, 8 | |
4000c1: 1f99a7 bne a9, a10, 4000e4 <unaligned_compare_ok()+0x34> | |
4000c4: 030892 l8ui a9, a8, 3 | |
4000c7: d9a0a2 movi a10, 217 | |
4000ca: 749090 extui a9, a9, 0, 8 | |
4000cd: 1399a7 bne a9, a10, 4000e4 <unaligned_compare_ok()+0x34> | |
4000d0: 040882 l8ui a8, a8, 4 | |
4000d3: 749080 extui a9, a8, 0, 8 | |
4000d6: 56af82 movi a8, -170 | |
4000d9: 898a add.n a8, a9, a8 | |
4000db: 01a092 movi a9, 1 | |
4000de: 832980 moveqz a2, a9, a8 | |
4000e1: 742020 extui a2, a2, 0, 8 | |
} | |
4000e4: f01d retw.n | |
... | |
004000e8 <main>: | |
static volatile bool result_ub; | |
static volatile bool result_ok; | |
int main() | |
{ | |
4000e8: 004136 entry a1, 32 | |
result_ub = unaligned_compare_ub(); | |
4000eb: fff9a5 call8 400084 <unaligned_compare_ub()> | |
4000ee: ffe381 l32r a8, 40007c <unaligned_compare_ub()-0x8> | |
result_ok = unaligned_compare_ok(); | |
} | |
4000f1: 020c movi.n a2, 0 | |
static volatile bool result_ub; | |
static volatile bool result_ok; | |
int main() | |
{ | |
result_ub = unaligned_compare_ub(); | |
4000f3: 0020c0 memw | |
4000f6: 0048a2 s8i a10, a8, 0 | |
result_ok = unaligned_compare_ok(); | |
4000f9: fffb65 call8 4000b0 <unaligned_compare_ok()> | |
4000fc: ffe181 l32r a8, 400080 <unaligned_compare_ub()-0x4> | |
4000ff: 0020c0 memw | |
400102: 0048a2 s8i a10, a8, 0 | |
} | |
400105: f01d retw.n |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment