首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在内联汇编中实现这一点?

如何在内联汇编中实现这一点?
EN

Stack Overflow用户
提问于 2014-06-03 02:45:23
回答 3查看 337关注 0票数 1

我对GNU内联汇编语法的理解非常糟糕,所以我希望一个实际的例子能有所帮助。给定以下程序集(x86-64,Clang输出),我如何使用内联程序集构造一个完全相同的函数?GCC为同一函数生成不同的代码,我希望让它生成与Clang (-O3)输出相同的版本。

代码语言:javascript
运行
AI代码解释
复制
bittest(unsigned char, int):
    btl %esi, %edi
    setb    %al
    ret

以下是GCC (-O3)的作品:

代码语言:javascript
运行
AI代码解释
复制
bittest(unsigned char, int):
    movzx    eax, dil
    mov    ecx, esi
    sar    eax, cl
    and    eax, 1
    ret

下面是该函数的C代码:

代码语言:javascript
运行
AI代码解释
复制
bool bittest(unsigned char byte, int index)
{
    return (byte >> index) & 1;
}
EN

回答 3

Stack Overflow用户

发布于 2014-06-03 21:38:43

好吧,上次我写了一个32位的位测试,它看起来像这样(64位看起来略有不同):

代码语言:javascript
运行
AI代码解释
复制
unsigned char _bittest(const long *Base, long Offset) 
{ 
   unsigned char old; 
   __asm__ ("btl %[Offset],%[Base] ; setc %[old]" : 
      [old] "=rm" (old) : 
      [Offset] "Ir" (Offset), [Base] "rm" (*Base) : 
      "cc"); 

   return old; 
}

不过,如果你想把它放在一个公共头中,我有一个不同的版本。当我使用-O2时,它最终内联了整个代码,从而生成了真正有效的代码。

我很惊讶gcc没有在这里自己生成btl (参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36473),但你是对的,它没有。

票数 2
EN

Stack Overflow用户

发布于 2014-06-03 02:53:25

我认为你不太可能在你的编译器中确定一个逐字节等价的版本,有一些细微的差异不值得担心。在this question之后,确保使用正确的标志进行编译。尝试让两个编译器产生相同的输出可能是徒劳的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-06 06:23:39

如果您希望生成完全相同的代码,则可以执行以下操作

代码语言:javascript
运行
AI代码解释
复制
const char bittestfunction[] = { 0xf, 0xa3, 0xf7, 0xf, 0x92, 0xc0, 0x3 };
int (*bittest)( unsigned char, int ) = (int(*)(unsigned char, int))bittestfunction;

您可以使用与bittest( foo, bar )相同的方式调用它。

objdump谈(gcc)编译后的可执行文件

代码语言:javascript
运行
AI代码解释
复制
00000000004006cc <bittestfunction>:
  4006cc:       0f a3 f7                bt     %esi,%edi
  4006cf:       0f 92 c0                setb   %al
  4006d2:       c3                      retq
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24006329

复制
相关文章
PowerDNS 轻松配置 DNS 名称服务器
其次使我们感兴趣的是 PDNS 的所有功能都在配置文件中。pdns.conf 有许多选项,你可以通过添加或删除 # 号来启用或禁用这些选项。这真是太神奇了,因为它使我们有机会将这项新的服务集成到我们现有的基础架构中,并且只有我们想要的功能,不多也不少。一个简单的例子:
用户8989785
2021/09/09
1.7K0
service DNS名称
DNS服务监视kubernetes API,为每一个service创建DNS记录用于域名解析 clusterIP A记录格式:
院长技术
2020/12/07
1.1K0
使用 PowerDNS 轻松配置 DNS 名称服务器
几个月前,我们接到了一个要求,为一个新项目提供一个稳定可靠的域名系统(DNS)服务器。该项目使用容器进行自动部署,每个新环境都会生成唯一的随机 URL。在对可能的方案进行了大量研究之后,我们决定尝试一下 PowerDNS(PDNS)。
用户1880875
2021/09/15
1.3K0
使用 PowerDNS 轻松配置 DNS 名称服务器
一开始,我们发现 PowerDNS 在所有主流 Linux 发行版中都得到了支持,它采用 GPL 许可,且仓库保持更新。我们还在官方网站上发现了整洁、组织良好的文档,以及大量来自真正喜欢和使用该产品的人在网络上的使用方法。看了一些并学习了一些基本命令之后,安装了 PDNS,启动并运行,我们的旅程开始了。
用户4988085
2021/09/14
1.5K0
自建DNS解析服务器
搭建DNS解析服务器,不是属于DNS服务器:比如114.114.114.114啥的,而是能够帮你解析域名的服务器。
幻影龙王
2021/09/05
18.3K0
自建DNS解析服务器
无法解析服务器的DNS地址
背景: 打开浏览器突然之间发现无法上网了,提示说无法解析服务器的DNS地址 原因: DNS,就是将域名转换为IP地址功能的服务器 DNS解析不了,是由于输入的地址无法指向到目标网络,而导致的无法上
运维小白
2018/03/29
50.1K0
无法解析服务器的DNS地址
DNS服务器域名解析
HelloWorldZ
2024/03/20
1.1K0
DNS如何解析服务器
但是这样也有问题,那就是Hosts文件是有限的,就和你不可能拥有这个世界上所有人的电话号码一样。既然我们自己不可能拥有全世界所有人的电话号码,但是我们可以将收集电话号码这个任务交给一个专门来干这个活的人,然后大家想要问电话的时候去他那查一下就可以了。
用户1880875
2021/07/02
14K0
【DNS 解析】DNS 解析过程分析
可以这么理解:域名可以方便大家记忆,DNS 目的是为了实现域名和主机地址之间的转换而存在的系统。
青橙.
2022/06/08
114.6K2
【DNS解析】​跨账号共享DNS解析
在添加域名共享窗口中,输入框中,输入需共享的 腾讯云 账号ID。并勾选共享主域名或者共享部分记录。如下图所示:
青阳
2022/05/27
34.2K0
DNS解析
大概就是这样的过程,下面我们来仔细的分析下浏览器是如何查找到域名对应的ip地址的。
IMWeb前端团队
2019/12/03
31.4K0
配置dns域名解析_搭建本地服务器dns怎么设置
DNS(Domain Name System–域名系统),在TCP/IP 网络中有着非常重要的地位,能够提供域名和IP地址的解析服务.
全栈程序员站长
2022/09/16
44.1K0
如何为linux服务器配置DNS解析?
修改本地hosts文件,利用hosts自动解析域名到ip,此方法也适用于windows,只不过windows的位置于C:\WINDOWS\system32\drivers\etc\hosts
机智的程序员小熊
2019/12/12
22.9K0
腾讯云云解析修改域名DNS服务器
当你在腾讯云购买域名后,如果 DNS 服务器不正确,要把域名 DNS 修改为提示的 DNS 地址,解析后才生效。
魏艾斯博客www.vpsss.net
2019/08/28
24.4K0
腾讯云云解析修改域名DNS服务器
DNS解析
本文介绍了DNS解析过程、安全防范和性能优化等相关知识。
IMWeb前端团队
2017/12/29
32.4K0
CentOS 7.4 搭建分离解析的DNS服务器
环境:Linux服务器一台(双网卡) 内网IP:192.168.80.101 设置为vmnet1 外网IP:192.168.90.101 设置为vmnet2 Linux客户端一台,IP地址:192.168.80.102 设置为vmnet1 Win7客户端一台,IP地址:192.168.90.10 设置为vmnet2
星哥玩云
2022/07/25
7.6K0
CentOS 7.4 搭建分离解析的DNS服务器
如何为linux服务器配置DNS解析?
修改本地hosts文件,利用hosts自动解析域名到ip,此方法也适用于windows,只不过windows的位置于C:\WINDOWS\system32\drivers\etc\hosts
小小科
2019/07/03
25.6K0
dns解析
dns也可以认为是域名的解析,因为在实际的网络请求中,是通过ip来进行互访请求的,但是ip是四个字节的数字组成,不容易记住,能够更加方便的访问互联网,然后域名系统应运而生,但是域名并不是免费的,需要到域名注册商处进行申请注册,人们都习惯记忆域名,但机器间互相只认识 IP 地址,域名与 IP 地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,解析过程是自动进行的。域名解析(DNS)是将域名(例如 cloud.tencent.com)转换成为机器可读的 IP 地址(例如10.10.10.10)的服务。
云售后焦俊成
2020/08/26
41.3K0
dns解析
使用Bind部署DNS域名解析服务器
DNS系统在网络中的作用是维护一个地址数据库,其中记录了各种主机域名与ip地址的对应关系,提供正向或反向的地址查询服务,即正向解析与反向解析。
星哥玩云
2022/07/25
13.5K0
如何为 DNS 服务器添加反向解析记录
前一篇文章我们介绍了如何快速搭建 DNS 服务器,本文将向大家介绍如何向 DNS 服务器添加反向解析记录,支持将指定的 IP 解析到对应的域名。
9527
2018/11/26
49.1K4
如何为 DNS 服务器添加反向解析记录

相似问题

强制辅助DNS服务器解析未解析的名称。

10

DNS解析为同一IP的不同机器。

30

未解析DNS名称

20

使绑定DNS服务器“记住”解析的名称。

10

DNS我的DNS服务器和公共DNS服务器中不同的PTR记录解析

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档