Assembler languages allow you to specify functions at the level of computer-specific instructions, which operate on memory chunks of various sizes. Thus, programs written in assembler languages are not portable.
C, by contrast, allows you to specify sequences of computer-independent, conceptual instructions, which operate on memory chunks of various sizes. Thus, programs written in C are portable.
By encouraging you to think in terms of memory chunks, yet discouraging you from thinking in terms of computer-specific instructions, C provides a sensible tradeoff, enabling you to write programs that are both fast and portable. Accordingly, C is sometimes called a portable assembler language.