x86-64相关内容
当调用函数 strcpy() 时,我尝试在 GDB 上设置断点,但 GDB 停止,我不知道如何找到错误,我是 GDB 新手我想研究二进制利用,所以我正在阅读的论坛对此没有任何解释,这是输出; (gdb) 反汇编 main函数 main 的汇编代码转储:0x00000000000011c9 : endbr640x00000000000011cd :推送rbp0x0000000000
..
在 gdb 中,我似乎无法访问任何伪寄存器:r8b、r9b、r10b、r11b、r12b、r13b、r14b 和 r15b(但是,r15d 和 r15w 似乎可以工作,sil 也一样). 看一个例子: section .text全球主要主要的:xor esi, esimov sil, 0x1f异或 r13d, r13dmov r13b, silret 使用 gdb 运行: (gdb)
..
已知%rsp指向栈帧的顶部,%rbp指向栈帧的底部.那我就无法理解为什么 %rbp 在这段代码中是 0x0: (gdb) x/4xg $rsp0x7ffffffffe170: 0x00000000004000dc 0x00000000000000100x7ffffffffe180: 0x0000000000000001 0x00007ffffffffe487(gdb) disas HelloWo
..
在使用 GDB 调试程序时,有什么方法可以读取特定于 x86-64 模型的寄存器,特别是 IA32_FS_BASE 和 IA32_GS_BASE? 不太可取的是使用动态仪器包(如英特尔的 Pintool)的解决方案,但同样值得赞赏. 解决方案 如果您不想更改代码(或者如果代码不可用),您可以通过以下方式执行类似于 amdn 的答案的操作.对 arch_prctl 的调用需要一个指向
..
我正在尝试编写一些高性能汇编函数作为练习,但在运行程序时遇到了一个奇怪的段错误,但在 valgrind 或 nemiver 中没有. 基本上不应该运行的 cmov,地址越界,即使条件始终为假,也会让我出现段错误 我有一个快速和一个慢速版本.慢的一直有效.快速的工作,除非它收到一个非 ascii 字符,此时它会严重崩溃,除非我在 adb 或 nemiver 上运行. ascii_f
..
来自 android 开发者网站,https://developer.android.com/distribute/best-practices/develop/64-bit 很明显,从 2019 年 8 月 1 日开始,在 Google Play 上发布的应用程序将需要支持 64 位架构. 我们当前的应用具有 armeabi-v7a、arm64-v8a、x86 ABI 的本机库,但没有 x
..
我试图理解“Iwillnotexist Idonotexist"在SIMD optimization of cvtColor using ARM NEON intrinsics上发表的评论: ...为什么不使用映射到 VLD3 指令的 ARM NEON 内部结构?这样可以省去所有的改组,简化和加速代码.英特尔 SSE 实施需要 shuffle,因为它缺少 2/3/4 路去交错加载指令,但您不
..
我正在开发应用程序(用 C++ 编写),它在运行时生成一些机器代码(现在是 Linux,x86-64,但我计划在 ARM 上迁移).接下来它将生成的代码存储在内存中并通过跳转到内存位置来执行它.很长一段时间我都遇到了分配可执行内存的问题,但我终于解决了: uint8_t *memory = mmap (NULL, length, PROT_READ | PROT_WRITE | PROT_EXE
..
这个问题因过于宽泛而被搁置,大概是因为我为了“展示我的工作"而不是提出一个不费力的问题而进行的研究.为了解决这个问题,请允许我用一句话总结整个问题(这句话归功于@PeterCordes): 如何从 JITed 代码(我正在生成)中有效地调用 (x86-64) 提前编译的函数(我控制的,可能超过 2GB)? 我怀疑,仅此一项就会因为“过于宽泛"而被搁置.特别是,它缺少“您尝试过什么".所
..
我尝试使用 gcc -S -fasm foo.c 将 c 代码编译为汇编代码.c代码在main函数中声明全局变量和变量如下: int y=6;主函数(){诠释 x=4;x=x+y;返回0;} 现在我查看了从该 C 代码生成的汇编代码,发现全局变量 y 是使用 rip 指令指针的值存储的. 我以为只有 const 全局变量存储在文本段中,但是,看这个例子,似乎常规全局变量也存储在文本段中,
..
我有一些代码在编译时给我重定位错误,下面是一个说明问题的示例: 程序主程序常见/baz/a,b,c真正的 a,b,cb = 0.0调用 foo()打印*, b结尾子程序 foo()常见/baz/a,b,c真正的 a,b,c整数,参数 :: nx = 450整数,参数 :: ny = 144整数,参数 :: nz = 144整数,参数 :: nf = 23*3真实 :: bar(nf,nx*ny
..
我有兴趣在运行 CentOS 并用于(非常)软实时应用程序的 Linux 机器上评估 SMI 处理的行为(延迟、频率). 推荐使用哪些工具(CentOS 的 hwlatdetect?),最好的做法是什么? 如果 CentOS 没有可用的好工具,我是否正确假设安装一个由于底层硬件/bios相同,同一台机器上的不同操作系统应该产生相同的结果? 这些参数是否有大致数据来源. 机器
..
无符号整数 lo = 0;无符号整数 hi = 0;__asm__ __volatile__ (“mfence;rdtsc":“=a"(lo),“=d"(hi)::“内存"); 上面代码中的 mfence,有必要吗? 根据我的测试,没有找到 cpu reorder. 测试代码片段如下. inline uint64_t clock_cycles() {无符号整数 lo = 0;无符
..
我在生活中见过很多核心转储,但这个让我很难过. 上下文: 在 AMD Barcelona CPU 集群上运行的多线程 Linux/x86_64 程序 崩溃的代码被执行了很多 在负载下运行 1000 个程序实例(完全相同的优化二进制文件)每小时会产生 1-2 次崩溃 崩溃发生在不同的机器上(但机器本身非常相似) 所有崩溃看起来都一样(相同的确切地址,相同的调用堆栈) 以下是
..
我正在尝试在 Ubuntu 20.10 上使用 NASM 版本 2.15.04 在 64 位程序集中编写一个简单的堆栈金丝雀.使用命令 nasm -felf64 canary.asm && 进行组装和链接时,执行以下代码会导致分段错误ld canary.o. 全局 _start部分 .text_start: endbr64推 rbp ;保存基指针移动 rbp, rsp ;设置堆栈指针调用 _f
..
为什么会出现分段错误? 我正在使用 nasm -f elf64 t.asm -o t.o ld t.o -o t 在 linux 上编译. 我已经做了所有我能想到的. section .data:variable_int db 1变量字符串数据库“yaaaa",10部分.文本:全局_start_开始:mov rax, 1mov rdi, 1mov rsi, variable_stri
..
我正在尝试在 nasm 中创建一个应该显示字母 a 的简单程序.但是,它给了我一个 Segfault 并说: ./a.out:符号 `printf' 导致 R_X86_64_PC32 重定位中溢出分段错误(核心转储) 基本上,我试图将值 0x61(字母 a 的十六进制)移动到内存地址 1234,然后将其作为参数传递给 printf.这是我的确切代码: extern printf部分 .tex
..
我是 x86 程序集的新手,我正在尝试构建一个 hello world 程序.我正在尝试制作一个子程序,将单个字节写入标准输出,但我遇到了问题. mov ebx, [esp+1] 行(当我调用子例程时加载传递的字节)会导致段错误. 我已尝试将 ebx 寄存器与自身异或,以确保它是空的,以确保它不会与系统调用混淆 _start:推送 32h调用 _writeByte;这只是跳转到退出例
..
我对术语的以下理解是这样的 1) 中断 是由硬件发起的“通知",用于调用操作系统以运行其处理程序 2) 陷阱 是由软件发起的“通知",用于调用操作系统以运行其处理程序 3) 错误 是一个异常,如果发生错误但可以恢复,则由处理器引发 4) 中止 是处理器在发生错误但不可恢复时引发的异常 为什么我们称它为 segmentation fault 而不是 segmen
..
32 位应用程序可执行文件包含 32 位 CPU 的机器代码,但是 32 位和 64 位 Intel CPU 的程序集和内部架构(寄存器数量、寄存器宽度、调用约定)不同,所以如何32 位 exe 在 64 位机器上运行? 维基百科的 x86-64 文章说: x86-64 完全向后兼容 16 位和 32 位 x86 代码.因为完整的 x86 16 位和 32 位指令集仍然在硬件中实现而没
..