汇编基础知识3之移位和乘除
汇编真的挺有意思的,整理出了以前的学习的基本知识,为了图快都拿的书的截屏测试代码,但是我亲测有效,放心学习之,学汇编,除了这些,上看雪 搜索玩命,看他的代码呗
2018.5.7
SHL 指令(逻辑左移)把目的操作数内的每位左移,以0填充最低位。SHL 指令的一个最重要的应用就是用于实现与2 的次幂的快速乘法,把任何操作数左移n 位就相当于乘以了2"
SHR 指令(逻辑右移)把操作数的每位右移,并以0填充最高位,把任何操作数右移n位就相当于除以了2”.
SAL( 算术左移)和SAR( 算术右移)指令是为有符号数的移位特别设计的。他们的高位或者低位填充是根据原来数字的符号位决定的
ROL (循环左移)指令把每位左移并把最高位同时复制到进位标志和最低位中。
ROR (循环右移)指令把每位右移并把最低位同时复制到最高位和进位标志中。
RCL (带进位循环左移)指令把操作数的每位左移并把最高位复制到进位标志中,原进位标志复制到结果的低位。
RCR( 带进位循环右移)指令把每位右移,并把最低位复制到进位标志中.原进位标志值复制到结果的最高位。
SHLD (双精度左移)和SHRD (双精度右移)指令在1A-32 系列处理器上才能使用,对于大整数的移位是非常有效的。
MUL 和iMUL 指令分别进行有符号整数和无符号整数的乘法操作。DIV 指令进行无符号整数的除法操作,IDIV进行有符号整数的除法操作。
MUL(无符号乘法,肯定不会溢出):
MUL (无符号乘法)指令有三种格式:
第一种将8 位的操作数与AL 相乘;
第二种将16 位的操作数与AX 相乘;
第三种将32 位的操作数与EAX 相乘。
乘数和被乘数大小必须相同,乘积的尺寸是乘数/被乘数大小的两倍。三种格式都既接受寄存器操作数,也接受内存操作数,但是不接受立即数操作数。
MUL r/m8
MUL r/m16
MUL r/m32
指令中唯一的一个操作数是乘数。表7.2 根据乘数大小的不同列出了被乘数和乘积, 由于目的操作数(乘积)是乘数/被乘数大小的两倍,因此不会发生溢出。如果积的高半部分不为0,就设置进位和溢出标志。由于进位标志通常用于无符号算术运算,因此我们主要关注该标志。例如当AX 与16 位操作数相乘的时候,积存储在DX:AX 中。如果DX 不为0,则进位标志置位。
IMUL指令:
IMUL指令有三种模式
单操作数模式:
单操作数格式:
单操作数格式把乘积存储在累加器(AX,DX:AX,EDX:EAX )中:
IMUL r/m8 AX = AL * r/m byte
IMUL r/m16 DX:AX = AX * r/m word
IMUL r/m32 EDX: EAX= EAX * r/m doubleword
和MUL 指令一样,IMUL 指令的单操作数格式中乘积的尺寸大小使得滥出不可能发生。如果乘积的高半部分不是低半部分的符号扩展,进位标志和溢出标志置位,可使用该特点确定乘积的高半部分是否可以忽略。
双操作数格式(值放到第一个操作数中):
双操作数格式中乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器、内存操作数或立即数,下面是16位操作数的格式:
IMUL r16,r/m16
IMUL r16,imm8
IMUL r16,imm16
下面是32位操作数的格式,乘数必须是一个32 位的寄存器、32 位的内存操作数或立即数( 8位或32 位) :
IMUL r32,r/m32
IMUL r32,imm8
IMUL r32,imm32
双操作数格式会根据目的操作数的大小剪裁乘积。如果有效位丢失,则溢出标志和进位标志置位。使用双操作数格式时,务必在执行完IMUL操作后检查这些标志的值。
三操作数格式; 三操作数格式把乘积存储在第一个操作数中,一个16位的寄存器可被一个8位或16 位的立即数乘:
IMUL r16,r/m16,imm8
IMUL r16,r/m16,imm16
一个32位的寄存器可被一个8位或32 位的立即数乘:
IMUL r32,r/m32,imm8
IMUL r32,r/m32,imm32
如果有效位丢失,则溢出标志和进位标志置位。使用三操作数格式时,务必在执行完IMUL操作后检查这些标志的值。
DIV指令:
DIV( 无符号除法)指令执行8位、16位和32位无符号整数的除法运算。指令中唯一的一个
寄存器或内存操作数是除数,DIV的指令格式是:
DIV r/m8
DIV r/m16
DIV r/m32
下表显示了被除数、除数、商及余数之间的关系。
有符号整数除法:
有符号除法和无符号除法几乎是完全相同的,唯一的不同在于: 在进行除法操作之前
,隐含的被除数必须进行符号扩展。下面首先介绍符号扩展指令,然后再介绍有符号除法指令IDIV。
符号扩展指令:
CBW,CWD CDQ 例子如下
CBW指令
CDQ指令
IDIV指令:
IDIV指令和DIV指令操作一样,但是每次被除数(也就是AL,AX EAX)必须要符号扩展
想到也知道么2倍关系 例子:
扩展加法减法(任意尺寸的数字加减法)ADC(带进位加)和SBB(带进位减)
ADC(带进位加):
ADC (AddWithCarry )指令把源操作数、目的操作数以及进位标志相加。指令格式与MOV指令是一样的:
SBB指令
、
STC CLC指令
STC设置进位指令为1 CLC清0
ASCII和未压缩的十进制数字加减乘除操作
到现在为止,本书讲述的整数算术指令都是处理二进制数值的,尽管CPU 是以二进制数方式
进行运算的,但是也能处理ASCI 十进制数串的算术运算。后者可以方便地由用户输人并在控制
台窗口中显示,无须转换成二进制数值。假设程序需要用户输人两个数字并把它们相加,下面是
个输出样例,其中用户输人了3402 和1256:
Enter first number : 3402
Enter second number :; 1256
The sum is : 4658
在计算和显示数字的时候有两种选择:
1.把两个操作数转换成二进制数值并相加,然后把和从二进制数转换成ASCII码数字串的格式后再显示
2 连续地把每对ASCII码数字直接相加(2+6.0+5.4+2.3+ 1),这样和就是ASCII 数字串,可以直接在屏幕上显示。
第二种选择要求在每对ASCII数字相加后使用特殊指令来调整其和,指令集中有4 条指令可
以处理这一类的ASCI 加法、减法、乘法和除法:
压缩的十进制数字加减(压缩十进制只有加减)
DAA 和DAS
压缩的十进制数字和未压缩的十进制数字的概念
位测试指令
BT BTS BTC