diff --git a/examples/bare1.rs b/examples/bare1.rs index 962f7c4aa6d1e2e7d64d3d5c9a49f678d99b6ebf..4c548ce90d2292066efc0ddeb8decb398b857e57 100644 --- a/examples/bare1.rs +++ b/examples/bare1.rs @@ -77,22 +77,56 @@ fn main() -> ! { // > disassemble // ** your answer here ** // -// Dump of assembler code for function main: -// 0x08000400 <+0>: push {r7, lr} -// 0x08000402 <+2>: mov r7, sp -// => 0x08000404 <+4>: bl 0x800040a <bare1::__cortex_m_rt_main> -// 0x08000408 <+8>: udf #254 ; 0xfe -// End of assembler dump. -// +// (gdb) disassemble +// Dump of assembler code for function bare1::__cortex_m_rt_main: +// 0x0800040a <+0>: push {r7, lr} +// 0x0800040c <+2>: mov r7, sp +// 0x0800040e <+4>: sub sp, #16 +// 0x08000410 <+6>: mvn.w r0, #1 +// 0x08000414 <+10>: str r0, [sp, #8] +// 0x08000416 <+12>: movs r0, #0 +// 0x08000418 <+14>: strb.w r0, [sp, #12] +// 0x0800041c <+18>: ldr r0, [sp, #8] +// 0x0800041e <+20>: str r0, [sp, #4] +// 0x08000420 <+22>: b.n 0x8000422 <bare1::__cortex_m_rt_main+24> +// => 0x08000422 <+24>: bkpt 0x0000 +// 0x08000424 <+26>: b.n 0x8000426 <bare1::__cortex_m_rt_main+28> +// ---Type <return> to continue, or q <return> to quit--- +// 0x08000426 <+28>: ldr r0, [sp, #4] +// 0x08000428 <+30>: adds r1, r0, #1 +// 0x0800042a <+32>: mov r2, r1 +// 0x0800042c <+34>: cmp r1, r0 +// 0x0800042e <+36>: str r2, [sp, #0] +// 0x08000430 <+38>: bcc.n 0x8000446 <bare1::__cortex_m_rt_main+60> +// 0x08000432 <+40>: b.n 0x8000434 <bare1::__cortex_m_rt_main+42> +// 0x08000434 <+42>: ldr r0, [sp, #0] +// 0x08000436 <+44>: str r0, [sp, #4] +// 0x08000438 <+46>: bkpt 0x0000 +// 0x0800043a <+48>: b.n 0x800043c <bare1::__cortex_m_rt_main+50> +// 0x0800043c <+50>: add r0, sp, #4 +// 0x0800043e <+52>: bl 0x800045e <core::ptr::read_volatile> +// 0x08000442 <+56>: b.n 0x8000444 <bare1::__cortex_m_rt_main+58> +// 0x08000444 <+58>: b.n 0x8000422 <bare1::__cortex_m_rt_main+24> +// 0x08000446 <+60>: movw r0, #9520 ; 0x2530 +// ---Type <return> to continue, or q <return> to quit--- +// 0x0800044a <+64>: movt r0, #2048 ; 0x800 +// 0x0800044e <+68>: movw r2, #9492 ; 0x2514 +// 0x08000452 <+72>: movt r2, #2048 ; 0x800 +// 0x08000456 <+76>: movs r1, #28 +// 0x08000458 <+78>: bl 0x80008ec <core::panicking::panic> +// 0x0800045c <+82>: udf #254 ; 0xfe +// End of assembler dump. // How many instructions are in between the two `bkpt` instructions in the loop. // Notice, the generated code may not be exactly what you expect :) -// +// // ** your answer here ** +// 10 // // Which instruction stores the local variable on the stack. // // ** your answer here ** -// +// +// 0x0800040a <+0>: push {r7, lr} // Commit your answers (bare1_2) // // 3. Release mode (optimized builds). @@ -109,19 +143,34 @@ fn main() -> ! { // // ** your answer here ** // +// Dump of assembler code for function bare1::__cortex_m_rt_main: +// 0x0800040a <+0>: sub sp, #4 +// 0x0800040c <+2>: mvn.w r0, #1 +// 0x08000410 <+6>: str r0, [sp, #0] +// 0x08000412 <+8>: adds r0, #1 +// => 0x08000414 <+10>: bkpt 0x0000 +// 0x08000416 <+12>: str r0, [sp, #0] +// 0x08000418 <+14>: bkpt 0x0000 +// 0x0800041a <+16>: ldr r0, [sp, #0] +// 0x0800041c <+18>: b.n 0x8000412 <bare1::__cortex_m_rt_main+8> +// End of assembler dump. // How many instructions are in between the two `bkpt` instructions. // // ** your answer here ** -// +// 1 // Where is the local variable stored? // // ** your answer here ** +// 0x08000410 <+6>: str r0, [sp, #0] // // Is there now any reference to the panic handler? // If not, why is that the case? // // ** your answer here ** -// +// No there is not any refrence to the panic handler +// Because in release mode rust does not include checks for +// integer overflow. If overflow occurs it just wrapps with twos complement. +// // commit your answers (bare1_3) // // Discussion: