相关疑难解决方法(0)

如何将Linux 32位gcc内联汇编转换为64位代码?

我正在尝试使用gcc在Linux 中将RR0D Rasta Ring 0调试器从32位模式转换为64位模式(长模式).我熟悉x86 32位程序集(在MS-DOS环境中),但我是x86 64位程序集和Linux程序集编程的初学者.

这个项目是供生产使用的(我需要一个可用的非源调试器),但我也尝试学习如何进行32位到64位的转换.如果可能的话,我试图找到一种通用的方法来进行32位到64位的转换,可以使用正则表达式在任何32位程序上完成(这样它就可以自动化).我知道没有通用的解决方案(64位代码可能占用比32位代码更多的空间等,并且消耗更多的堆栈等),但即使在这种情况下,自动转换的代码也可以作为起点.

我们的想法是保持8位和16位操作数不变,并用64位操作数替换32位操作数.如果pushw %ax; pushw %bx; popl %ecx替换为这种方法自然会失败pushw %ax; pushw %bx; popq %rcx,但是性能良好的程序通常不会有push两个16位操作数,而是pop一个32位操作数,或者它们呢?

这些是到目前为止的转换:

编辑:修复:pusha/ pushad 可以用连续的push'es 替换,因为pusha/ pushad命令在实际推送之前推送sp/ 的值,并且在286+中以相同的方式工作,但在8088/8086 汇编语言数据库中有所不同.这种差异不是问题(对于386+代码).并且因此可以与连续的替换命令.esp sppush sppushapushadpush

替代方法与OpenSolaris的privregs.h代码类似.

编辑:修复:对所有命令使用64位内存寻址.

  1. pusha- > push %ax; push %cx; push %dx; push %bx; push %sp; push %bp; push …

linux assembly gcc x86-64 inline-assembly

11
推荐指数
0
解决办法
2770
查看次数

标签 统计

assembly ×1

gcc ×1

inline-assembly ×1

linux ×1

x86-64 ×1