Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何重写ARMv4t上缺少的较新ARM指令,如CLZNE、PLD等。?_Assembly_Arm - Fatal编程技术网

Assembly 如何重写ARMv4t上缺少的较新ARM指令,如CLZNE、PLD等。?

Assembly 如何重写ARMv4t上缺少的较新ARM指令,如CLZNE、PLD等。?,assembly,arm,Assembly,Arm,我正在尝试使用gcc工具在ARMv4t平台上构建一个大型软件。我试图构建的软件包含一些似乎至少针对ARMv5的汇编代码。这导致汇编代码包含指令,如BLX,CLZNE,PLD,VMRS,VMSR,SMLBB,SMLABB,LDREX,STREXEQ,以及ARMv4t上不支持的其他指令 这显然会导致在生成过程中出现如下错误消息: Error: selected processor does not support ARM mode `[some instruction]' 因此,我尝试为这些指令寻

我正在尝试使用gcc工具在ARMv4t平台上构建一个大型软件。我试图构建的软件包含一些似乎至少针对ARMv5的汇编代码。这导致汇编代码包含指令,如
BLX
CLZNE
PLD
VMRS
VMSR
SMLBB
SMLABB
LDREX
STREXEQ
,以及ARMv4t上不支持的其他指令

这显然会导致在生成过程中出现如下错误消息:

Error: selected processor does not support ARM mode `[some instruction]'
因此,我尝试为这些指令寻找替代方案,以便以一种同样适用于ARMv4t的方式重写它们。虽然我找到了一种方法来重写
blxarg
as
movlr,pc;BL arg
(这是有效的,因为我没有使用Thumb模式,也就是说,我使用
-marm
作为编译器标志)我对其他缺失的指令感到非常困惑


是否有人认为有机会重写给定的指令(最好是使用宏),以便软件也可以构建在ARMv4t上?如果是:如何?

一个好的开始是了解这些说明的作用(请参阅ARM体系结构参考手册)。例如,您的ARMv4部件是否具有NEON或VFP扩展?否则,
VMRS
可能与此无关。它有缓存吗?否则,
PLD
可能与此无关。等等。您只需将
BLX-arg
写成
BL-arg
。它们都将LR设置为以下指令的地址,因此
MOV-LR,pc
没有任何用处。BL和BLX指令之间的唯一区别是后者可以改变模式。Michael在armv4时代,他们甚至没有VFP,这是FPA,无论如何都很少见。如果你想走这条路,那么只需切换到arm模式,然后再回来就容易多了。Ross Ridge,BL和BLX之间的另一个区别是,它们可以在输入的过程中改变模式,而不仅仅是在输出的过程中,你不能从一个手臂切换到另一个手臂,或者从另一个手臂切换到另一个手臂,你必须切换到bx或BLX(或者在某些架构中是pop/ldmia),所以move pc和replace BLX with BL实际上都不能替换BLX,你必须执行一个if lsbit地址(假设您知道您所处的代码模式)然后bl或bxarmv4和armv5非常相似,但随着时间的推移,pop/ldmia如何在arm和thumb之间进行更改仍然存在细微的差异,您真的需要arm,我认为他们现在将原始arm合并在一起(架构参考手册)进入armv6手册,但涵盖了v4 v5和v6,然后在v7中,他们开始了一个新的版本,即armv6+加载/存储独家(
ldrex
/
strex
)可能是最令人担忧的-取决于它们的具体用途,您可能会非常头疼,只需使用
swp
和/或禁用中断即可重写该功能。了解这些指令的作用是一个好的开始(请参阅ARM体系结构参考手册)。例如,您的ARMv4部件是否有NEON或VFP扩展?如果没有,
VMRS
可能不相关。它是否有缓存?如果没有,
PLD
可能不相关。等等。您只需将
BLX arg
写为
BL arg
。它们都将LR设置为以下指令的地址,因此
MOV LR,pc没有做任何有用的事情。BL和BLX指令之间的唯一区别是后者可以改变模式。Michael在armv4时代,他们甚至没有VFP,这是FPA,而且很少见。如果你想走这条路,那么只需切换到arm模式,回来会容易得多。罗斯·里奇,这两者之间的另一个区别是n BL和BLX是指它们可以在输入的过程中改变模式,而不仅仅是在输出的过程中,你不能从一只手臂切换到另一只手臂,或者从另一只手臂切换到另一只手臂,你必须切换到bx或BLX(或者在某些架构中是pop/ldmia),所以move pc和replace BLX with BL实际上都不能替换BLX,你必须执行一个if lsbit地址(假设您知道您所处的代码模式)然后bl或bxarmv4和armv5非常相似,但随着时间的推移,pop/ldmia如何在arm和thumb之间进行更改仍然存在细微的差异,您真的需要arm,我认为他们现在将原始arm合并在一起(架构参考手册)进入armv6手册,但涵盖了v4 v5和v6,然后在v7中,他们开始了一个新的版本,即armv6+加载/存储独家(
ldrex
/
strex
)可能是最令人担忧的-取决于它们的具体用途,您可能会非常头痛,只需使用
swp
和/或禁用中断即可重写该功能。