Tag:

ARM程序集:从STDIN获取字符串

我目前正在参加CS课程,我们刚刚开始在Raspberry Pi上使用ARM Assembly。 它被certificate是相当困难的,并且想知道是否有人可以提供帮助。 我当前的任务是从stdin中取一个字符串(使用scanf)并计算其中的字符数,然后返回该数字(所以基本上实现我自己的strlen)。 我有这个代码的基本想法: .section .rodata promptWord: .ascii “Enter a word: \000” readWord: .ascii “%s\000” printLength: .ascii “Word length is %d characters.\n\000” .section .data .align 2 .comm word,4,4 .text addrword: .word word addrPromptWord: .word promptWord addrReadWord: .word readWord addrPrintLength: .word printLength .global main /* s: r0 */ main: stmfd sp!, {fp, lr} /* […]

压缩结构中的变量可以primefaces读取吗?

我正在为Cortex M0(ARM)CPU编写代码,32位读/写是primefaces的。 现在我想知道我何时读/写8位/ 16位变量,它们是否也保证是primefaces的? 我的直觉是肯定的,因为它们在内部与32位部分对齐,所以CPU不可能需要两个单独的指令来读/写它们。 但是我也碰巧在打包结构中存储了很多变量来节省内存,并且可能变量没有在32位边界上对齐,所以16位值的每一半都可能在不同的部分。 因此,当我使用压缩结构时,我失去primefaces操作是真的吗?

是否有专门设计用于编译1到1的C函数或宏,以及跨平台方式的位操作汇编指令?

我有一个涉及仿真的项目(如果你查看我的post历史,你会看到我到底有多远!)我正在寻找使用C进行伪二进制翻译并使用优化器和/或编译器使用C代码将我的switch语句内容编译为单个汇编指令,主要用于非常标准的指令,如mov s, add , SR和其他简单的位操作和算术指令。 我希望同时为ARM和x86-64这样做,尽可能少地在两个程序集中编写。 如果我所描述的东西不存在,那么我想知道是否有某种“汇编语言”可以用来编写我的代码然后将该汇编编译成x86-64和ARM。

放置在静态库中时找不到_sbrk函数

我正在为stm32f407微控制器创建一个裸机应用程序,该应用程序具有ARM Cortex M4内核。 因此,我正在自己提供像_sbrk这样的函数的实现。 我现在发现,当我尝试创建一个包含_sbrk的静态库,并将它与我的main.c链接到一个应用程序时,链接器说 “C:/progra~2/gnutoo~1/4947e~1.920/bin /../ LIB / GCC /臂-NONE-EABI / 4.9.3 /../../../../臂无-eabi / lib / armv7e -m / softfp \ libg_nano.a(lib_a-sbrkr.o):在函数_sbrk_r:sbrkr.c :(。text._sbrk_r + 0xc):未定义引用`_sbrk’“。 如果我从静态库中取出相同的函数,并将其放入main.c ,那么所有编译/链接/运行都很好。 我几乎可以肯定这与链接器在所有库中读取的顺序有关,并且当我自己的静态库被读取时, _sbrk需要_sbrk定义,因此被抛出,只是为了找到它无论如何,当后面的一个标准库被链接时,它是必需的。但是,我自己没有指定任何标准库,因此不能改变链接这些库的顺序。 我还尝试将_sbrk函数声明为__attribute __ ((__ used__ )) ,认为链接器不会丢弃该函数,但唉,这还没有解决我的问题。 所以我的问题是,如何将_sbrk放入静态库中,而不会_sbrk未解析的引用? 更新:链接最终应用程序的命令是: C:\ PROGRA~2 \ GNUTOO~1 \ 4947E~1.920 \ bin \ AR10B2~1.EXE -g -mcpu = cortex-m4 -mfpu = fpv4-sp-d16 […]

ARM程序集访问C全局变量

根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/Cihcciij.html ,如果我的ARM汇编代码需要访问名为globvar的C全局变量,我应该使用import和load指令: AREA globals,CODE,READONLY EXPORT asmsubroutine IMPORT globvar asmsubroutine LDR r1, =globvar ; read address of globvar into ; r1 from literal pool LDR r0, [r1] ADD r0, r0, #2 STR r0, [r1] MOV pc, lr END ,但是当我在我的代码中使用它时,会出现”bad instruction import globvar”的错误。 我正在使用armv7-android-gcc编译器。 我也在这个论坛中寻找类似的问题,但我没有得到有用的结果,所以有人可以帮我解决这个问题吗? 非常感谢。

使用GCC + ARM减少递归期间的堆栈使用

我有一个用于嵌入式ARM处理器的递归下降解析器(在C + GCC中,用于ARM Cortex M3)。 在运行它的同时我注意到它使用了大量的堆栈空间(甚至超出了你的预期)并且经过仔细检查我发现这种情况正在发生: extern int bar(int *p); int foo() { int z = foo(); // it’s an example! int n[100]; // stack usage return z+bar(n); // calling bar(n) stops n from being optimised out } 运行arm-none-eabi-gcc -fomit-frame-pointer -S test.c的结果 foo: str lr, [sp, #-4]! ; Push link register sub sp, sp, #412 […]

奇怪的C整数不等式比较结果

#include #include int main() { long ival = 0; printf(“ival: %li, min: %i, max: %i, too big: %i, too small: %i\n”, ival, INT_MIN, INT_MAX, ival > INT_MAX, ival < INT_MIN); } 这给出了输出: ival: 0, min: -2147483648, max: 2147483647, too big: 0, too small: 1 怎么可能? (我实际上在getargs.c : getargs.c中getargs.c了CPython 2.7.3中的这个问题/错误。如果你查找代码, case ‘i’ ,那么检查ival < INT_MIN对我来说总是如此。还有测试用例源以及进一步的参考 。) […]

将变量放在特定地址会生成大型二进制文件

我必须将数组放在内存中的特定地址。 我正在使用GCC。 我声明变量如下: uint8_t __attribute__((section (“.mySection”))) buffer[1234]; 在链接器脚本中我得到了: MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 145K MYSEC (x) : ORIGIN = 0x20025000, LENGTH = 155K } 然后: .mySection : { *(.mySection); } > MYSEC 它当然是嵌入式系统(ARM)的代码。 通常我的程序需要22 KB,这个修改需要384 MB(!)。 我不明白为什么。 如果我删除__attribute__它再次需要22 KB。 我错过了什么? 使用的代码: […]

在C中使用ASM命令

关于在c中使用ASM,我有一个小问题。 我想执行指令: LDR PC,=0x123456 这给了我错误“操作数中的意外令牌”。 asm(“LDR PC,=0x123456”); 这给出了“无效约束”。 asm(“LDR PC,” : “m” (0x123456)); 这样做的正确方法是什么?

擦除后无法写入闪存

所以擦除后我不能直接写入内部闪存。 如果在写操作之前没有擦除操作,那么我可以。 任何想法为什么? 编程function返回“成功写入”值,但在查看内存时,不会写入任何数据。 这是代码: uint32_t pageAddress = 0x08008000; uint16_t buffer = 0xAAAA; HAL_FLASH_Unlock(); FLASH_PageErase(pageAddress); HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer); HAL_FLASH_Lock(); 我已经尝试在擦除和编程之间锁定内存,在这些操作之间造成延迟,这无济于事。