Low-Level and Systems Programming

37.1 Unsafe Operations

let x: int32 = 0x41424344
let bytes = cast[array[4, byte]](x)            # reinterpret bits
let p = cast[pointer](addr x)
let i = cast[int](p)                            # pointer to integer
copyMem(dst, src, n); moveMem(dst, src, n); zeroMem(p, n); equalMem(a, b, n)
let u = unsafeAddr someLet                      # address of an immutable (Nim 1; plain `addr` works in Nim 2)

37.2 Memory Layout Control

type
  Header {.packed.} = object
    magic: uint32
    version: uint8
    flags: uint16
  Vec4 {.align(16).} = object
    x, y, z, w: float32
  IntOrFloat {.union.} = object
    i: int32
    f: float32
echo sizeof(Header), " ", alignof(Vec4), " ", offsetOf(Header, flags)

37.3 Bit Manipulation and Endianness

import std/[bitops, endians]
echo countSetBits(0b1011), firstSetBit(8), rotateLeftBits(1'u8, 3), 5.testBit(0)
var x = 0x1234'u16; var y: uint16; swapEndian16(addr y, addr x)
# also: bigEndian32, littleEndian64, std/endians2 (stew)

37.4 Inline Assembly

proc rdtsc(): uint64 =
  var lo, hi: uint32
  asm """
    rdtsc
    :"=a"(`lo`), "=d"(`hi`)
  """
  (hi.uint64 shl 32) or lo.uint64

37.5 Writing OS-Level Code

std/posix and std/winlean bindings, signals (setControlCHook), memory-mapped I/O, raw sockets (std/nativesockets), --os:standalone / --os:any freestanding targets, -d:useMalloc, and custom allocators.

Example projects: kernels written in Nim (e.g., "nimkernel" tutorials), bootloaders, drivers.