Doing an indirect call is done using the instruction blx. It behaves like bl but expects a register rather than a label.
Yoy may be wondering whether we could have used bx rather than blx. We cannot. The instruction bx does not set the lr register to the next instruction, like bl and blx do. Thus, we would call the function but it would not be able to return: it would jump back to the wrong place! (try to think which one).
Now in the main we will keep the address of say_hello in ptr_of_fun and call make_indirect_call.