Syn*_*ror 6 c++ x86 assembly g++ x86-64
我正在编写一个简单的C++程序,其中包含一些asm指令.
void call(){
__asm__("mov -0x10(%rbp),%eax;"
"add $0x10,%eax;"
"mov %eax,%edx;"
"shr $0x1f,%edx;"
"add %edx,%eax;"
"sar %eax;"
"add %eax,-0x4(%rbp);"
"mov $0x4c,%eax;"
"mov -0x8(%rbp),%eax;"
"add %eax,%eax;"
"sub -0x4(%rbp),%eax;"
"add %eax,-0xc(%rbp);");
}
Run Code Online (Sandbox Code Playgroud)
但是,从执行行为中我意识到由此asm主体操纵的寄存器实际上是由函数中的其他变量使用的.
反正有没有调用编译器隔离asm标签中使用的寄存器并确保它们不受影响?
操作系统:Linux编译器:G ++
非编译方法也受欢迎
作为一种非编译器方法:您可以使用pusha/popa指令在执行您自己的程序集之前将所有寄存器推送到堆栈,然后弹出所有寄存器。
代码示例:
void callOne(){
__asm__(
"pusha;"
"mov -0x10(%rbp),%eax;"
"add $0x10,%eax;"
"mov %eax,%edx;"
"shr $0x1f,%edx;"
"add %edx,%eax;"
"sar %eax;"
"add %eax,-0x4(%rbp);"
"mov $0x4c,%eax;"
"mov -0x8(%rbp),%eax;"
"add %eax,%eax;"
"sub -0x4(%rbp),%eax;"
"add %eax,-0xc(%rbp);"
"popa;");
}
Run Code Online (Sandbox Code Playgroud)