Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >强迫RIP-相对地址?

强迫RIP-相对地址?
EN

Stack Overflow用户
提问于 2020-08-25 16:38:31
回答 1查看 801关注 0票数 0

有没有办法强迫编译器或汇编程序只生成相对于RIP的寻址代码?

我试图找到一种方法来提供从传统编程模型到图灵完全抽象计算模型的映射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 17:10:48

这似乎与你在评论中的讨论有关

C实际上是图灵完整的吗? on cs.SE (在您发布这篇文章之前,我碰巧看到了它)。

请注意,PC相对寻址并不能帮助您实现无界存储。所需的数据大小可以大于代码大小,因此PC相对寻址的偏移部分需要无界大小。(它通常只能用于静态存储。)

我以为您建议的指针是相对于它们自己的地址(而不是代码)的指针,对于x86-64这样的传统ISA,它仍然需要无界寄存器宽度,所以您最好使用随机存取机抽象计算模型。x86-64需要寄存器中的全部绝对地址,或者至少有2部分与绝对地址相加。([base + idx*scale],标度为2位左移位)。add rdi, [rdi]向指针添加了一个指向偏移量(如C ptr += *ptr),但仍然需要结果才能适应寄存器。

如果您的意思是停止编译器对静态数据使用绝对内存寻址,那么是的,这很容易,可以使用gcc -fPIE-fPIC

但是,如果您的意思是只使用[rip + rel32]寻址,而不使用[reg]或通用[base + idx*scale + disp0/8/32]替代[RIP + rel32]的任何子集,那么就不使用,当然不适用于现实世界的编译器。相对寻址只能访问静态存储,因此将自己限制在这意味着没有堆栈空间和指针。x86-64的唯一相对寻址模式是[rip + rel32],其中rel32是嵌入在机器代码中的常量,而不是寄存器值。

(也许您可以使用自修改代码来修改rel32的RIP+rel32寻址模式,但没有主流编译器会这样做。您如何管理堆栈空间的可重入性并不明显,只需修改一个函数的机器代码的一个副本,但也许将正确的数据保存在堆栈空间中将使您能够恢复调用者的rel32偏移量)。

在手工编写的asm中,你当然可以做任何你想做的事情,但是限制自己重写rel32位移会使它(严格地?)没有香草x86-64强大,没有更多图灵完整。

如果你在寻找像[PC + other_register]这样的寻址模式,我认为32位ARM就有这种功能。它有索引寻址,程序计数器可以作为16个通用寄存器之一访问(与AArch64不同)。这样就可以对静态数组进行PC相对索引。再说一次,这并不是说这在任何明显的方面都有帮助。对于固定PC上的任何给定指令来寻址无界内存位置中的任何一个,“其他寄存器”必须具有无界宽度。

无界图灵-完全C:

我认为这是不可能的,除非您放松语言以删除以下事实:每种类型(包括指针)都有一些预先确定的固定宽度,而不是基于您想要处理的输入的大小。

图灵全C实现可以在循环中调用malloc无数次,例如用fgets读取输入行,并在到达二叉树时使用标准递归方法将每一行添加到二叉树中。使用基于C指针的标准节点布局:

struct node { struct node *left, *right; const char *str; };。然后遍历该树,并按排序顺序输出行。

要使树工作,任何现有节点都需要能够指向新分配的便笺。据我所知,相对地址并不能让你更接近这一点。这个二叉树示例可能是对无界C的一个很好的试金石,它包含指向其他对象的指针,其排列取决于输入。

您在注释中描述的似乎是在x86 asm中编写UTM状态机的本地部分,每个状态都有自己的2 2GiB内存空间,并且能够向前或向后跳到下一个状态。没有明确的方法可以拥有真正的随机访问或真正的指针,只有在一种状态的代码中。

对于UTM的每一步使用有限的C实现并不能给出一个完整的图灵化C实现,它给你一个图灵机一个类似磁带的非随机访问,当你的问题大小超过了你在一个“状态”或“内存库”内所能做的,或者你称之为什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63588916

复制
相关文章
删除SQL数据库表中的重复记录
在n条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复并保留一条呢?方法如下:
学派客
2023/04/07
4.3K0
SQL:删除表中重复的记录
--创建测试表 if object_id('test') is not null drop table test create table test ( id int identity(1,1) primary key, name varchar(50) ) --插入几条测试数据 insert into test select 'a' union all select 'a' union all select 'a' union all select 'a' union all select 'a
用户8983410
2021/11/02
4.8K0
SQL server 数据库基本插入、删除命令
一、实验素材:附加学生信息表(student) 二、实验要求: 1、 查询student表中所有学生的信息 select * from student 2、 查询student表中“姓名”“所在班
L宝宝聊IT
2018/06/20
1K0
从 git 的历史记录中彻底删除文件或文件夹
如果你对外开源的代码中出现了敏感信息(例如你将私钥上传到了仓库中),你可能需要考虑将这个文件从 git 的历史记录中完全删除掉。
walterlv
2023/10/22
8870
SQL Server判断表中是否存在记录的SQL语句
SQL Server数据库判断记录是否存在,要不是语句不够简洁,要不就是性能有很大问题,简直就是忍无可忍!
跟着阿笨一起玩NET
2020/03/18
4.9K0
sql删除重复记录
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
王念博客
2019/07/24
2.2K0
从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
2:jQuery版本 那么jQuery中怎么随机选出固定数组数组[1, 2, 3, 4, 5, 6, 7, 8, 9]中的三个元素,并构造成新数组的?
王小婷
2018/08/02
6K0
sql删除wordpress没用的postmeta记录
支持多作者的wordpress博客,有时需要审核他们的文章内容,虽然UGC(User-generated content)整体是好的,但是也要控制一下质量,实在不相关或spam的文章就要毫不手软的删除。日志的记录已经删除了,但是日志扩展表 postmeta 里面的数据还没有删除,也人工清理下吧,减少数据库的占用
ytkah
2022/03/14
7080
sql删除或清空表数据[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132352.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/12
9.8K0
记录下关于SQL Server的东西
定义一个递归CTE,至少需要两个查询(或者更多),第一个查询称为定位点成员(anchor member),第二个查询称为递归成员(recursive member),基本格式如下:
Jerremy
2022/05/09
1.3K0
记录下关于SQL Server的东西
SQL Server中的GUID
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。
全栈程序员站长
2022/07/15
5.2K0
【Oracle笔记】数据表中删除重复记录的SQL
  ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。   ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。
程序员云帆哥
2022/05/12
2.8K0
【求助】从大表中删除小表中存在的记录问题
A表:30万,主键ID B表:300万,主键ID 从B表中删除ID=A表ID的记录。 DELETE FROM B WHERE EXISTS (SELECT 1 FROM (SELECT ID FROM (SELECT T.ID, ROWNUM RN FROM A) WHERE RN > 0 AND RN <= 50000) AB WHERE A.ID = B.ID); 但执行计划显示COST较大,且瓶颈是B表的全表扫描。 需求是这里有B1 ... B10多个B表(都是300万),串行操作
bisal
2019/01/29
5.1K0
SQL Server新建、修改、删除表结构。
1、点击[testdb] 2、点击[表] 3、点击[新建] 4、点击[表] 5、点击[列名] 6、点击[数据类型] 7、点击[nchar(10)] 8、点击[int] 9、点击[允许Null值] 10、点击[▲] 11、点击[设置主键] 12、点击[列名] 13、点击[数据类型] 14、点击[允许Null值] 15、点击[列名] 16、点击[数据类型] 17、点击[nchar(10)] 18、点击[int] 19、点击[文件]
裴来凡
2022/05/28
1.6K0
SQL Server新建、修改、删除表结构。
删除SQL数据库中事务日志方法
DUMPTRANSACTION[数据库名]WITHNO_LOGBACKUPLOG[数据库数据库
Java架构师必看
2021/03/22
1K0
SQL server数据库的部署
一、实验目标 1、安装一台SQL SERVER(第一台),然后克隆再一台(第二台),一共两台,修改两台的主机和IP地址。 2、使用注册的方式,用第二台远程连接第一台 二、实验步骤 1)先打开一台Wi
L宝宝聊IT
2018/06/20
1.8K0
4 - SQL Server 2008 之 使用SQL语句删除表格
本文介绍了如何使用 SQL Server 2008 中的 SQL 语句删除表格。首先介绍了删除表格的语法,然后通过两个示例讲解了如何删除表格。第一个示例是删除名为 Employee 的表格,第二个示例是删除名为 Person 的表格。在删除表格之前,需要先判断该表格是否存在,如果不存在则不进行任何操作。同时,在删除含有外键的表格之前,需要先删除外键引用的主键表格,否则会报错。
CNXY
2017/12/25
1.5K0
4 - SQL Server 2008 之 使用SQL语句删除表格
SQL Server数据库碎片
当索引所在页面的基于主关键字的逻辑顺序,和数据文件中的物理顺序不匹配时,碎片就产生了。所有的叶级页包含了指向前一个和后一个页的指针。这样就形成一个双链表。理想情况下,数据文件中页的物理顺序会和逻辑顺序匹配。整个磁盘的工作性能在物理顺序匹配逻辑顺序时将显著提升。对某些特定的查询而言,这将带来极佳的性能。当物理排序和逻辑排序不匹配时,磁盘的工作性能会变得低效,这是因为磁头必须向前和向后移动来查找索引,而不是只象某个单一方向来搜索。碎片会影响I/O性能,不过对于位于SQL Server数据缓冲内的数据页而言,碎片
张善友
2018/01/22
2.8K0
SQL Server 数据库设计
SQL Server 系统数据库在安装软件时自动创建,用于协助系统共同完成对数据库的操作;也是数据库运行的基础;
剑指工控
2021/11/09
2.5K0
SQL Server 数据库设计
SQL server数据库部署
如今生活中,到处都有数据,我们手机上一个小小的APP软件,在他的身后可能有好几十台服务器支撑着,在服务器上呢拥有数据,每个软件都是有一个后台数据库的。 常用的几个数据库有: SQL server 此数据库是微软开发的只能应用在Windows端,简单、易用 oracle 甲骨文公司开发的 它面向所有的主流平台,安全、完善,但是操作复杂 DB2 IBM公司开发,面向所有主流平台,适用于大型企业环境,安全、完善 MySQL(Mariadb) 甲骨文公司所收购,开源、体积小、速度快、稳定 SQL server数据库分为系统数据库和用户数据库两类,其中系统数据库有四个:
小手冰凉
2019/09/10
3.3K0
SQL server数据库部署

相似问题

如何从SQL Server数据库中删除记录

11

如何从sql server数据库中自动删除旧记录?

22

从SQL Server表中动态删除记录

34

SQL Server数据库不删除记录

42

固定删除SQL Server数据库记录?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文