*result* = 0
for each *byte* from *list*:
shift *result* 4 bits left ; move previous values to make room for next one
AND *byte* with mask to keep only lower 4 bits (0x0F)room
OR *masked byte* to *result* ("add" would work too, as all is masked properly)
done.
About your code after edit:
I'm pretty sure it does something different than you wanted, but I'm not sure which CPU/dialect this is, reminds me a bit of ARM.
If LDR R0,=LIST
is fetching all 4 bytes in single go, that's clever.
But then you mask R0 with MSB (so you know endianness of your platform, and this one is first?) and store that in R1 (makes some sense, to extract first byte into R1 into MSB position).
Then you add 4 to R0 (doesn't make any sense to me, destroys last byte value). Then you extract second byte into R1 (overwrite previous value of R1), etc...
Finally you store into R1 and RESULT the fourth byte value + 12 (result = 0x00000015).
BTW, you should compile your code, and debug in some debugger, to see what you did, you will learn much faster that way. Just guessing on the paper, when you have the real HW almost for free? I had to code on paper, because I had access to actual HW only once per week for 3h, so I had barely time to retype the code into computer, run it, watch it crash (I didn't know debugger back then), and I had another week of paper work to figure out what happened, fix it, and try it again...
But today you can simply type it into machine, compile, and step into it instruction by instruction. Can't be easier.