【CSAPP 3.5】算术和逻辑操作

这篇具有很好参考价值的文章主要介绍了【CSAPP 3.5】算术和逻辑操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


下表列出了 x86-64的一些整数和逻辑操作。大多数操作都分成了指令类,这些指令类有各自带不同大小操作数的变种(除了 leaq)。例如,指令 ADD4条加法指令组成: addbaddwaddladdq,分别是字节加法、字加法、双字加法、四字加法。以下操作被分为 4组: 加载有效地址一元操作二元操作移位
指令 效果 描述
leaq S, D &S -> D 加载有效地址
INC D D + 1 -> D 1
DEC D D - 1 -> D 1
NEG D -D -> D 取负
NOT D ~D -> D 取反/取补
ADD S, D D + S -> D
SUB S, D D - S -> D
IMUL S, D D * S -> D
XOR S, D D ^ S -> D 异或
OR S, D `D S -> D`
AND S, D D & S -> D
SAL k, D D << k -> D 左移
SHL k, D D << k -> D 左移,等同于SAL
SAR k, D D >> k -> D 算术右移
SHR k, D D >> k -> D 逻辑右移

1. 加载有效地址

leaq实际上是movq指令的变形。它的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。它的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数。这条指令可以为后面的内存引用产生指针。它还可以简洁地描述普通的算术操作。例如,如果寄存器%rdx地值为x,那么指令leaq 7(%rdx, %rdx, 4), %rax将寄存器%rax设置为5x + 7。目的操作数必须是一个寄存器。

看下面这个C程序:

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

编译时,该函数的算术运算以3leaq指令实现。文章来源地址https://www.toymoban.com/news/detail-438559.html

[root@localhost2 3]# gcc scale.c -S -Og
[root@localhost2 3]# cat scale.s
	.file	"scale.c"
	.text
	.globl	scale
	.type	scale, @function
scale:
.LFB0:
	.cfi_startproc
	leaq	(%rdi,%rsi,4), %rcx
	leaq	(%rdx,%rdx,2), %rax
	salq	$2, %rax
	addq	%rcx, %rax
	ret
	.

到了这里,关于【CSAPP 3.5】算术和逻辑操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最小化安装移动云大云操作系统--BCLinux-for-Euler-22.10-everything-x86_64-230316版

    CentOS 结束技术支持,转为RHEL的前置stream版本后,国内开源Linux服务器OS生态转向了开源龙蜥和开源欧拉两大开源社区,对应衍生出了一系列商用Linux服务器系统。BCLinux-for-Euler-22.10是中国移动基于开源欧拉操作系统22.03社区版本深度定制的企业级X86服务器通用版操作系统。本文

    2024年02月11日
    浏览(52)
  • Linux操作系统下Docker和Docker Compose的安装教程(包含x86和arm64平台离线一键安装资源包)

    本文章将详细介绍Linux下Docker和Docker Compose的安装教程。 目录3为x86和arm64平台Docker离线安装资源包,包含Docker Compose、一键安装脚本使用教程。 相关文章参考: Docker常用基础命令 Docker批量清理删除镜像和容器常用命令 版本如下 名称 版本 CentOS 7.6+ openEuler等其他操作系统可以使

    2024年02月06日
    浏览(47)
  • 【Lua语法】算术、条件、逻辑、位、三目运算符

    加减乘除取余:+ - * / % Lua中独有的:幂运算 ^ 注意: 1.Lua中没有自增自减(++、–),也没有复合运算符(+=、-=) 2.Lua中字符串可以进行算术运算符操作,会自动转成number 如:“10.3” + 1 结果为11.3 大于 小于 大于等于 = 小于等于 = 等于 == 不等于 ~= 返回值依然是bool 注意: 1.与C

    2024年02月11日
    浏览(45)
  • 解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found+截屏操作

    这个是默认路径下的libstdc++.so.6缺少GLIBCXX_3.4.29,你有可能缺少其它版本的比如3.4.22,解决方法一样,如下所示: (1)使用指令先看下目前都有哪些版本的 我这里只到3.25,所以确定是确实这个文件 (2)使用 来查看当前系统中其它的同类型文件,找到一个版本比较高的, 我

    2023年04月22日
    浏览(59)
  • C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用

    运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。 算术运算符用于执行常见的数学运算: 递增运算符 ++ 用于将变量的值增加 1,而递减运算符 -- 用于将变量的值减少 1: 在实际编码中,请注意避免在表达式中使用

    2024年01月20日
    浏览(62)
  • 基于FPGA的64bit算术乘法器设计Verilog代码Quartus仿真

    名称:基于FPGA的64bit算术乘法器设计Verilog代码Quartus仿真(文末获取) 软件:Quartus 语言:Verilog 代码功能: Verilog HDL设计64bits算术乘法器 基本功能 1.用 Veriloghdl设计实现64bit二进制整数乘法器,底层乘法器使用16*168*88*328*16小位宽乘法器来实现底层乘法器可以使用FPGA内部P实现

    2024年02月19日
    浏览(49)
  • 【CPU】关于x86、x86_64/x64、amd64和arm64/aarch64

    为什么叫x86和x86_64和AMD64? 为什么大家叫x86为32位系统? 为什么软件版本会注明 for amd64版本,不是intel64呢?     x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,intel官方文档里面

    2024年02月05日
    浏览(59)
  • CentOS(4)——关于Linux软件下载时:amd64、x86、x86_64、arm64 的说明

    目录 一、简介 二、常见的CPU架构 三、Linux查看CPU架构命令 ①arch命令 ②uname -a 命令 ③lscpu 在安装GitLab Runner的时候,去清华源下载RPM包时发现同一个软件有许多不同架构的安装包,常见的有amd64、x86、x86_64、arm64这些架构,这就类似于Windows下安装软件需要区分32bit和64bit。在

    2024年02月03日
    浏览(56)
  • 运算符之算术运算符、关系运算符、逻辑运算符、复合赋值运算符、其他运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下: 算术运算符 关系运算符 逻辑运算符 复合赋值运算符 位运算符 其他运算符 运算符优先级(由高到低) 类别 运算符 结合性 后缀 ()[]-.++-- 从左到右 一元 =-!~ ++ -- (type)* sizeof 从

    2024年02月09日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包