是否所有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
相关产品推荐
相关产品推荐

