You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在x86_64汇编中实现无系统调用的usleep?

实现无系统调用的x86_64汇编my_usleep函数

因为不能调用系统调用,我们只能用**忙等待(busy-wait)**的方式——通过空循环消耗CPU周期来模拟延时。这种方式精度依赖CPU性能,但适合汇编入门练习。

C声明

extern void my_usleep(int);

x86_64汇编实现(System V调用约定)

my_usleep:
    ; 保存非易失性寄存器rbx(调用约定要求保留其值)
    push rbx
    ; 将传入的微秒数(rdi)转换为循环次数:假设单循环约1ns
    mov rbx, rdi        ; 把参数存入rbx
    imul rbx, 1000      ; 微秒转ns级循环次数(1微秒=1000ns)
.wait_loop:
    dec rbx             ; 循环计数减1
    jnz .wait_loop      ; 计数不为0则继续循环
    ; 恢复rbx寄存器
    pop rbx
    ret

代码说明

  1. 寄存器保存:x86_64 System V调用约定中,rbx属于非易失性寄存器,函数执行完毕后必须保持原值,所以先压入栈保存,结束前弹出恢复。
  2. 参数处理:函数的第一个int参数存在rdi寄存器中,我们将其转移到rbx后乘以1000,把微秒单位转换成对应的循环次数(假设每次dec+jnz循环消耗约1ns,这个数值需要根据你的CPU实际性能调整)。
  3. 忙等待循环:通过dec和jnz指令构成空循环,直到循环计数归0,完成延时。

注意事项

  • 忙等待会完全占用当前CPU核心,不要在生产环境使用。
  • 延时精度受CPU主频、指令执行速度影响,不同机器上实际延时会有偏差,需根据情况调整乘数(比如如果参数是毫秒,就把乘数改成1000000)。

内容的提问来源于stack exchange,提问作者weyh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19