assembly相关内容

汇编中系统调用的返回值是什么?

当我尝试研究内核系统调用的返回值时,我找到了描述它们的表,以及我需要在不同的寄存器中放入什么才能让它们工作.但是,我没有找到任何说明什么是我从系统调用中获得的返回值的文档.我只是在不同的地方发现我收到的将在 EAX 寄存器中. 教程要点: 结果通常在 EAX 寄存器中返回. Assembly Language Step-By-Step: Programming with Linu ..
发布时间:2021-12-03 13:42:55 服务器开发

使用 GNU 汇编程序在 x86_64 中调用 printf

我已经使用 AT&T 语法编写了一个用于 GNU 汇编程序的程序: .data格式:.ascii "%d\n".文本.global 主主要的:mov $格式,%rbx移动 (%rbx), %rdi移动 $1, %rsi调用 printf退 我使用 GCC 来组装和链接: gcc -o main main.s 我用这个命令运行它: ./main 当我运行程序时,我遇到了 ..
发布时间:2021-12-03 13:41:51 服务器开发

如何使用十六进制编辑器在 Linux 中制作可执行的 ELF 文件?

只是好奇.这显然不是实际编程的一个很好的解决方案,但假设我想在 Bless(一个十六进制编辑器)中制作一个可执行文件. 我的架构是 x86.我可以制作什么非常简单的程序?你好世界?无限循环?类似于这个问题,但在Linux中. 解决方案 正如我在评论中提到的,您实际上将为可执行文件编写自己的 elf-header,以消除不需要的部分.还有几个必需的部分.Muppetlabs-TinyP ..
发布时间:2021-12-03 13:41:14 服务器开发

当项目中包含程序集文件时,来自 mmap 的意外执行权限

我正用这个头撞墙. 在我的项目中,当我使用 mmap 分配内存时,映射 (/proc/self/maps) 显示它是一个可读且可执行的区域 尽管我只要求可读内存. 在研究了 strace(看起来不错)和其他调试之后,我能够确定似乎可以避免这个奇怪问题的唯一方法:从项目中删除程序集文件并只留下纯 C.(什么?!) 这是我奇怪的例子,我正在使用 Ubunbtu 19.04 和默认的 ..
发布时间:2021-12-03 13:36:15 服务器开发

_start 中 RET 上的 Nasm 分段错误

section .text全局_start_开始:没有主要的:移动轴,1mov ebx, 2异或 eax, eax退 我用这些命令编译: nasm -f elf main.asmld -melf_i386 -o main main.o 当我运行代码时,Linux抛出一个segmentation fault错误 (我使用的是 Linux Mint Nadia 64 位).为什么会产生这个 ..
发布时间:2021-12-03 13:21:28 服务器开发

如果汇编程序中没有退出系统调用会发生什么?

在汇编程序中,.text 部分在0x08048000 处加载;.data 和 .bss 部分紧随其后. 如果我不将 exit 系统调用放在 .text 部分会发生什么?是否会导致 .data 和 .bss 部分被解释为导致“不可预测"的代码?行为?程序何时终止——可能在每个“指令"之后?执行了吗? 我可以在没有 exit 系统调用的情况下轻松编写程序,但我不会测试 .data 和 .b ..
发布时间:2021-12-03 13:21:20 服务器开发

为什么 x86-64 Linux 系统调用会修改 RCX,该值是什么意思?

我正在尝试使用 sys_brk 系统调用在 linux 中分配一些内存.这是我尝试过的: BYTES_TO_ALLOCATE equ 0x08节.text全局_start_开始:mov rax, 12mov rdi, BYTES_TO_ALLOCATE系统调用mov rax, 60系统调用 事情是按照 linux 调用约定我期望返回值在 rax 寄存器(指向分配的内存的指针)中.我在 gdb ..
发布时间:2021-12-03 13:17:10 服务器开发

如何在程序集 NASM 中打印数字?

假设我在寄存器中有一个整数,我如何打印它?你能展示一个简单的示例代码吗? 我已经知道如何打印诸如“hello, world"之类的字符串. 我正在 Linux 上开发. 解决方案 如果您已经在使用 Linux,则无需自己进行转换.只需使用 printf 代替: ;;组装和链接:;nasm -f elf printf-test.asm &&gcc -m32 -o printf- ..
发布时间:2021-12-03 13:10:49 服务器开发

x86 上交换锁与比较交换锁的相对性能

两种常见的锁定习惯用法是: if (!atomic_swap(lockaddr, 1))/* 得到了锁 */ 和: if (!atomic_compare_and_swap(lockaddr, 0, val))/* 得到锁 */ 其中 val 可以只是一个常量或新的潜在锁所有者的标识符. 我想知道的是,两者在 x86(和 x86_64)机器上是否存在明显的性能差异.我知道这是一个相当 ..
发布时间:2021-11-30 14:56:36 其他开发

正在运行时中断汇编指令

当中断到达 CPU 时,如果它被确认,则通过在跳转到处理程序之前保存当前地址位置来处理它.否则将被忽略. 我想知道汇编指令调用是否被中断. 例如 mvi a, 03h ;将 3 值放入 acc.在 8080 组装 单行指令可以中断吗?或者如果不是,它是原子的?? 是否总能保证“一行汇编指令"总是原子的?? 如果没有“lock"关键字,即在 8080 程序集中,那么原子性 ..
发布时间:2021-11-30 14:55:31 其他开发

为什么x86的INC指令不是原子的?

我读过 x86 的 INC 指令不是原子的.我的问题是怎么来的?假设我们在 x86-64 上递增一个 64 位整数,我们可以用一条指令来完成,因为 INC 指令适用于内存变量和寄存器.那么为什么它不是原子的? 解决方案 为什么会这样?处理器内核仍然需要读取存储在内存位置的值,计算它的增量,然后将其存储回来.读取和存储之间存在延迟,同时另一个操作可能会影响该内存位置. 即使出现乱序执行 ..
发布时间:2021-11-30 14:51:54 其他开发

在 x86/x86_64 处理器上使用 LFENCE 指令有意义吗?

通常在互联网上,我发现 LFENCE 在 x86 处理器中毫无意义,即它什么也不做,因此我们可以完全轻松地使用 SFENCE,因为 MFENCE = SFENCE + LFENCE = SFENCE + NOP =SFENCE. 但是如果 LFENCE 没有意义,那么为什么我们有四种方法可以在 x86/x86_64 中实现顺序一致性: LOAD(无围栏)和 STORE + MFENCE ..
发布时间:2021-11-30 14:48:06 其他开发

英特尔内存模型是否使 SFENCE 和 LFENCE 变得多余?

英特尔内存模型保证: 商店不会与其他商店重新订购 负载不会与其他负载重新排序 http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ 我看到有人声称由于 Intel 内存模型,SFENCE 在 x86-64 上是多余的,但从来没有 LFENCE.上述内存模型规则是否使任一指令变得多余? ..
发布时间:2021-11-30 14:45:40 其他开发

REP 做什么设置?

引用英特尔® 64 和 IA-32 架构优化参考手册,第 2.4.6 节“REP 字符串增强": 使用 REP 字符串的性能特征可归因于两个组成部分:启动开销和数据传输吞吐量. [...] 对于较大粒度数据传输的REP字符串,作为ECX值增加,REP String 的启动开销呈阶梯式增加: 短字符串(ECX 20 个周期, 快速字符串(ECX >= 76:不包括 RE ..
发布时间:2021-11-30 11:17:38 其他开发

lock xchg 是否与 mfence 具有相同的行为?

我想知道的是,从一个线程访问正在发生变异的内存位置的角度来看,lock xchg 是否会具有与 mfence 类似的行为(让我们说随机)由其他线程.它能保证我获得最新的价值吗?之后的内存读/写指令? 我困惑的原因是: 8.2.2“不能使用 I/O 指令、锁定指令或序列化指令重新排序读取或写入." -英特尔 64 位开发人员手册卷.3 这是否适用于跨线程? mfence ..
发布时间:2021-11-30 11:17:28 其他开发

为什么这个函数将 RAX 压入堆栈作为第一个操作?

在下面的 C++ 源代码的汇编中.为什么 RAX 被压入堆栈? RAX,正如我从 ABI 理解的那样,它可以包含来自调用函数的任何内容.但是我们将它保存在这里,然后将堆栈向后移动 8 个字节.所以堆栈上的 RAX,我认为只与 std::__throw_bad_function_call() 操作相关......? 代码:- #include void f(std::functiona ..
发布时间:2021-11-30 11:17:19 C/C++开发

涉及英特尔 SnB 系列 CPU 上的微编码指令的循环的分支对齐

这与此问题相关,但不相同:x86-64 程序集的性能优化 - 对齐和分支预测 与我之前的问题略有关系:无符号64位双转换:为什么这个算法来自g++ 以下是一个非现实世界的测试用例.这种素性测试算法是不明智的.我怀疑任何现实世界的算法永远不会多次执行如此小的内部循环(num 是大小约为 2**50 的素数).在 C++11 中: using nt = unsigned long long; ..
发布时间:2021-11-30 11:17:12 其他开发

`rep ret` 是什么意思?

我在 Visual Studio 2008 上测试了一些代码并注意到 security_cookie.我能理解它的意思,但我不明白这个指令的目的是什么. rep ret/* REP 避免 AMD 分支预测惩罚 */ 当然我能理解评论:) 但是这个前缀在 ret 上下文中做了什么,如果 ecx 是 != 0 会发生什么?显然,当我调试它时,ecx 的循环计数被忽略了,这是意料之中的. 我 ..
发布时间:2021-11-30 11:17:03 其他开发

堆栈分配、填充和对齐

我一直试图更深入地了解编译器如何生成机器代码,更具体地说是 GCC 如何处理堆栈.在这样做的过程中,我一直在编写简单的 C 程序,将它们编译成汇编,并尽我所能理解结果.这是一个简单的程序及其生成的输出: asmtest.c: void main() {字符缓冲区[5];} asmtest.s: pushl %ebpmovl %esp, %ebpsubl $24, %esp离开退 令我 ..
发布时间:2021-11-30 11:16:53 其他开发