我有一个用 ARM 汇编器编写的简单函数。第一次运行时,一切都按预期工作(打印BOOT\n)。然而,第二次执行该函数时,没有打印任何内容。
.globl __printTest
.text
.align 2
__printTest:
sub sp, #64 /* yes, I know this is too much */
mov r0, #66
str r0, [sp]
mov r0, #79
str r0, [sp, #1]
mov r0, #79
str r0, [sp, #2]
mov r0, #84
str r0, [sp, #3]
mov r0, #10
str r0, [sp, #4]
mov r0, #0
mov r1, sp
mov r2, #5
bl _write
add sp, #64
bx lr
Run Code Online (Sandbox Code Playgroud)
可能是什么问题?我怀疑这不知何故搞砸了缓冲区,使它不再起作用。Write是一个write使用指令调用Linux上系统调用的函数svc。
我想知道 Neon 如何处理溢出。例如:
uint8x8_t vadd_u8 (uint8x8_t, uint8x8_t)
Run Code Online (Sandbox Code Playgroud)
据我了解,这是 2 个向量的加法(每个向量有 8 个无符号字节元素)。假设两个向量的所有值都是 255。
在这种情况下我们应该期待什么结果?8 元素向量 (510,...510) 还是其他向量?
在过去的两天里,我一直在为上述 ARM Cortex M3 寻找一个简单的调度程序,尽管我找到了一些 RTOS 解决方案,但我没有找到独立的任务调度程序。
我不需要任何太花哨的东西,因为我的应用程序不一定需要它,但它将有助于产品的未来证明(不要激怒最后这句话,我很清楚它的问题)。
编辑:
正如@Clifford 所建议的,我不太清楚简单是什么意思。我想说它的代码非常少,并且不会消耗太多 SRAM。
我必须问它......它已经让我发疯好几天了。选择arm-none-eabi作为工具链后,我的生活变成了一场噩梦,原因很简单-arm-none-eabi-as将每条评论视为指令,而且有时它只是不理解ARM汇编器抛出奇特的错误,例如“AREA 是一条错误的指令”...
这是我从 keil 文档中复制并粘贴的代码:
AREA Loadcon, CODE, READONLY
ENTRY ; Mark first instruction to execute
start
BL func1 ; Branch to first subroutine
BL func2 ; Branch to second subroutine
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
func1
LDR r0, =42 ; => MOV R0, #42
LDR r1, =0x55555555 ; => LDR R1, [PC, #offset to
; Literal Pool 1]
LDR r2, =0xFFFFFFFF ; => MVN R2, #0 …Run Code Online (Sandbox Code Playgroud) 根据http://lxr.free-electrons.com/source/arch/arm/include/asm/atomic.h#L31
static inline void atomic_add(int i, atomic_t *v)
41 {
42 unsigned long tmp;
43 int result;
44
45 prefetchw(&v->counter);
46 __asm__ __volatile__("@ atomic_add\n"
47 "1: ldrex %0, [%3]\n"
48 " add %0, %0, %4\n"
49 " strex %1, %0, [%3]\n"
50 " teq %1, #0\n"
51 " bne 1b"
52 : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
53 : "r" (&v->counter), "Ir" (i)
54 : "cc");
55 }
Run Code Online (Sandbox Code Playgroud)
可以抢占,怎么能叫“原子”呢?
arm atomic inline-assembly linux-kernel load-link-store-conditional
我正在用C 语言编写嵌入式 ARM 处理器的程序。我想在日志语句中查看源文件名和行号。
由于编译的代码不了解行号和源文件,因此我正在寻找在编译过程之前/期间自动插入的方法。
是否有任何标准工具或编译器功能可供我使用?
我正在使用海湾合作委员会。
例如:
这就是我要在源文件中写入的内容:
log("<#filename#> <#linenumber#> : Hello World");
Run Code Online (Sandbox Code Playgroud)
这是实际编译的内容:
log("Foobar.c 225 : Hello World");
Run Code Online (Sandbox Code Playgroud) 我在我的 beaglebone black 上下载并安装了适用于 ARM 的 JDK8u33,并且根据此文档(http://docs.oracle.com/javase/8/embedded/jdk-arm-8u6/index.html)包含并支持 javafx。
但是,我在 JRE 或 JDK 中找不到 jfxrt.jar,并且在简单的 javafx 程序上使用 javac 生成的“javafx.application”不是一个包。
是什么赋予了?
我有一个 C 代码,它调用 ARM Assembly 中定义的函数。必须传递两个参数。
如果函数调用如下所示:
functionName(a, b)
Run Code Online (Sandbox Code Playgroud)
寄存器x0并按x1什么顺序保存这些值?是x0一直持有a还是一直x1持有b,还是相反?
这是一个简单的 NASM 64 位 linux 汇编程序:
_exit:
mov rax, 60
mov rdi, 0
syscall
Run Code Online (Sandbox Code Playgroud)
我的电脑是 AMD(x86_64 64 位),我知道这个汇编程序也可以在 INTEL 64 位处理器上运行。
但我有以下这些问题!
我想知道是否有人可以向我解释汇编 ARM 中堆栈指针和帧指针之间的区别