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

是否所有MOV指令都可被PUSH/POP指令替代?

汇编中所有MOV指令都能被PUSH/POP替代吗?

结论是:不是所有MOV指令都能被PUSH/POP替代,而且即便部分MOV能被替换,这种实现方式既不实用,效率也远低于直接使用MOV指令。

示例对比:用MOV和PUSH/POP实现printf调用

下面是一段C内嵌汇编代码,分别用MOV和PUSH/POP两种方式完成printf的参数传递与调用,直观展示两者的差异:

#include <stdio.h>

char format_string[] asm("format_string") = "%d %d %d %d %d\n";

void MOV_printf() {
    __asm__ (
        "subq $128, %%rsp\n\t"
        "lea format_string(%%rip), %%rdi\n\t"
        "movq $1, %%rsi\n\t"
        "movq $2, %%rdx\n\t"
        "movq $3, %%rcx\n\t"
        "movq $4, %%r8\n\t"
        "movq $5, %%r9\n\t"
        "call printf\n\t"
        "addq $136, %%rsp\n"
        ::: "rdi", "rsi", "rdx", "rcx", "r8", "r9", "rsp"
    );
}

void PUSH_POP_printf() {
    __asm__ (
        "subq $128, %%rsp\n\t"
        "lea format_string(%%rip), %%rdi\n\t"
        "pushq $1\n\t" 
        "popq %%rsi\n\t"
        "pushq $2\n\t" 
        "popq %%rdx\n\t"
        "pushq $3\n\t" 
        "popq %%rcx\n\t"
        "pushq $4\n\t" 
        "popq %%r8\n\t"
        "pushq $5\n\t" 
        "popq %%r9\n\t"
        "call printf\n\t"
        "addq $136, %%rsp\n"
        ::: "rdi", "rsi", "rdx", "rcx", "r8", "r9", "rsp"
    );
}

int main() {
    MOV_printf();
    PUSH_POP_printf();
    return 0;
}

可替代的MOV场景举例

  • 对于64位立即数到寄存器的传输:MOV r64, imm64 可以用 pushq imm64 + popq r64 替代
  • 对于8位寄存器之间的传输:MOV AH, DL 可以用 push %dl + pop %ah 替代

无法替代的MOV场景

针对**控制寄存器(CR0、CR2等)和调试寄存器(DR0、DR1等)**的MOV操作,无法用PUSH/POP指令替代——因为x86架构中,PUSH/POP指令不支持直接对这类特殊寄存器进行操作,只能通过MOV指令完成读写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:12:46