我是一名 Java 开发人员。我有一些 C++ 代码来进行一些系统相关调用。这段代码是使用 GCC 在 Intel 32 位平台上编译的(我有 make 文件),它在基于 Intel 的常规 32 位 linux 机器上运行良好。现在我需要在 Marvell ARM 处理器上运行的 linux 操作系统上运行它。当我在 java 中加载共享对象时,出现以下错误。
无法打开共享对象文件:没有这样的文件或目录(可能的原因:无法在 ARM 位平台上加载 IA 32 位 .so)
请告诉我如何解决这个问题。我查看了 GCC 选项,我找到了一个指定架构的选项(-march=armv5),但我无法使用该选项进行编译。
提前致谢。
我一直试图在ARM M0 +处理器的汇编中进行一些简单的操作.
到目前为止,我失败了.
我想分配两个变量,a&b到一些值,3和8,然后我想将一个变量设置为另一个的值.
在任何更高级别的语言我只需要
int a = 3;
int b = 8;
b = a;
Run Code Online (Sandbox Code Playgroud)
到目前为止,在汇编中我想出了如何分配和设置变量.
a DCD 3
b DCD 8
Run Code Online (Sandbox Code Playgroud)
我想出了如何获得变量的值和地址
LDR r0, =a ; r0 = &a
LDR r0, [r0] ; r0 = a
Run Code Online (Sandbox Code Playgroud)
这就是我陷入困境的地方,我如何将r0的值存储到变量b中?
我试着为stm32f334做一些例子(只是led闪烁).当我想使用.data部分约束时(通过使用初始化的全局变量),我遇到了链接器的问题我遇到了问题.全局变量的值不正确!
这是我的代码:
startup.s:
.global _start
.thumb_func
_start:
.word 0x20003000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
bl main
b hang
.thumb_func
hang: b .
Run Code Online (Sandbox Code Playgroud)
blink.c:
#define RCCBASE 0x40021000
#define GPIOBBASE 0x48000400
static int wymuszenie_bss;
int wymuszenie_data = GPIOBBASE;
int main ( void )
{
unsigned int* ptr;
wymuszenie_bss = 0x40021000;
ptr = (unsigned …Run Code Online (Sandbox Code Playgroud) 当我遇到MOVZ时,我正在使用反汇编程序,这有点困惑,因为我以前只使用过MOV。
当然,ARMv8 ISA手册解释了所有详细信息,并且MOV是其他三个别名的别名,具体取决于上下文,但是也许有人可以在此处提供一些基本原理,并提供具体示例以加快学习过程。
在我继承自同事的项目中,我有基本的c ++类,带有头和实现.为了便于理解,我将提供示例情况,因为代码本身太大了: bthidtransport.h:
class BtHidTransport
{
public:
BtHidTransport(); // constructor
protected:
virtual ~BtHidTransport(); // destructor
} // BtHidTransport
Run Code Online (Sandbox Code Playgroud)
bthidtransport.cpp:
BtHidTransport::BtHidTransport
{
} // constructor
BtHidTransport::~BtHidTransport()
{
} // destructor
Run Code Online (Sandbox Code Playgroud)
这是基类,现在我们有了派生类头:
bthidtransportfixes.h:
#include "bthidtransport.h"
class BtHidTransportFixes : public BtHidTransport
{
BtHidTransportFixes(); // constructor
virtual ~BtHidTransportFixes(); // destructor
} // BtHidTransportFixes
Run Code Online (Sandbox Code Playgroud)
但是,在特定项目中,BtHidTransportFixes没有实现(.cpp)文件.项目本身构建没有错误.如果我在运行时从类实例化新对象:
BtHidTransport* createdObject=new BtHidTransportFixes();
Run Code Online (Sandbox Code Playgroud)
和BtHidTransportFixes没有实现(.cpp)文件,父类的执行顺序是什么?我正在使用Eclipse 4.3.2 for Windows(主机操作系统是Windows 7 64位Ultimate)和ARM DS-5 5.20.2编译器.BtHidTransportFixes项目中没有任何实现,我在 …
STM32芯片(以及许多其他芯片)具有硬件随机数发生器(RNG),它比libc提供的软件RNG更快,更可靠。编译器对硬件一无所知。
rand()?还有其他硬件模块,即实时时钟(RTC),可以为提供数据time()。
我已经.so使用retdec反编译了一个文件(来自Android应用程序中的ARM库),并且在代码中可以找到类似的指令:
int32_t a = `some value`;
int32_t b = `another value`;
*(int32_t *)(a + 4) = b;
Run Code Online (Sandbox Code Playgroud)
由于以任何值运行此命令都会在编译时产生警告,并且在运行时出现分段错误,因此我不确定它的实际作用。
在uint64_t和long的混合上使用算术会在arm(C ++编译器)上产生不需要的结果。相同的代码可以在x86上正常工作。
如果将long替换为uint64_t,则它将按预期工作。
Armv7编译器是C ++(Debian 6.3.0-18 + deb9u1)6.3.0 20170516
这里的代码也:http : //cpp.sh/2xrnu
int main()
{
uint64_t x = 1000UL * 60 * 60 * 24 * 31;
int i1 = 31;
long l2 = 1000 * 60 * 60 * 24;
uint64_t u2 = 1000 * 60 * 60 * 24;
std::cout << "x : " << x << std::endl;
std::cout << "i1 : " << i1 << std::endl;
std::cout << "l2 : " << l2 << std::endl;
std::cout …Run Code Online (Sandbox Code Playgroud) 据我所知,返回的退出代码r0仅使用该寄存器的最低8位。如何返回高于8位的值?
这是ARMv7代码:
@ looping.s
@ calculates sum of integers from 1 to 100
.text
.balign 4
.global main
main:
MOV r1, #0 @ r1 = 0 as sum
MOV r2, #0 @ r2 = 0 as counter
loop:
ADD r2, r2, #1 @ counter = counter + 1
ADD r1, r1, r2 @ sum = sum + counter
CMP r2, #100 @ counter - 100
BLT loop @ if counter < 100 go to start of loop
MOV …Run Code Online (Sandbox Code Playgroud) 我在尝试为armeabi-v7a编译的某些ARM代码中遇到此错误-显然是v7a之前的东西。
jni/6502asm_arm.S:108:2: error: invalid instruction, did you mean: strexh, strh?
streqh r1,[ r4, #28]
Run Code Online (Sandbox Code Playgroud)
我上次编写ARM程序集的程序是在Archimedes上的ARM3,但很明显这streqh是一个半字存储等于。
我完全被它引起的错误消息困扰:什么时候所有指令都停止在ARM中成为条件指令?那样令我伤心。(我对Thumb有所了解,但我认为这不是Thumb代码。)
我收集的ex意思是“排他”,需要我获得某种锁定-此应用程序是Android的BBC模拟器,不太可能同时模拟两个6502,因此我认为我可以,strh但是该怎么做我该eq怎么办?
我需要使用“ if then else”拇指指令,还是用“ bne或” 跳过它?我认为整个“一切都有条件”的想法对ARM至关重要。
(虽然我在写,但我怀疑我需要将此代码设为PIC,并且在源代码的末尾有一个表的绝对引用,这些函数实现了6502指令。我想相对于PC的寻址仍然由于管道长度而复杂?我可能会遇到的所有ARM风格的偏移量都一样吗?还是3个字吗?
提前致谢!