x86-64相关内容
这是我第一次尝试用汇编编程.我使用的是 64 位 Mac 操作系统.我也在使用 NASM.我已经四处寻找解决方案,但找不到任何适用于我的机器的东西. 谁能帮我解决这个问题?这是代码和错误,谢谢! hello.asm 全局开始部分 .text开始:mov rax, 1mov rdi, 1mov rsi, 消息mov rdx, 13系统调用移动 eax, 60xor rdi, rdi系
..
如果我编译这个程序: #include int main(int argc, char** argv) {printf("你好世界!\n");返回0;} 对于 x86-64,asm 输出使用 movl $.LC0, %edi/call puts.(在 Godbolt 上查看完整的 asm 输出/编译选项.) 我的问题是:GCC 如何知道字符串的地址可以放入 32 位立即
..
我正在尝试在 ASM 中创建一个共享库 (*.so),但我不确定我是否正确... 我的代码是: .section .data.globl var1变量1:.quad 0x012345.section .text.globl 函数1功能1:xor %rax, %rax# mov var1, %rcx # 这是注释掉的ret 要编译它,我运行 gcc ker.s -g -fPIC -m6
..
我无法找到一种方法来比较 x86 汇编代码中的正数和负数. 例如:当我比较 -1 和 1 时,我总是得到 -1 更大.我知道这是因为 2 的补码格式使基础二进制中的 -1 大于 1. 但是任何人都可以提供 x86 程序集的片段来比较正数和负数并使其在数学上正确吗?(例如 1 > -1) 谢谢! 解决方案 您可能使用了以下无符号变体之一: cmp eax, ebxjb较小
..
在 64 位版本的 Windows 中,32 位软件安装在“c:\program files (x86)"中.这意味着您不能使用 $(programfiles) 来获取(32 位)软件的路径.所以我需要一个 $(ProgramFiles32) 在我的 MSBuild 项目中克服这个问题.我不想根据运行的操作系统更改项目. 我将发布一个解决方案,但也许有更简单/更好的方法. 解决方案
..
我已经使用 Java 有一段时间了,我设置新开发机器的典型习惯要求从 Oracle 的站点下载和安装最新的 JDK. 今天提出了一个不寻常的问题,我使用 32 位或 64 位 JRE 包有关系吗? 回想起来,我之前已经安装了这两个版本,并且我的普通工具链愉快地插入 (Eclipse).在我的日常编程中,我不记得曾经因为我使用 64 位 JRE(或在这方面针对 64 位 JRE)而不得不
..
x86 汇编语言不得不改变,因为 x86 处理器架构已经从 8 位变为 16 位,再到 32 位和现在的 64 位. 我知道在 32 位汇编寄存器名称(EAX、EBX 等)中,每个名称的前缀 E 代表 Extended 表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等).). 这些寄存器名称的 R 前缀在 64 位中代表什么? 解决方案 我认为它只是 R 代表“寄
..
我最近正在构建一个针对 x86-64 架构的共享库 (ELF),如下所示: g++ -o binary.so -shared --no-undefined ... -lfoo -lbar 由于以下错误而失败: 重新定位R_X86_64_32针对`a local symbol'不能在制作共享对象时使用;用 -fPIC 重新编译 当然,这意味着我需要将其重新构建为与位置无关的代码,因此
..
我最近开始使用 YASM 为 Intel x86-64 架构学习汇编语言.在解决一本书(Ray Seyfarth 着)中建议的一项任务时,我遇到了以下问题: 当我将一些字符放入 .bss 部分的缓冲区中时,我在 gdb 中调试它时仍然看到一个空字符串.将字符放入 .data 部分的缓冲区中会在 gdb 中按预期显示. segment .bss结果 resb 75缓冲恢复 100使用请求 1
..
我正在将 SSE2 移植到 NEON.该端口处于早期阶段,并且产生不正确的结果.结果不正确的部分原因是 _mm_shuffle_epi32 和我选择的 NEON 指令. _mm_shuffle_epi32 的文档来自 微软.Intel 文档更好,但我不清楚一些伪代码在做什么. SELECT4(src, control){案例(控制[1:0])0: tmp[31:0] := src[31:0
..
由于 Spectre 缓解而对所有当前 CPU 禁用硬件锁定消除是否正确,并且任何尝试使用 HLE 内在函数/指令进行互斥都会导致通常的互斥? 未来是否有可能不会有类似 HLE 互斥的东西来避免像 Spectre 这样的漏洞? 解决方案 因此,禁用 TSX 可能不是为了缓解 Spectre,而是作为另一个漏洞缓解的一部分,TSX 异步中止 (TAA). 这是英特尔网站上的相关文
..
在哪里可以找到 i386 和 i386 之间数据类型的所有差异?AMD64 应用程序二进制接口 (ABI) ? 我知道在 i386 ABI & 中 long 类型是 32 位的64 位 AMD64.这是正确的吗? 解决方案 我建议你下载 Dr Agner Fog 的优化手册.他有一本专门介绍 ABI 及其差异的手册. 对于 32 位模式和 64 位模式之间指令集的差异,Inte
..
这个问题专门针对现代 x86-64 缓存一致性架构 - 我很欣赏其他 CPU 上的答案可能会有所不同. 如果我写入内存,MESI 协议要求先将缓存行读入缓存,然后在缓存中修改(将值写入缓存行,然后将其标记为脏).在较旧的 write-though 微架构中,这将触发缓存线被刷新,在回写下,被刷新的缓存线可能会延迟一段时间,并且在两种机制下都可能发生一些写组合(更可能是写回).而且我知道这如何
..
我正在 Linux x86_64 上试验 ELF 可执行文件和 gnu 工具链: 我已经链接并(手动)剥离了一个“Hello World"测试: .global _start.文本_开始:移动 $1, %rax... 转换为 267 字节的 ELF64 可执行文件... 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF…………
..
关于 RDTSC 指令的英特尔手册警告说乱序执行RDTSC 实际执行时可以改变,所以他们建议在它前面插入一条 CPUID 指令,因为 CPUID 会序列化指令流(CPUID 永远不会乱序执行).我的问题很简单:如果他们有能力使指令序列化,他们为什么不进行 RDTSC 序列化?它的全部意义似乎是获得周期准确的计时.是否存在您不想想在它前面加上序列化指令的情况? 较新的 Intel CPU 有一
..
我正在用 C++ 做一些性能关键的工作,我们目前正在使用整数计算来解决固有的浮点问题,因为“它更快".这会导致一大堆烦人的问题,并添加了很多烦人的代码. 现在,我记得读过关于浮点计算在大约 386 天左右如此缓慢的文章,我相信 (IIRC) 有一个可选的协处理器.但是现在可以肯定的是,随着 CPU 的复杂性和功能呈指数级增长,如果进行浮点计算或整数计算,它的“速度"没有区别吗?特别是因为与导
..
我尝试在 nasm 中编写简单的内核模块 (v3.6),但是 insmod 说我: $ sudo insmod ./hello.koinsmod:错误:无法插入模块 ./hello.ko:模块格式无效$回声 $?1 我编译我的代码: $ nasm -f elf64 -o hello.m hello.asm$ ld -m elf_x86_64 -r -o hello.ko hello.m 和
..
我对 Linux 内核头文件之一中的注释感到有些困惑,arch/x86/include/asm/nops.h.它指出 以下指令不是 64 位模式下的 nops,对于 64 位模式,请改用 K8 或 P6 nops movl %esi,%esi leal 0x00(%esi),%esi 我猜作者在那里暗示了机器指令(分别是“89 F6"和“8D 76 00"
..
我试图找出 Linux 内核中 MACRO current 的详细信息.当前的最终汇编代码为: movq %%gs:0xb000,%0 上面的代码可以工作!但是当我打印 %%gs 时,它的值为 0,所以 %%gs 指向 GDT NULL 的第一项!!??它是如何工作的? mov %%gs, %0 相反,gs 的基数在 MSR_GS_BASE 中,当前可以像这样替换: /*0xb000 是
..
我需要以编程方式确定程序集是 x86、x64 还是 AnyCPU?有一个几乎相同的 问题,但它提供的解决方案 Assembly assembly = Assembly.LoadFrom(fileName);PortableExecutableKinds peKind;ImageFileMachine imageFileMachine;assembly.ManifestModule.GetPEKi
..