汇编 —— 算术和逻辑操作

2023-05-16

文章目录

  • 加载有效地址
    • leaq 练习题
    • 练习题答案
  • 一元操作符&二元操作符
    • 一元&二元 练习题
    • 练习题答案
  • 移位操作
    • 移位练习题
    • 练习题答案
  • 特殊的算数操作符
    • 练习题
    • 练习题答案
  • 参考文献

写在前面:从腾讯实习回来之后,就感觉到自己的知识体系过于散乱。于是萌生了写一个自己的操作系统这样的心思,此为系列第一章,主要是讲解一些汇编知识的,内容大多从CSAPP中也可以获得。
本篇内容主要讲解汇编指令:算数以及逻辑相关操作指令

加载有效地址

加载有效地址指令leaq实际上是movq指令的变形。 它的指令形式是从内存读取数据到寄存器。它的第一个操作数看上去是一个内存引用,但该指令实际是将有效地址写入到目的操作数。
其使用格式如下:

指令效果描述
leaq S,DD⬅&S加载有效地址

比如说我们下面的这个例子:

long scale(long x,long y,long z)
{
    long t = x+4*y+12*z;
    return t;
}

我们展示其反汇编代码:

//long scale(long x,long y, long z)
//x in %rdi,y in %rsi,z in %rdx

leaq (%rdi,%rsi,4),%rax		//%rax: 4y+x
leaq (%rdx,%rdx,2),%rdx		//%rdx: 3z
leaq (%rax,%rdx,4),%rax		//%rax: 12z+4y+x
ret							//return %rax

leaq 练习题

刚刚讲了leaq的基础用法,现在做两个题巩固一下,还是那样:往下滚动查看答案和解析:
在这里插入图片描述
在这里插入图片描述

练习题答案

在这里插入图片描述
在这里插入图片描述

一元操作符&二元操作符

一元操作符,顾名思义:只有一个操作数,即是源又是目的。比如incq(%rsp)会使栈顶的8字节元素+1。

指令效果描述
inc DD⬅D+1加1
dec DD⬅D-1减1
neg DD⬅-D取负数
not DD⬅~D取补

二元操作符,则是第二个操作数既是源又是目的。比如指令subq %rax,%rdx 使寄存器%rdx的值减去%rax的值,等价于:%rdx = %rdx-%rax


第一个操作数可以是立即数、寄存器或者内存位置
第二个操作数可以是寄存器或内存位置
但是!当第二个操作数为内存地址时,处理器必须从内存读出值,进行操作之后再写入内存中

指令效果描述
add S,DD⬅D+s
sub S,DD⬅D-s
imul S,DD⬅D*s
xor S,DD⬅D^s异或
or S,DD⬅Dls
and S,DD⬅D&s

一元&二元 练习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习题答案

在这里插入图片描述
在这里插入图片描述

移位操作

移位操作会先给出移位量,然后第二项给出的是要移位的数。移位量可以是一个立即数或者放在单字节寄存器%cl中。当移位操作对 w 位长的数据值进行操作,移位量是由%cl寄存器的低 m 位决定的,这里2m = w,而高位则会被忽略。所以,当寄存器%cl中的值为0xFF时,指令salb会左移7位,salw会左移15位,sqll会左移31位,salq会左移63位。

如下表所示,左移指令有两个名字:salshl。两者的效果是一样的,都是将右边填上0 。右移则是不同,sar执行算术移位,会将扩充位填充符号位,而shr执行逻辑移位,将扩充位填上0。

指令效果描述
sal k,DD⬅D<<k左移
shl k,DD⬅D<<k左移(同sal)
sar k,DD⬅D>>k算数右移
shr k,DD⬅D>>k逻辑右移

移位练习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习题答案

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

特殊的算数操作符

下表中的指令提供了一些不常用的特殊的算数操作:
在这里插入图片描述
可以在表中看到有两个乘法指令:imulqmulq。一个是有符号乘法,一个是无符号乘法,这两个可以用来计算两个64位的值的全128位乘积。这两个指令都要求一个参数必须在寄存器%rax中,而另一个作为指令的源操作数给出。之后,乘积存放在寄存器%rdx(高64位)和%rax(低64位),下面的例子给出了如何计算乘积:

#include <inttypes .h>
typedef unsigned __int128 uint128_ t;
void store_uprod(uint128 _t *dest, uint64_t x,uint64_t y) {
*dest = x * (uint128_t) y;
}

这个例子得到的汇编代码如下:

//dest in %rdi,x in %rsi,y in %rdx
store_uprod:
movq %rsi, %rax			//%rax = x
mulq %rdx				//%rax = %rax*%rdx
movq %rax, (%rdi)		//低64位存储在dest中
movq %rdx, 8(%rdi)		//高64位存储在dest+8中
ret						

到目前为止,我们都没有介绍除法操作符和取模操作。这些操作是由单操作数除法指令所提供。有符号除法指令idivl将寄存器%rdx(高64位)和%rax(低64位)中的128位数作为被除数,而除数作为指令的操作数给出。指令将商存储在寄存器%rax,将余数存在寄存器%rdx。以下例子给出了除法的实现:

void remdiv(long x,long y,long *qp,long*rp)
{
    long q = x / y;
    long r = x % y;
    *qp = q;
    *rp = r;
}

其汇编实现如下:

//x in %rdi,y in %rsi,qp in %rdx,rp in %rcx
remdiv :
movq %rdx, %r8			//在%r8中存储qp
movq %rdi, %rax			//%rax = x
cqto					//符号扩展x为8字
idivq %rsi				//执行x/y操作,商在%rax中,余数在%rdx中
movq %rax, (%r8)		//存储商到%r8中
movq %rdx, (%rcx)		//存储余数在%rcx中
ret


无符号除法使用divq指令,通常寄存器%rdx会事先设置为0

练习题

在这里插入图片描述

练习题答案

//x in %rdi,y in %rsi,qp in %rdx,rp in %rcx
movq %rdx, %r8			//在%r8中存储qp
movq %rdi, %rax			//%rax = x
movl $0, %edx			//无符号除法特性
divq %rsi				//执行x/y操作,商在%rax中,余数在%rdx中
movq %rax, (%r8)		//存储商到%r8中
movq %rdx, (%rcx)		//存储余数在%rcx中
ret

参考文献

[1] 深入理解计算机系统 第三章 程序的机器级表示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编 —— 算术和逻辑操作 的相关文章

  • 文档交接说明书(模板)

    因为同事的离职 xff0c 我的入职 xff0c 要从同事手中交接过来一些项目 公司里只有一些开发文档相关的模板 xff0c 并没有文档交接相关的模板 xff0c 所以交接文档的模板也就由我们自己来定 我结合自己在工作中的经验 xff0c
  • UDS网络层/TP层(ISO 15765-2)的解读

    本文是对 ISO 15765 2 2011 协议的一些解读 需要指出该协议的最新版为2016版 TP层存在意义 UDS网络层 xff0c 又称为TP层 xff08 Transport Protocol Layer xff09 其存在的目的是
  • std vector传递指针使用说明

    今天用WM COPYDATA传递一个Vector的指针 xff0c 传递过来始终失败 后面找到一篇文章 xff0c 说只要传递第一个元素的地址就行 xff0c 因为vector在内存是连续的 static std vector lt UIm
  • Leetcode之运算库函数自定义

    一 Leetcode50 pow 注意点 1 n的值可以为正 xff0c 负 xff0c 0 2 O n 会TLE xff0c 使用递归时 xff0c 一定要将中间步保存 3 有博文中提到 xff0c 若n lt 0 xff0c 可以令n
  • 树莓派无键盘安装步骤

    树莓派无键盘安装 下载系统烧录系统配置无线网络开机并连接树莓派更新源和系统安装xrdp xff08 远程访问 xff09 Windows连接远程桌面 下载系统 应该只有官方的Raspbian系统支持无键盘安装 xff0c 官网下载系统 xf
  • iic实现采集温湿度传感器值

    iic h ifndef IIC H define IIC H include 34 stm32mp1xx gpio h 34 include 34 stm32mp1xx rcc h 34 通过程序模拟实现I2C总线的时序和协议 GPIOF
  • Matlab在线运行网站

    桌面版的Matlab不仅安装包很大 xff0c 而且也很吃性能 xff0c 不如就用网页版 xff0c 来玩啊 xff01 https www tutorialspoint com execute matlab online php 点击c
  • An Introduction on Deep Learning for the Physical Layer

    An Introduction on Deep Learning for the Physical Layer 代码实现 xff1a https github com shengjian3476077 DLforPhy 一 文章的主要工作
  • motion planning 一起学习

    shenlan 学院 motion planning 一起学习 打算买深蓝的motion planning for Mobile robots xff0c 主要是讲规划算法的 xff0c 有无一起学习的小伙伴 xff1f 一起学习 xff0
  • 【java面试之Linux】Linux启动过程、

    一 Linux启动过程 启动第一步 xff0d xff0d 加载BIOS 启动第二步 xff0d xff0d 读取MBR 主引导记录 启动第三步 xff0d xff0d Boot Loader 启动第四步 xff0d xff0d 加载内核
  • Linux SPI 驱动示例

    一 Linux 下 SPI 驱动框架 SPI 驱动框架分为主机控制器驱动和设备驱动 xff0c 主机控制器也就是 SOC 的 SPI 控制器接口 1 1 SPI 主机驱动 SPI 主机驱动就是 SOC 的 SPI 控制器驱动 xff0c L
  • 使用 FFmpeg 推流,使用 VLC 软件进行拉流

    1 移植Nginx到开发板 xff0c 使用 Nginx 来搭建 RTMP 流媒体服务器 2 执行如下命令进行推流 xff1a ffmpeg re i run media mmcblk1p1 testVideo mp4 c av copy
  • MPC与LQR的详细对比分析

    从以下几个方面进行阐述 xff1a 一 xff0c 研究对象 xff1a 是否线性 二 xff0c 状态方程 xff1a 离散化 三 xff0c 目标函数 xff1a 误差和控制量的极小值 四 xff0c 工作时域 xff1a 预测时域 x
  • 类类型成员引用的问题

    一个类中的成员变量是另一个类的类类型 xff0c 赋值问题分为引用 xff0c 不引用两类 如先定义TESTB类 class TESTB public TESTB b 61 3 7 TESTB void change b 61 9 0 fl
  • FutureTask的用法及两种经常使用的使用场景

    FutureTask可用于异步获取执行结果或取消执行任务的场景 经过传入Runnable或者Callable的任务给FutureTask xff0c 直接调用其run方法或者放入线程池执行 xff0c 以后能够在外部经过FutureTask
  • 二维线性插值方法

    前几天在进行数据仿真的时候 对于将表格离散数据转化成连续数据一直是一件十分棘手的事情 xff0c 在网站上找了许多资源最后才找到可以利用二维线性插值的方法将数据进行转化 1 原理 是要将 m n m times n m n 的二维数据如下图
  • 【转载】Matlab中LMI(线性矩阵不等式)工具箱使用教程

    64 TOC 转载 原文地址 xff1a https www cnblogs com Hand Head articles 5412511 html 这一段被老板逼着论文开题 xff0c 自己找方向比较着急 xff0c 最后选择了供应链控制
  • Python各类常用库整理

    一 20个必不可少的Python库也是基本的第三方库 Requests Kenneth Reitz写的最富盛名的http库 每个Python程序员都应该有它 Scrapy 如果你从事爬虫相关的工作 xff0c 那么这个库也是必不可少的 用过
  • Matlab中LMI(线性矩阵不等式)工具箱使用例子

    我搜出来的都是一些简单的算例 xff0c 并且机会没有中文教程 xff0c 我在这里就斗胆把自己的体会写出来 xff0c 试着给大家提供一点参考 LMI xff1a Linear Matrix Inequality xff0c 就是线性矩阵
  • 转--ICEM CFD中合并多个网格

    原址 xff1a http www jishulink com content post 359975

随机推荐

  • 【转】无人机故障数据集ALFA: A Dataset for UAV Fault and Anomaly Detection

    这里写自定义目录标题 无人机故障数据集资源地址 xff1a https kilthub cmu edu articles dataset ALFA A Dataset for UAV Fault and Anomaly Detection
  • 【转】无人机小课堂:无人机的副翼、俯仰、偏航、油门代表什么?

    刚刚接触无人机的小伙伴 xff0c 经常会听到很多英文缩写 xff0c 如AIL ELE RUD THR等 xff0c 一不小心就会傻傻分不清 但它们却经常出现在各种遥控器 飞控 调参软件中 xff0c 因为它们是无人机 航模中最基础的四个
  • 多弹多约束协同制导问题

    参考文献 xff1a 张达 刘克新 李国飞 多约束条件下的协同制导研究进展 J 南京信息工程大学学报 自然科学版 2020 12 05 530 539 DOI 10 13878 j cnki jnuist 2020 05 002 多导弹协同
  • 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别

    一 驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果 xff0c 没有硬件的软件是空中楼阁 xff0c 而没有软件的硬件则只是一堆废铁 硬件是底层基础 xff0c 是所有软件得以运行的平台 xff0c 代码最终会落实为硬件上的
  • 【转】多智能体系统一致性问题概述

  • 【转】从自然基金面上项目只许列10篇代表作说起

    作者 xff1a 喻海良 xff0c 字之亮 xff0c 2018年2月13日于北京沙河 关于建设 双一流大学 过程中 xff0c 我们作为大学教师该如何看待学术论文的讨论已经有很多了 个人觉得论文数量是基础 xff0c 一个大学教授的课题
  • 盘点 | 单目视觉3-D目标检测经典论文(附解读)

    2020年以来出现的一些单目视觉3 D目标检测的论文 本文针对部分典型的论文要点进行要点解读 xff0c 仅供参考 Towards Generalization Across Depth for Monocular 3D Object De
  • IBM的云平台Bluemix使用初体验-创建第一个容器

    概述 第一次使用IBM的云平台Bluemix xff0c 写一个blog记录一下 我注册Bluemix挺早的 xff0c 但是在工作中一直没有机会使用IBM的云平台 现在辞职创业 xff0c 做自己喜欢的互联网 xff0c 终于有机会用上了
  • 在Source Insight中添加对.cc的支持

    Options gt Document Options Document Type gt 下拉选择 xff1a C 43 43 Source File 在File Filter 中加入 cc
  • Android HFP流程记录

    DP 完成后 xff0c btif dm c文件中 xff0c btif dm search services evt函数 xff0c bond state changed BT STATUS SUCCESS amp bd addr BT
  • OPP文件传输

    在RFCOMM连接后 xff0c 进行Command Type Parameter Negotiation时 xff0c 会协商Credits初始值 建立OBEX连接时 xff0c 会将poll bit设置 xff0c 用于Given Cr
  • 算法——欧几里得算法

    目录 欧几里得算法算法原理欧几里得算法的代码表示 参考文献 欧几里得算法 欧几里得算法是用来求两个正整数最大公约数的算法 古希腊数学家欧几里得在其著作中 The Elements 中最早描述了这种算法 xff0c 所以叫欧几里得算法 a s
  • 算法——100瓶水,一瓶有毒,有一种试纸...

    问题描述 100瓶水 xff0c 一瓶有毒 xff0c 有一种试纸 xff0c 不过需要一个小时才能出结果 xff0c 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案 span class token number 7 span 算
  • 基于muduo网络库的集群聊天系统(C++实现)

    文章目录 项目概述业务流程 数据模块表的设计数据库模块设计 通信格式网络和业务模块网络模块网络模块和业务模块解耦合业务模块注册业务登录业务加好友业务一对一聊天业务创建群业务加入群业务群聊业务注销业务 服务器集群跨服务器通信集群聊天服务器的思
  • linux设备驱动原理与本质

    任何计算机系统都是软件和硬件的结合体 xff0c 如果只有硬件而没有软件 xff0c 则硬件是没有灵魂的躯壳 xff1b 如果只有软件没有硬件 xff0c 则软件就是一堆无用的字符 在底层硬件的基础上 xff0c 操作系统覆盖一层驱动 xf
  • pycharm配置可视化界面流程简介

    一 安装QT Designer 在pycharm的终端里面输入如下命令 span class token comment 安装pyqt5 span pip install PyQt5 span class token comment 安装p
  • 内存——CPU、内存以及磁盘是如何交互的

    文章目录 内存的存储SRAMDRAMDRAM内部以及与内存控制模块的交互 xff08 重点 xff09 DRAM与内存存储CPU和内存的交互 xff08 重点 xff09 磁盘磁盘和CPU 内存的交互 局部性参考文献 之前在介绍linux
  • libco —— 安装与使用

    文章目录 libco的安装libco库的简单使用参考文献 libco的安装 可以直接从 Tencent 的 GitHub 仓库中拉取源码 xff1a ubuntu 64 VM 0 2 ubuntu libco span class toke
  • 为什么我的云服务器不能绑定公网 ip ?

    文章目录 云服务器的部署 xff1a 数据中心NAT协议开头问题的答案参考文献 写在前面 昨天呢 xff0c 在校招群里的小伙伴问了我们一个问题 xff0c 让我们帮给看看 xff1a 一开始呢 xff0c 博主按照经验呢跟他说是端口号被占
  • 汇编 —— 算术和逻辑操作

    文章目录 加载有效地址leaq 练习题练习题答案 一元操作符 amp 二元操作符一元 amp 二元 练习题练习题答案 移位操作移位练习题练习题答案 特殊的算数操作符练习题练习题答案 参考文献 写在前面 xff1a 从腾讯实习回来之后 xff