第七章 整数算术指令
7.1 简介
每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备、加密数据,以及实现高速的图形操作时特别有用。本章讲述如何进行移位和循环移位操作以及如何使用移位操作进行高效的乘法和出发运算。
接下来,我们将探究IA-32指令集中的乘法和出发指令,Intel根据运算是有符号还是无符号的对乘法和出发进行分类。本章还讲述如何把C++中的数学表达式翻译成汇编语言。编译器把符合表达式分解翻译成一系列机器指令,模拟编译器有助于理解其工作机制,同时也有助于更好地对汇编语言代码进行手工优化。通过本章的学习,读者对操作符优先级以及寄存器的优化(在机器层)的机制将有更深入的理解。
是否思考过计算机是如何加减多字整数?本章中讲述的ADC(带进位加)指令和SBB(带进位减)指令是的处理任意大小的整数更容易一些。在本章最后,将讲述Intel的一些专门处理压缩十进制整数数字字符串的算术指令。
7.2 移位和循环移位指令
和第6章介绍的位操作指令一样,移位指令也是最具汇编语言特性的指令。移位的含义是在操作数内向左或者向右移动数据位,Intel提供了多种移位指令,表中所有的移位指令都影响溢出标志和进位标志。
7.2.1 逻辑移位和算术移位
对于一个数字来说有两种最进本的移位操作。第一种为逻辑移位,即以0填充最后移出的位。在下图中,一个逻辑右移移位,请注意位7被赋值0。
假设二进制值11001111向右移动一位,那么得到0110111,最低位数据移入进位标志。