在Linux中使用nm命令查看程序中的符号,我看到一个符号,_GLOBAL_OFFSET_TABLE_如下所示.有人可以详细说明_GLOBAL_OFFSET_TABLE_用途吗?
0000000000614018 d _GLOBAL_OFFSET_TABLE_
Run Code Online (Sandbox Code Playgroud) 是否有可能迫使编译器(gcc或clang在我的情况)使用特定的寄存器,可以说R15在x86_64一定的变量,并且还使用禁止它R15的除了变量任何其他目的.
我在X86-64汇编语言编写的代码库提供所有传统的按位,移位,逻辑,比较,运算和数学函数s0128,s0256,s0512,s1024签署整数类型和f0128,f0256,f0512,f1024浮点类型.到目前为止,我正在处理有符号整数类型,因为浮点函数可能会调用为整数类型编写的一些内部例程.
到目前为止,我已经编写并测试了函数来执行各种一元运算符,比较运算符以及加,减和乘法运算符.
现在我正在尝试决定如何为除法运算符实现函数.
我的第一个想法是,"Newton-Raphson必须是最好的方法".为什么?因为它给出了一个很好的种子(开始猜测)它很快收敛,我想我应该能够弄清楚如何在操作数上执行本机64位除法指令以获得一个很好的种子值.实际上,如果种子值精确到64位,要获得正确的答案应该只采取:
`s0128` : 1~2 iterations : (or 1 iteration plus 1~2 "test subtracts")
`s0256` : 2~3 iterations : (or 2 iterations plus 1~2 "test subtracts")
`s0512` : 3~4 iterations : (or 3 iterations plus 1~2 "test subtracts")
`s1024` : 4~5 iterations : (or 4 iterations plus 1~2 "test subtracts")
Run Code Online (Sandbox Code Playgroud)
然而,更多地思考这个问题让我很奇怪.例如,我记得我编写的核心例程,它对所有大整数类型执行乘法运算:
s0128 : 4 iterations == 4 (128-bit = 64-bit * 64-bit) …Run Code Online (Sandbox Code Playgroud) 我经常遇到这些术语,并对它们感到困惑.它们是特定于处理器,操作系统还是两者兼有?
我在英特尔i7机器上运行Ubuntu 12.04.那么他们中的哪一个会申请我的案子呢?
x86-64 processor itanium instruction-set computer-architecture
简介:我正在查看汇编代码来指导我的优化,并在将int32添加到指针时看到许多符号或零扩展.
void Test(int *out, int offset)
{
out[offset] = 1;
}
-------------------------------------
movslq %esi, %rsi
movl $1, (%rdi,%rsi,4)
ret
Run Code Online (Sandbox Code Playgroud)
起初,我认为我的编译器在添加32位到64位整数时遇到了挑战,但我已经用Intel ICC 11,ICC 14和GCC 5.3证实了这种行为.
这个帖子证实了我的发现,但不清楚是否需要符号或零扩展.仅当尚未设置高32位时,才需要此符号/零扩展.但x86-64 ABI难道不够聪明吗?
我有点不愿意将所有指针偏移更改为ssize_t,因为寄存器溢出会增加代码的缓存占用空间.
我在Xcode 8中获得了上面的cocoapod源代码中的CHANGELOG.md文件警告.我该如何清除它?
让我们考虑以下程序,它计算参数的无符号平方:
.global foo
.text
foo:
mov %rdi, %rax
mul %rdi
ret
Run Code Online (Sandbox Code Playgroud)
这是由适当编译as,但反汇编
0000000000000000 <foo>:
0: 48 89 f8 mov %rdi,%rax
3: 48 f7 e7 mul %rdi
6: c3 retq
Run Code Online (Sandbox Code Playgroud)
有什么区别ret和retq?
如何查看特定 cpu 核心属于 P 核心还是 E 核心组?有没有办法列出正在运行的 Linux x86_64 alder Lake 系统中有关性能/能源核心的信息?比如,打印任何 sysfs 参数?
我正在阅读这本书:"计算机系统 - 程序员视角".我发现,在x86-64架构中,我们仅限于6个积分参数,这些参数将被传递给寄存器中的函数.下一个参数将在堆栈上传递.
而且,第一个最多8个FP或矢量args以xmm0..7传递.
为什么不使用浮点寄存器来存储下一个参数,即使参数不是单/双精度变量?
将数据存储在寄存器中比将其存储到存储器然后从存储器中读取它会更有效(据我所知).
我正在自学,编译器是如何工作的.我正在学习从小型64位Linux程序中读取GCC生成代码的反汇编.
我写了这个C程序:
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
Run Code Online (Sandbox Code Playgroud)
使用objdump之后我得到:
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR [rbp-0x8],0x9
4004f2: 7e …Run Code Online (Sandbox Code Playgroud)