标签: x86-64

Perf 将一些直接跳转指令报告为内存访问指令

我使用以下perf命令对用户空间对 DRAM 的读取访问进行采样evince

perf record -d --call-graph dwarf -c 100 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)

可以看出,我使用该PEBS功能来提高采样的准确性。但是有一些非内存访问报告为内存访问。例如,这是一个由 报告的采样事件perf script

evince 20589 16079.401401:        100 mem_load_uops_retired.l3_miss:uppp:     555555860750         5080022 N/A|SNP N/A|TLB N/A|LCK N/A
    555555579939 ev_history_can_go_back+0x19 (/opt/evince-3.28.4/bin/evince)
    5555555862ef ev_window_update_actions_sensitivity+0xa1f (/opt/evince-3.28.4/bin/evince)
    55555558ce4f ev_window_page_changed_cb+0xf (/opt/evince-3.28.4/bin/evince)
    7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff575805d signal_emit_unlocked_R+0xf4d (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff5760714 g_signal_emit_valist+0xa74 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff576112e g_signal_emit+0x8e (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff7140d76 emit_value_changed+0xf6 (inlined)
    7ffff7140d76 adjustment_set_value+0xf6 (inlined)
    7ffff7140d76 gtk_adjustment_set_value_internal+0xf6 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
    7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff5757de7 signal_emit_unlocked_R+0xcd7 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff575fc7f g_signal_emitv+0x27f (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff7153519 gtk_binding_entry_activate+0x289 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
    7ffff71539ef binding_activate+0x5f (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30) …
Run Code Online (Sandbox Code Playgroud)

linux x86-64 performancecounter memory-access perf

1
推荐指数
1
解决办法
79
查看次数

为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档,第一卷。1 和3.6.1 64 位模式下的操作数大小和地址大小一章。有三个前缀REX.W,操作数大小66和地址大小67前缀。并提到操作数的大小默认为 32 位。并且只能用REX.W指令前缀(在其他前缀之后)以使其长度为 64 位。

我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如int操作数?跟签有关系吗?或者为什么会有这个限制?(所以,C是否在 int 上unsigned int使用REX.W前缀操作(正如也提到的,前缀仅持续特定指令,而不是整个段,这应该是(大小,地址或操作数)默认值和包含在段描述符中)。

我理解正确吗?

64-bit assembly x86-64 machine-code instruction-encoding

1
推荐指数
1
解决办法
621
查看次数

CS 和 DS 寄存器是否仍然影响 x64 intel 中的指令

Afaik 他们从未使用过,现在 CS=DS=SS。但是,如果我要设置这些值,会发生任何变化还是处理器会忽略它们。我在这个问题上发现了非常矛盾的信息,我不明白如果它们被忽略为什么它们仍然存在。请帮助

windows assembly kernel x86-64 memory-segmentation

1
推荐指数
1
解决办法
689
查看次数

这如何更快?使用“FPU 技巧”的 52 位模乘法比 x64 上的内联 ASM 更快

我发现这个:

#define mulmod52(a,b,m) (((a * b) - (((uint64_t)(((double)a * (double)b) / (double)m) - 1ULL) * m)) % m)
Run Code Online (Sandbox Code Playgroud)

... 比:

static inline uint64_t _mulmod(uint64_t a, uint64_t b, uint64_t n) {
    uint64_t d, dummy;                    /* d will get a*b mod c */
    asm ("mulq %3\n\t"              /* mul a*b -> rdx:rax */
         "divq %4\n\t"              /* (a*b)/c -> quot in rax remainder in rdx */
         :"=a"(dummy), "=&d"(d)     /* output */
         :"a"(a), "rm"(b), "rm"(n)  /* input */
         :"cc"                      /* mulq and divq can set …
Run Code Online (Sandbox Code Playgroud)

optimization performance assembly x86-64

1
推荐指数
1
解决办法
99
查看次数

编译后 64 位 Hello world 冻结

程序编译,但启动后冻结。如果替换格式并包含 32 位版本或注释掉 MessageBox,则一切正常。

format PE64 GUI

include 'E:\Fresh\include\win64a.inc'

entry start

section '.data' data readable writeable

        text db 'Hello world!',0

section '.text' code readable executable
start:
        invoke MessageBox,0,text,text,0
        invoke ExitProcess,0

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32, 'USER32.DLL'
        import kernel32, ExitProcess, 'ExitProcess'
        import user32, MessageBox, 'MessageBoxA'  
Run Code Online (Sandbox Code Playgroud)

x86-64 fasm

1
推荐指数
1
解决办法
48
查看次数

Clang 11 和 GCC 8 O2 中断内联组装

我有一小段代码,其中有一些内联程序集可以在 O0 中正确打印 argv[0],但不会在 O2 中打印任何内容(使用 Clang 时。另一方面,GCC 打印存储在 envp[0] 中的字符串打印 argv[0] 时)。这个问题也仅限于 argv(其他两个函数参数可以在启用或不启用优化的情况下按预期使用)。我用 GCC 和 Clang 对此进行了测试,两个编译器都有这个问题。

这是代码:

void exit(unsigned long long status) {
    asm volatile("movq $60, %%rax;" //system call 60 is exit
        "movq %0, %%rdi;" //return code 0
        "syscall"
        : //no outputs
        :"r"(status)
        :"rax", "rdi");
}

int open(const char *pathname, unsigned long long flags) {
    asm volatile("movq $2, %%rax;" //system call 2 is open
        "movq %0, %%rdi;"
        "movq %1, %%rsi;"
        "syscall"
        : //no outputs
        :"r"(pathname), "r"(flags)
        :"rax", "rdi", …
Run Code Online (Sandbox Code Playgroud)

c linux assembly x86-64 inline-assembly

1
推荐指数
1
解决办法
613
查看次数

平均而言,现代 x64 CPU cmpxchg16b 比 64 位或 32 位 CPU 慢得多?

我相信 Windows 已经在内部使用该指令很长时间了,所以 CPU 制造商会花精力去优化吗?

当然,假设适当对齐的内存和不共享缓存线等。

performance x86-64 atomic intel amd-processor

1
推荐指数
1
解决办法
229
查看次数

x64 支持是否意味着 BMI1 支持?

可以安全地假设 x64 构建可以使用TZCNT而无需通过 cpu 标志检查其支持吗?

assembly x86-64 instruction-set bmi

1
推荐指数
1
解决办法
247
查看次数

C++11:16 字节原子<> 变量是否在 16 字节边界上自动对齐,允许 CMPXCHG16B 指令?

16 字节atomic<>变量是否在 16 字节边界上自动对齐,从而允许编译器/运行时库有效地使用 x86CMPXCHG16B指令?或者我们应该根据风格总是手动指定alignas(16)所有这些变量?

c++ x86-64 memory-alignment compare-and-swap stdatomic

1
推荐指数
1
解决办法
200
查看次数

如何更改 asm x64 中的 errno 值

我为一个学校项目编写程序集,但我被困在一个点上,我需要在 asm 中重写 Read,所以我明白了,但是我需要设置 errno 变量,然后我的 read 可以在出现错误时返回 -1例如,将 errno 的值设置为 9。而且我没有找到如何更改这个著名的 errno :( 这是我的实际代码:

global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    mov rax, -1
    ret
Run Code Online (Sandbox Code Playgroud)

ps:我找到了需要使用 __error 的地方,但我没有找到任何关于此的文档:(

非常感谢:D

编辑 :

谢谢你们的帮助!__errno_location 工作我做到了:

extern __ernno_location
global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    neg rax    ; get absolute value of syscall return …
Run Code Online (Sandbox Code Playgroud)

linux assembly x86-64 errno system-calls

1
推荐指数
1
解决办法
1161
查看次数