gpt4 book ai didi

assembly - ASM : lock cmpxchg dest, src 中存在非法指令

转载 作者:行者123 更新时间:2023-12-03 06:21:36 25 4
gpt4 key购买 nike

我一直在摆弄一些 x86 程序集,因为它出现在我的许多类(class)中。特别是,我想将比较和交换(CAS)公开为用户函数。这是为了我可以实现自己的锁。

我在 Intel CPU 上使用 Linux 2.6.31 和 GCC 4.1.1。

我有以下内容:

// int cmpxchg(int *dest, int expected, int update)
.globl cmpxchg
cmpxchg:
pushl %ebp
movl %esp, %ebp

// edx holds dest
movl 8(%ebp), %edx
// eax holds expected value
movl 12(%ebp), %eax
// ecx holds the new value
movl 16(%ebp), %ecx

// cmpxchg dest_addr, exp_value
// compare to %eax is implicit
lock cmpxchgl %edx, %ecx

leave
ret

这是一个 *.s 文件,我用我的驱动程序编译该文件。当我包含该行时

  lock cmpxchgl %edx, %ecx

并执行,我收到“非法指令”错误。当我用

替换该行时
  cmpxchgl %edx, %ecx

我的代码似乎运行良好。

首先,有必要吗?我不确定 cmpxchgl 是否本质上是原子的,所以我使用了 lock 来确定。作为一个用户态程序,我是否可以使用lock

谢谢

================================================== =================

我的最终代码(对于那些将来可能会在这里徘徊的人):

// int cmpxchg(int *dest, int expected, int update)
.globl cmpxchg
cmpxchg:
pushl %ebp
movl %esp, %ebp

// edx holds dest, use eDx for Destination ;-)
movl 8(%ebp), %edx
// eax holds expected value implicitly
movl 12(%ebp), %eax

// cmpxchg dest_add, src_value
lock cmpxchgl %edx, 16(%ebp)

leave
ret

最佳答案

您需要cmpxchgl %edx, (%ecx)

除非目标是内存操作数,否则此操作没有意义,但该指令允许寄存器目标。如果指令使用寄存器模式,CPU会出错。

我试过了,你的代码可以使用内存操作数。我不知道您是否意识到这一点,但是这个序列(带有寄存器目的地)有一个流行的名称:“f00fc7c8 bug”或“the F00F bug”。在奔腾时代,这是一个“HCF”(停止并着火)或“ killer 戳”指令,因为它会生成一个异常,然后由于总线被锁定而无法提供服务,并且可以从用户调用模式。我认为可能存在操作系统级软件解决方法。

关于assembly - ASM : lock cmpxchg dest, src 中存在非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com