算数和逻辑操作

写在前面

如图为x86-64的一些整数和逻辑操作。这里面大多指令都有各种带不同大小操作数的变形。eg:ADD由四条加法指令组成: addb、addw、addl和addq,分别是字节加法、字加法、双字加法和四字加法;lea指令变种(按大小分类):leaw 、leal、leaq,分别是字加法、双字加法和四字加法。

 这些操作被分为四组:加载有效地址、一元操作、二元操作和移位。其中一元操作有一个操作数,二元操作有两个操作数。

加载有效地址leaq

leaq  S,D

leaq:形式上是从内存读数据到寄存器,实际上是将有效地址写入到目的操作数。

eg:

c语言

        long scale(long x,long y,long z){

                long t = x +4* y + 12*Z;

                return t;}

编译时,该函数的算术运算以三条leaq指令实现:

        long scale(long x, long y,long z)

        x in %rdi, y in %rsi,z in %rdx

        scale:

                leaq         (%rdi,%rsi,4),%rax      //x+4*y

                leaq        (%rdx, %rdx,2),%rdx    //z +2*z =3*z

                leaq        (%rax,%rdx,4), %rax        //(x+4*y)+4*(3*z)=x +4*y +12*z

                ret

一元操作和二元操作

一元操作

 一元操作只有一个操作数,该操作数即使源操作数又是目的操作数,该操作数可以是一个寄存器,也可以是一个内存位置。

eg:decq (%rsp)           //使栈顶的8字节元素-1   类似于C语言中的--

        incq (%rsp)            //使栈顶的8字节元素+1  类似于C语言中的++

二元操作

二元操作有两个操作数,其中第二个操作数既是源操作数又是目的操作数。这种语法类似于C语言中的赋值运算符,例如x-=y。

第一个操作数源操作数可以是立即数、寄存器或是内存位置。

第二个操作数目的操作数可以是寄存器或是内存位置。注意,当第二个操作数为内存地址时,处理器必须从内存读出值,执行操作,再把结果写回内存。

移位操作

移位操作,第一项先给出移位量,然后第二项给出的是要移位的数;分为算术移位和逻辑移位。

第一项移位量可以是一个立即数,或者放在单字节寄存器%cl中。(注:只允许以这个特定的寄存器作为操作数)。

左移指令有两个名字:SAL和SHL。两者的效果是一样的,都是将右边填上0。

右移指令不同,SAR执行算术移位(填上符号位),而SHR执行逻辑移位(填上0)。

移位操作的目的操作数可以是一个寄存器或是一个内存位置。

学习自《深入理解计算机系统》

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值