x86-64相关内容
我有一个适用于64位Linux系统的NASM程序,它可以在标准I/O设备上运行,它看起来是这样的: section .data prompt db "Enter your text: ", 10 length equ $ - prompt text times 255 db 0 textSize equ $ - text section
..
我有一个适用于x86_64的兼容Multiboot2的ELF文件,其中开始符号在start.asm中定义,这是一个NASM程序集文件。Multiboot2标头包含relocatable标记。 由于GRUB不支持Multiboot2+a可重定位ELF(至少在2021年7月[3]),我希望自己解决一些重定位问题以解决此问题,并只加载静态ELF。 为此,我需要在运行时在我的第一个条目符号(在EL
..
问题:movaps出现分段错误。 上下文:x86-64指令vmovaps旨在与Core I系列处理器(我正在运行此系统)上的AVX寄存器一起使用。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应将对齐的浮点值(32位)向量移入指定的ymm寄存器。 可能的原因:源数据的对齐特别重要,因为不正确对齐的数据是分段错误的来源。然而,即使我已经对齐了我的数
..
在64位x86汇编NASM中,如何将单个字节从寄存器移到.data部分定义的内存位置? 我知道这很管用 global _main section .data quotient db 0x0, 0x0, 0x30, 0xa ; 3 digit + newline remainder db 0x0, 0x0, 0x30, 0xa; 3 digit + newline section .
..
NASM手册谈到了这些宏,但就我所见,它并没有真正解释如何使用它们。Section 3.4.6状态: 浮点常量仅可作为DW、DD、DQ、DT和DO的参数,或作为特殊运算符__?float16?__、__?bfloat16?__、__?float32?__、__?float64?__、__?float80m?__、__?float80e?__、__?float128l?__的参数,和__?fl
..
大家好。 所以我正在学习汇编语言。 按照我通常学习的任何新语言的学习步骤,我已经达到了与汇编语言联网的地步。 遗憾的是,这不是很顺利,因为我在步骤0几乎失败了,这将是获得一个套接字,通过它可以开始通信。 汇编代码应大致等于以下C代码: #include #include int main(){ int s
..
我试图将以下C代码转换为汇编语言。以下是C代码: typedef struct { int x; int y; } point; int square_distance( point * p ) { return p->x * p->x + p->y * p->y; } 我的汇编代码如下: square_distance: .LFB23:
..
我正努力想办法在装配中打印双面纸,但我失败得很惨。在调用我自己的函数时,我得到了Segerror,我计划使用该函数作为帮助器来打印双精度值以进行调试。我遵循了这些printf示例:https://www.csee.umbc.edu/portal/help/nasm/sample.shtml 我的代码当前如下所示: section .data formatStrf: db `Th
..
我想要一个 128 位整数,因为我想存储两个 64 位数字相乘的结果.gcc 4.4 及更高版本中有这样的东西吗? 解决方案 128 位整数类型仅在 64 位目标上可用,因此即使您需要检查可用性已经检测到最近的 GCC 版本.理论上 gcc 可以在需要 4 个 32 位寄存器来保存一个的机器上支持 TImode 整数,但我认为在任何情况下都不会. GCC 4.6 及更高版本将 __i
..
..
..
我有一个简单(但性能关键)的 C (嵌入在 C++ 中)算法来操作数据缓冲区......该算法“自然"使用 64 位大端寄存器值 - 我想优化这使用汇编程序来直接访问进位标志和 BSWAP,因此避免了一次操作一个字节的 64 位值. 我希望解决方案能够在操作系统/编译器之间移植——最低限度地支持 GNU g++ 和 Visual C++——以及分别在 Linux 和 Windows 之间移植
..
我正在为 x86_64 编写中断处理例程.ABI 规定,在调用 C 函数之前,我必须将堆栈对齐到 16 个字节.x86_64 ISA 指定在进入 ISR 时,我的堆栈是 8 字节对齐的.因此,我需要将堆栈指针对齐到 16 个字节.问题是从我的 C 函数返回时,我必须恢复(可能)未对齐的堆栈指针,以便我可以正确地从中断中返回. 我想知道是否有办法在不使用通用寄存器的情况下做到这一点? 解
..
刚开始学习 x64 汇编,我有一个关于函数、参数和堆栈的问题.据我了解,函数中的前四个参数被传递给 Windows 中的 rcx、rdx、r8 和 r9 寄存器(以及用于浮点数的 xmm0-xmm3).所以一个简单的有四个参数的加法函数看起来像这样: 添加:mov r10, rcx添加 r10, rdx添加 r10, r8添加 r10, r9mov rax, r10ret 但是,我遇到了 文档
..
..
我有一个简单的 64 位汇编程序,旨在打印一个 'O' 和 'K' 后跟一个换行符. 但是,“K"永远不会被打印出来.程序的目标之一是将 rax 寄存器的低位中的值打印为 ASCII 字母.该程序专为 64 位 Linux 编写,用于教育目的,因此无需使用 C 风格的系统调用. 我怀疑问题出在 mov QWORD [rsp], rax 或 mov rcx, rsp. 目前,程序仅
..
我不要求一个基准. (如果是这样,我会自己做的.) 我的问题: 为了方便,我倾向于避免使用间接/索引寻址模式. 作为替代,我经常使用立即、绝对或寄存器寻址. 代码: ;%esi 有数组地址.假设我们迭代一个双字(4 字节)数组.;%ecx 是数组元素计数(0x98767) 循环:... ; 用 %esi 做任何事添加 $4, %esidec %ecxjnz 0x98
..
在这条指令执行之前,fs包含0x0. 另外我想知道如何从 GDB 中的这个内存区域读取,该命令是什么? 解决方案 Linux 和 Windows 等现代操作系统中的 fs 和 gs 寄存器指向线程特定和其他操作系统定义的结构.修改段寄存器是受保护的指令,所以只有操作系统可以为你设置这些. 这个问题应该有助于解释究竟是什么意思:amd64 fs/gs registers inli
..
..
如何使用 GDB 列出程序中的所有函数? 解决方案 info functions 打印所有已定义函数的名称和数据类型.请参阅16 检查符号表.
..