加减乘除在底层是怎么跑的
写高级语言时,a + b 轻轻松松,但在单片机或者操作系统启动初期,这些基本运算得靠汇编一条条指令来实现。汇编算术运算指令就是干这个活的——它们直接控制CPU怎么算数。
比如你在调试一段嵌入式代码,发现传感器读数总是偏高,最后追到一句ADD没处理进位,结果整个温控逻辑都乱了。这类问题不熟悉底层算术指令,查起来特别费劲。
最常用的几个算术指令
ADD 是最常见的加法指令,格式一般是:
ADD AX, BX意思是把BX寄存器的值加到AX上,结果存回AX。类似地,SUB用来做减法:
SUB CX, DX这条指令把DX从CX里减掉,更新后的值放回CX。这类操作影响标志位,比如零标志ZF、进位标志CF,写条件跳转时特别依赖这些状态。
乘法和除法要小心陷阱
MUL和DIV比加减复杂得多。MUL是无符号乘法,比如:
MUL BL它默认用AL乘以BL,结果存在AX里。如果你拿一个大数去乘,容易溢出,高位被截断,结果就错了。有符号数得用IMUL,不然负数一参与计算立马出问题。
DIV更麻烦,做除法前得手动把被除数拆成高低位放在AX和DX里。一步弄错,轻则结果不对,重则触发异常中断。曾经有人忘了清DX,导致除数变成超大值,板子直接重启。
自增自减也归这门管
像INC和DEC这种看着简单,但用在循环计数或数组索引时效率很高。比如遍历缓冲区:
INC SI让地址指针SI加1,比用ADD SI, 1 更快,占用字节也少。在资源紧张的环境里,省一个字节都是赚的。
这些指令不是古董,现代内核开发、驱动编写、性能关键路径优化,照样天天见。搞清楚它们怎么运作,能帮你更快定位奇怪的数值错误,也能写出更贴近硬件的高效代码。