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.uint6437.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.