问题标签 [relative-addressing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++,对象的绝对地址在释放之前是否始终保持不变?
“测试”是否在 RAM 上具有绝对地址或在虚拟内存中具有与 RAM 的零地址相对起点的绝对地址?
一个例子可能是,在一个非常碎片化的内存中,我启动了许多应用程序,每个应用程序在 10 小时内多次分配和释放,其中一个应用程序是 RAM 错误检查和基准测试。它可以测试所有 RAM 地址还是仅在有限区域上运行?如果它达到所有 RAM,那么除了移动其对象之外,操作系统如何能够保护应用程序免受其他应用程序的影响?特别是当从 pci-e 流式传输非固定数组到 pci-e 时。
assembly - 为什么静态变量的地址是相对于指令指针的?
我正在关注关于组装的本教程。
根据教程(我也在本地尝试过,得到了类似的结果),源代码如下:
编译为这些汇编指令:
(行号注释(1)
,由我添加。)(2)
(1, 2)
问题:为什么在编译后的代码中,静态变量的地址b
相对于指令指针(RIP)是不断变化的(见行(1)
和(2)
),从而生成更复杂的汇编代码,而不是相对于特定的部分可执行文件,这些变量存储在哪里?
根据提到的教程,有这样一个部分:
这是因为 for 的值
b
被硬编码在示例可执行文件的不同部分中,并且在启动进程时,操作系统的加载程序将其与所有机器代码一起加载到内存中。
(强调我的。)
assembly - 为什么这条 MOVSS 指令使用 RIP 相对寻址?
我在反汇编程序(浮点逻辑 C++)中找到了以下汇编代码。
我知道当进程 rip 总是 842 并且这个 0x21a(%rip) 将是 const 时。使用这个寄存器似乎有点奇怪。
我想知道使用 rip 相对地址而不是其他寻址有什么好处。
c++ - 在 x86 32 位上的静态类实例中解决此问题
如果我定义一个类的静态实例,编译器(特别是 g++/clang)是否有优化以在直接或间接访问数据成员(我的意思是公式)时省略base
寄存器(用于调用)并且只对所有这些成员使用单个常量?所有成员函数都可能变成静态的(如果是类的唯一实例,这是合理的)。this
[base + index * scale + displacement]
displacement
我无法检查这一点,因为在 godbolt.org 编译器上积极优化以下代码xor eax, eax; ret
:
macos - 无法将 .data 中的变量移动到 Mac x86 程序集的寄存器
我用 AT&T 语法编写了一小段程序集,目前在该.data
部分中声明了三个变量。但是,当我尝试将这些变量中的任何一个移动到寄存器时,例如%eax
,会引发错误gcc
。代码和错误信息如下:
引发的错误是:
call_function.s:14:3:错误:64 位模式不支持 32 位绝对寻址
movl x, %eax;
^
我还尝试通过首先$
在 前面添加字符来移动值x
,但是clang
会引发错误:
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
有谁知道如何将存储的值x
成功移动到%eax
?我在 Mac OSX 上使用 x86 程序集并使用gcc
.
reactjs - 在 Axios 请求中使用 API 的相对寻址
我正在开发一个应用程序,其中 API CRUD 函数的 URL/路径定义如下:
正如预期的那样,编辑和删除的路径会收到一个 id。现在在我的应用程序中,我可以创建一个帖子并使用以这种方式定义的 url 获取请求,如下所示:
以上发送 POST 请求没有问题。但是当我需要编辑一个项目时,我需要以某种方式将 itemid 包含到这个 url 中。我试过这样做,但没有奏效
在上述 url 中包含 id 的正确方法是什么?我不能像axios 文档中所示的那样对 url 进行硬编码,例如“ http://localhost/app_dev.php/api/v1/items/ {$id}”
assembly - x86-64 GAS Intel 语法中的“[RIP + _a]”等 RIP 相对变量引用如何工作?
考虑 x64 Intel 程序集中的以下变量引用,该变量a
在该.data
部分中声明:
我很难理解这个变量引用是如何工作的。既然a
是对应于变量运行时地址的符号(带重定位),那么如何才能[rip + _a]
解引用正确的内存位置a
呢?实际上,rip
保存了当前指令的地址,它是一个很大的正整数,所以加法会导致不正确的地址a
?
相反,如果我使用 x86 语法(非常直观):
,我收到以下错误:64 位模式不支持 32 位绝对寻址。
有什么解释吗?
编译gcc -S -masm=intel abs_ref.c -o abs_ref
::
assembly - lea 汇编指令语法
嗨,我是汇编语言的新手,我对学习一段代码时看到的 lea 指令的语法感到困惑(这是使用 gdb 命令生成的: disassemble main )。
我看到的 lea 语法是
但似乎在 %rsi 寄存器之后有一个额外的立即值(#0x4aa5df),我应该如何正确解释这个?
编辑:我检查了存储在 %rip 寄存器中的值,它是
因此,将其与 0xa8e96 添加给我 0x4AA5C6 与 0x4aa5df 不匹配,我在这里遗漏了什么吗?
c++ - 使用变量定义变量名
我确信有一个非常简单的答案,我可能只是健忘,但我不记得如何使用变量来定义另一个变量的名称。我什至想不出这个过程的名称来搜索现有的答案。
我有一个变量:VarA,它将是整数 1、2、3、4 等。
我有另一组数组 VarBn[],其中“n”与 VarA 相关。
所以,当 VarA=1 我想知道 VarB1[],当 VarA=2 ... VarB2[]
我目前有一个非常长且重复的 switch 语句......
但如果它只是一条线,它的功能会小得多......