![深度探索Go语言:对象模型与runtime的原理特性及应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/582/47216582/b_47216582.jpg)
上QQ阅读APP看书,第一时间看更新
1.2.1 整数加减指令
x86汇编使用ADD指令进行整数的加法运算,该指令有两个操作数,第1个操作数也叫作目的操作数,第2个操作数也叫作源操作数。ADD指令把两个操作数的值相加,然后把结果存放到目的操作数中。源操作数可以是寄存器、内存或立即数,而目的操作数需要满足可写的条件,所以只能是寄存器或内存,而且两个操作数不能同时为内存。
如下指令将EAX寄存器的值加上16,并把结果存回EAX中,指令如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P25_4596.jpg?sign=1739891769-TK2rXJrKBPYLn64rZaQzHdqsQGjJtrX7-0-365df73176c42461b7d13ac7440ae4c7)
整数减法运算通过SUB指令来完成,对操作数的要求和ADD指令一致,不过是从目的操作数中减去源操作数,并把结果存回目的操作数中。
如下指令将ESP寄存器的值减去32,并把结果存回ESP中,就像高级语言中分配函数栈帧时所做的那样,指令如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P25_4604.jpg?sign=1739891769-WAReqNgI6xQ8FjH87FvDb9itrk027qyR-0-ebd99ce8fe560c5584c272d4bd53bf5f)
包括ADD和SUB在内的很多汇编指令能够接受不同大小的参数,例如通过两个8位寄存器进行int8加法,指令如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P25_4612.jpg?sign=1739891769-ooBXw7O8hqbxMfyzsUaxI9dkuiEHLgXn-0-7d7a6d9b8f6a90dca8f740278e46615e)
通过两个16位寄存器进行int16加法,指令如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P25_4620.jpg?sign=1739891769-TS9nnxzSuQHq5gMamfRm0qtCyq61BCuw-0-0c92ea3a75accc1b68d3304724b3f49c)
x86是一个复杂指令集架构,很多指令像这样支持多种操作数组合,虽然代码中使用同一个opcode名称,但是实际编译后对应的是不同的opcode。上层语言中的数据类型会指导编译器,在编译阶段选择合适的opcode和对应的operand。