diff options
Diffstat (limited to 'baremetal/313index-bounds-check.subx')
-rw-r--r-- | baremetal/313index-bounds-check.subx | 60 |
1 files changed, 0 insertions, 60 deletions
diff --git a/baremetal/313index-bounds-check.subx b/baremetal/313index-bounds-check.subx deleted file mode 100644 index c9d01ee2..00000000 --- a/baremetal/313index-bounds-check.subx +++ /dev/null @@ -1,60 +0,0 @@ -# Helper to check an array's bounds, and to abort if they're violated. -# Really only intended to be called from code generated by mu.subx. - -== code - -__check-mu-array-bounds: # index: int, elem-size: int, arr-size: int, function-name: (addr array byte), array-name: (addr array byte) - # . prologue - 55/push-ebp - 89/<- %ebp 4/r32/esp - # . save registers - 50/push-eax - 51/push-ecx - 52/push-edx - # . not bothering saving ebx; it's only clobbered if we're going to abort - # ecx = arr-size - 8b/-> *(ebp+0x10) 1/r32/ecx - # var overflow/edx: int = 0 - ba/copy-to-edx 0/imm32 - # var offset/eax: int = index * elem-size - 8b/-> *(ebp+8) 0/r32/eax - f7 4/subop/multiply-eax-with *(ebp+0xc) - # check for overflow - 81 7/subop/compare %edx 0/imm32 - 0f 85/jump-if-!= __check-mu-array-bounds:overflow/disp32 - # check bounds - 39/compare %eax 1/r32/ecx - 0f 82/jump-if-unsigned< $__check-mu-array-bounds:end/disp32 # negative index should always abort - # abort if necessary - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "fn " 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+0x14) 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 ": offset " 3 0) # 3=cyan - (draw-int32-hex-wrapping-right-then-down-from-cursor-over-full-screen 0 %eax 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 " is too large for array '" 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+0x18) 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "'" 3 0) # 3=cyan - { - eb/jump loop/disp8 - } - # never gets here -$__check-mu-array-bounds:end: - # . restore registers - 5a/pop-to-edx - 59/pop-to-ecx - 58/pop-to-eax - # . epilogue - 89/<- %esp 5/r32/ebp - 5d/pop-to-ebp - c3/return - -__check-mu-array-bounds:overflow: - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "fn " 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+0x14) 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 ": offset to array '" 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "offset to array overflowed 32 bits" 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 *(ebp+0x18) 3 0) # 3=cyan - (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "' overflowed 32 bits" 3 0) # 3=cyan - { - eb/jump loop/disp8 - } - # never gets here |