Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

linux汇编之算术和逻辑指令

算术和逻辑指令分四种:leal指令、一元操作、二元操作、移位操作。

指令                               效果                                                    描述
leal S,D                       D<&S                                            加载有效地址

INC  D                        D<-D+1                                               加1
DEC D                        D<-D-1                                                减1
DEG D                        D<- -D                                               取负
NOT D                        D<- ~D                                               取补

ADD S,D                     D<-D+S                                              加
SUB S,D                     D<-D-S                                               减
LMUL S,D                    D<-D*S                                              乘
XOR S,D                     D<-D^S                                              异或
OR S,D                       D<-D|S                                               或
AND S,D                     D<-D&S                                              与

SAL  k,D                     D<- D<<k                                           左移
SHL  k,D                     D<- D<<k                                           等同于SAL指令
SAR  k,D                     D<-    D>>Ak                                                                         算术右移
SHR  k,D                     D<-    D>>Lk                                                                          逻辑右移

注解:leal指令实际是mov的变形,指令形式是从存储器到寄存器,实际上没有引用存储器。作用是
 将有效地址写入目的操作数。目的数必须是寄存器。
             一元操作只有一个操作数,既是源又是目标数。
             二元操作,两个操作数,第一个是源,第二个是目标数。但是两个不能同时是存储器位置的数。
            移位操作,第一个数是移位量,第二个是移位位数;移位量采用单字节编码,允许0-31位的移位,移位量可以是立即数。
右移操作有无符号和有符号的分别,其他既可以用作无符号运算也可以用作补码运算。
 
xorl %edx,%edx作用是将寄存器edx设为0,因为x,x^x=0;它等效于movl  $0,%edx;两者区别,xorl指令需要两个字节,后者要五个字节。

其他的算术操作
指令                                                                                     效果                                                                                    描述
imull  S                                                            R[%edx]:R[%edx] <- SxR[%edx]                                                有符号全64位乘法
mull   S                                                            R[%edx]:R[%edx] <- SxR[%edx]                                                无符号全64位乘法

cltd                                                                  R[%edx]:R[%edx] <- SignExtend(R[%edx])                            转为四字节

idivl   S                                                            R[%edx]:R[%edx] <- R[%edx]:R[%edx] mod S                       有符号除法
                                                                        R[%edx]:R[%edx] <- R[%edx]:R[%edx] ÷ S
divl   S                                                            R[%edx]:R[%edx] <- R[%edx]:R[%edx] mod S                         无符号除法
                                                                        R[%edx]:R[%edx] <- R[%edx]:R[%edx] ÷ S

imull和mull要求其中的一个参数必须在寄存器%eax,另一个则是源操作数;%edx高32位)、%eax(低32位)
idivl将寄存器edx(高32位)和eax(低32位)中的64位数作被除数,除数是指令的操作数,商存储在eax,余数存储在edx中。
cltd相当于intel的cdq,将%eax符合扩展到%edx。
divl指令通常会把%edx设置为0

 

 

posted on 2013-01-30 23:24 Benjamin 阅读(1155) 评论(0)  编辑 收藏 引用 所属分类: linux


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理