问题标签 [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.

0 投票
2 回答
2602 浏览

assembly - 如何使用 AVR 的 gnu 汇编程序相对于 PC 跳转?

我有一个使用 avr-objcopy 反汇编的二进制文件。中断向量表如下所示:

我想通过一些修改重新组装这个文件。我通过删除前 2 列对其进行了重新格式化,使其成为常规程序集文件。IE:

但是,当我跑步时

然后反汇编生成的文件。(使用 objcopy -S a.out)输出如下:

那么我怎样才能让 avr-as 尊重 PC 相关的跳跃呢?

0 投票
1 回答
2712 浏览

gcc - 生成常量数据的%pc相对地址

有没有办法让 gcc 生成%pc常量的相对地址?即使字符串出现在文本段中,arm-elf-gcc 也会生成一个指向数据的常量指针,通过%pc相对地址加载指针的地址,然后解除引用。由于各种原因,我需要跳过中间步骤。例如,这个简单的函数:

生成(使用 编译时arm-elf-gcc-4.3.2 -nostdlib -c -O3 -W -Wall logfile.c):

我原以为它会产生更像:

有问题的代码需要部分与位置无关,因为它将在加载时重新定位在内存中,而且还与未编译的代码集成-fPIC,因此没有全局偏移表。

我目前的工作是调用非内联函数(通过%pc相对地址完成)以类似于-fPIC代码工作方式的技术查找编译位置的偏移量:

但是这种技术需要手动修复所有filename()数据引用,因此上面示例中的函数将变为:

0 投票
2 回答
2562 浏览

assembly - 使用相对指针寻址数据(x86-32 汇编器)

我正在用 32 位 x86 汇编器编写,我不太确定如何处理始终与代码具有相同关系的数据。我必须使用EIP来计算绝对地址,还是有更好的方法?

0 投票
1 回答
894 浏览

gcc - 我可以在 x86-64 中使用 gcc 为不同的变量选择 RIP 相对或绝对寻址吗

我编写了自己的链接脚本,将不同的变量放在两个不同的数据部分(A 和 B)中。

A 链接到零地址;B 链接到代码附近,并且在高地址空间中(高于 4G,这不适用于 x86-64 中的正常绝对寻址)。

A 可以通过绝对寻址访问,但不能通过 RIP-relative 访问;B可以通过RIP-relative寻址访问,但不是绝对的;

我的问题:有没有办法为 gcc 中的不同变量选择相对 RIP 或绝对寻址?也许有一些注释,比如#pragma

0 投票
2 回答
564 浏览

python - PyCUDA 内存寻址:内存偏移?

我在设备上有大量生成的数据(A[i,j,k]),但我只需要 A[i,:,:] 的一个“切片”,在常规 CUDA 中这很容易用一些指针算术完成。

在pycuda中可以做同样的事情吗?IE

显然这是完全错误的,因为没有尺寸信息(除非从 dest 形状推断),但希望你明白吗?

0 投票
1 回答
564 浏览

nasm - 从数据段指向文本段的指针

是否可以在 x86-64 中使用此相对寻址执行以下操作?

当我在带有 nasm 的 OS X 上这样做时,我收到以下链接器警告:

ld:警告:PIE 已禁用。在代码签名的 PIE 中不允许使用绝对寻址(可能是 -mdynamic-no-pic),但在 /var/tmp/tmp.1.Ho4qKA 中的一个中使用。要修复此警告,请勿使用 -mdynamic-no-pic 编译或使用 -Wl,-no_pie 链接

0 投票
0 回答
615 浏览

memory-management - RIP-relative addressing on x86

I'm not really experienced with x86 assembler and try to debug a problem related to a bug in mach_inject.

The original code looks like this (function mach_inject in mach_inject.c):

and then somewhat later (function INJECT_ENTRY of mach_inject_bundle_stub.c):

It seems, for me, when I compile this for x86, it fails. If I change the code so that I have imageOffset = 0; on just every architecture (i.e. also for x86), it all works fine.

So, some questions:

  • RIP-relative addressing is also available for 32bit/x86 mode?
  • What was (probably) the initial intention for this code if we anyway have also RIP-relative addressing for 32bit mode?
  • Is RIP-relative addressing a compiler setting? Or in what way can I control if my code uses RIP-relative addressing or not? (Or more related to this bug: Is imageOffset = 0; always correct? Or when is it not?)
0 投票
3 回答
6461 浏览

linux - 32 位模式下的 NASM x86_64 汇编:为什么这条指令会产生 RIP 相对寻址代码?

这里的基本内容是我需要将 hello 字符串的长度传递给 linux 的 sys_write 系统调用。现在,我很清楚我可以只使用 EQU,它会正常工作,但我真的很想了解这里发生了什么。

所以,基本上当我使用 EQU 时,它会加载值,这很好。

但是,如果我将此行与 DB 一起使用

汇编器并没有像我期望的那样在该地址加载值,而是输出 RIP-Relative Addressing,如 gdb 调试器中所示,我只是想知道为什么。

现在,我尝试使用 eax 寄存器代替(然后将 eax 移动到 edx),但后来我遇到了另一个问题。我最终得到了 gdb 中指出的分段错误:

显然,不同的寄存器产生不同的代码。我想我需要以某种方式截断高 32 位,但我不知道该怎么做。

虽然确实找到了一个“解决方案”,它是这样的:用 str_hello_length 的地址加载 eax,然后加载 eax 指向的地址的内容,一切都是 hunky dory。

显然试图从内存地址间接加载一个值会产生不同的代码?我真的不知道。

我只需要帮助理解这些指令的语法和操作,这样我就可以更好地理解为什么要加载有效地址。是的,我想我本可以切换到 EQU 并继续我的快乐之路,但我真的觉得我无法继续,直到我了解 DB 声明和从它的地址加载的情况。

0 投票
3 回答
598 浏览

multithreading - 汇编/多任务处理中的内存寻址

我了解机器代码中的程序如何将内存中的值加载到寄存器中、执行跳转或将寄存器中的值存储到内存中,但我不明白这对多个进程是如何工作的。一个进程是动态分配内存的,所以它必须使用相对寻址吗?这是自动完成的(意味着有执行相对跳转的汇编指令等),还是程序必须“手动”将正确的偏移量添加到它所寻址的每个内存位置。

我还有一个关于多任务处理的问题,这有点相关。未运行的操作系统如何停止线程并继续下一个线程。这是通过定时中断完成的吗?如果是这样,那么如何为线程保留寄存器中的值。在将控制权交给不同的线程之前,它们是否已保存到内存中?或者,不是定时中断,线程只是简单地选择一个放弃控制的好时机。在定时中断的情况下,如果线程被赋予处理器时间而它不需要它会发生什么。它是否必须浪费它,它可以手动调用中断,还是它会提醒操作系统它不需要太多时间?

编辑:或者在运行之前编辑可执行文件以补偿正确的偏移量?

0 投票
1 回答
1489 浏览

assembly - gcc 内联汇编中的绝对和相对寻址

我无法理解汇编中绝对寻址和相对寻址的概念,尤其是在 gcc 内联汇编中。我在教程中看到了以下代码:

这里最后一条指令 jmp *%%ecx 使用 *. 除了它用于绝对寻址之外,我找不到一个很好的描述星号的意义是什么。我得到这样的想法,绝对意味着实际的物理地址,而相对意味着从程序开始的偏移量。但是我不清楚相对寻址。我在汇编中阅读了有关 PC 相对寻址的信息,但我并不完全理解它,而且我不清楚相对和 PC 相对是否相同。请解释一下。