
上QQ阅读APP看书,第一时间看更新
1.2.1 整数加减指令
x86汇编使用ADD指令进行整数的加法运算,该指令有两个操作数,第1个操作数也叫作目的操作数,第2个操作数也叫作源操作数。ADD指令把两个操作数的值相加,然后把结果存放到目的操作数中。源操作数可以是寄存器、内存或立即数,而目的操作数需要满足可写的条件,所以只能是寄存器或内存,而且两个操作数不能同时为内存。
如下指令将EAX寄存器的值加上16,并把结果存回EAX中,指令如下:

整数减法运算通过SUB指令来完成,对操作数的要求和ADD指令一致,不过是从目的操作数中减去源操作数,并把结果存回目的操作数中。
如下指令将ESP寄存器的值减去32,并把结果存回ESP中,就像高级语言中分配函数栈帧时所做的那样,指令如下:

包括ADD和SUB在内的很多汇编指令能够接受不同大小的参数,例如通过两个8位寄存器进行int8加法,指令如下:

通过两个16位寄存器进行int16加法,指令如下:

x86是一个复杂指令集架构,很多指令像这样支持多种操作数组合,虽然代码中使用同一个opcode名称,但是实际编译后对应的是不同的opcode。上层语言中的数据类型会指导编译器,在编译阶段选择合适的opcode和对应的operand。