52得票2回答
ARM PC寄存器为什么指向下一条要执行的指令后面的那一条指令?

根据ARM IC,当处于ARM状态时,PC 的值是当前指令的地址加8字节。而在Thumb状态下: - 对于 B、BL、CBNZ 和 CBZ 指令,PC 的值是当前指令的地址加4字节。 - 对于所有其他使用标签的指令,PC 的值是当前指令的地址加4字节,结果的第1位被清零以使其字对齐。 简单...

37得票1回答
如何在64位汇编程序中使用RIP相对寻址?

如何在Linux AMD64架构的汇编程序中使用RIP相对寻址?我正在寻找一个简单的例子(Hello World程序),演示如何使用AMD64 RIP相对寻址模式。 例如,下面的64位汇编程序用于普通(绝对寻址):.text .global _start _start: m...

28得票1回答
了解Intel汇编中的%rip寄存器

关于以下小代码,它在另一篇关于结构体大小和正确对齐数据的帖子中有所说明: struct { char Data1; short Data2; int Data3; char Data4; } x; unsigned fun ( void ) { x.Data1=1; ...

17得票1回答
x86-64 GAS Intel语法中的RIP相对变量引用如"[RIP + _a]"是如何工作的?

考虑以下x64 Intel汇编中的变量引用,其中变量a在.data部分声明:mov eax, dword ptr [rip + _a] 我不理解这个变量引用是如何工作的。因为 a 是指向变量运行时地址的符号(带有重定位),那么 [rip + _a] 如何解引用正确的 a 内存位置呢?实际上,r...

12得票2回答
为什么x86-64架构中的全局变量是相对于指令指针访问的?

我曾尝试使用gcc -S -fasm foo.c将c代码编译为汇编代码。 该c代码声明了全局变量和主函数中的变量,如下所示:int y=6; int main() { int x=4; x=x+y; return 0; } 现在我查看了从这段C代...

11得票2回答
“mov offset(%rip), %rax”是什么意思?

rax是获取当前指令地址的偏移量还是下一条指令的地址?从微码的角度来看,如果答案是下一条指令,则会更容易。

9得票1回答
为什么这条MOVSS指令使用RIP相对寻址?

我在反汇编器中找到了以下汇编代码(浮点逻辑C ++)。 842: movss 0x21a(%rip),%xmm0 我理解当进程rip时,始终会是842,并且这个0x21a(%rip)将是常量。使用这个寄存器似乎有点奇怪。 我想知道使用rip相对地址是否有任何优势,而不是其他寻址...

9得票1回答
为什么静态变量的地址与指令指针有关?

我正在学习有关汇编的这个教程。 根据该教程(我也尝试了本地操作,并且得到了类似的结果),以下源代码: int natural_generator() { int a = 1; static int b = -1; b += 1; ...

8得票1回答
生成常量数据的%pc相对地址

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