Tag:

这个汇编代码什么都没做

我正在使用C文件,这是这样的: #define v2 0x560000a0 int main(void) { long int v1; v1 = ioread32(v2); return 0; } 并且我已经提取了这部分以在汇编中编写它: int main () { extern v1,v2; v1=ioread32(v2); return 0; } 我正在尝试使用armv4的汇编代码在v1中写入v2的值。 运用 arm-linux-gnueabi-gcc -S -march=armv4 assembly_file.c 我得到这个代码: .arch armv4 .eabi_attribute 27, 3 .fpu vfpv3-d16 .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, […]

使用ARM汇编语言编写函数,该函数将字符串插入特定位置的另一个字符串

我正在阅读我class级的一本教科书,偶然发现了这个问题: 使用ARM汇编语言编写函数,该函数将字符串插入特定位置的另一个字符串。 函数是: char * csinsert( char * s1, char * s2, int loc ) ; 该函数有一个指向a1中s1的指针,指向a2中s2的指针,以及a3中关于插入发生位置的整数。 该函数将a1中的指针返回给新字符串。 您可以使用库函数strlen和malloc。 strlen输入指向a1中字符串的指针,并返回a1中的长度。 malloc将为新字符串分配空间,其中输入上的a1是所请求空间的字节大小,输出a1是指向所请求空间的指针。 请记住,寄存器a1-a4不会在函数调用中保留它们的值。 这是我创建的字符串插入的C语言驱动程序: #include extern char * csinsert( char * s1, char * s2, int loc ) ; int main( int argc, char * argv[] ) { char * s1 = “String 1 are combined” […]

ARM Cortex-M处理器硬故障处理中的冗余代码

来自FreeRTOS.org ,关于在ARM Cortex-M3和ARM Cortex-M4微控制器上调试硬故障和其他exception ,根据FreeRTOS的人员,我们可以使用以下代码来调试ARM Cortex-M硬故障 – /* The fault handler implementation calls a function called prvGetRegistersFromStack(). */ static void HardFault_Handler(void) { __asm volatile ( ” tst lr, #4 \n” ” ite eq \n” ” mrseq r0, msp \n” ” mrsne r0, psp \n” ” ldr r1, [r0, #24] <======== NOTE THIS LINE \n" " […]

通过arm c内联汇编程序在内存中操作数组

int smplSize = 48; int Smpl[48]; for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0; Smpl[smplSize-1] = 0x1; int *ptrToSmpl = &Smpl[0]; printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize); asm volatile( "@ ————————————————- \n" "@ Invert the sample \n" "@ ————————————————- \n" //"0: \n" "ldr r2,[r3] \n" //"cmp r2,#0x1 \n" //"bne 1f \n" "add […]

测试C代码中的SEGV在ARM Cortex M4处理器中经过的时间内出错

我正在为我的stm32f429板编写嵌入式操作系统的代码。 我正在测试此代码的使用时间: #include #include #include #include #include #include #define DEFAULT_DELAY 1 uint32_t m_nStart; //DEBUG Stopwatch start cycle counter value uint32_t m_nStop; //DEBUG Stopwatch stop cycle counter value #define DEMCR_TRCENA 0x01000000 /* Core Debug registers */ #define DEMCR (*((volatile uint32_t *)0xE000EDFC)) #define DWT_CTRL (*(volatile uint32_t *)0xE0001000) #define CYCCNTENA (1<= ticks) break; } } uint32_t CalcNanosecondsFromStopwatch(uint32_t nStart, […]

我们可以使用运算符“&”内联GCC ARM汇编吗?

我们可以使用运算符“&”内联GCC ARM汇编吗? 如果是,那么我有一个结构core_regx,我需要将该结构的成员r0的地址传递给下面提到的代码: asm volatile(“ldr r3, [%0,#0]”:: “r” (&(core_reg->r0))); 请检查此代码是否正确。

动态生成的代码在错误的地址中执行

这是一个UWP应用程序。 我在ARM / Release版本中遇到此问题。 变量指向extra_memory,其中每次在重新编译之前由protect_readwrite更改内存的保护,并且每次在执行重新编译的代码之前由protect_exec更改。 基本上extra_memory是我们重新编译代码的地方。 首先,在调用new_dynarec_init以将extra_memory的保护更改为读取和写入之后,输出指向extra_memory的指针,以便我们可以使用out作为执行重新编译代码的入口点。 new_recompile_block是执行重新编译的函数,从函数new_dyna_start调用。 extern char extra_memory[33554432]; #define BASE_ADDR ((int)(&extra_memory)) void *base_addr; u_char *out; void new_dynarec_init() { protect_readwrite(); base_addr = ((int)(&extra_memory)); out = (u_char *)base_addr; } int new_recompile_block(int addr) { //if(g_cp0_regs[CP0_COUNT_REG]==365117028) tracedebug=1; protect_readwrite(); //the recompiling code here …… protect_exec(); return 0; } void protect_readwrite() { #if NEW_DYNAREC == NEW_DYNAREC_ARM PVOID addr […]

在没有原型的文件中调用的函数在ARM和x86-64上产生不同的结果

我们有3个文件: main.c , lib.h和lib.c : main.c中: #include #include /* #include “lib.h” */ int main(void) { printf(“sizeof unsigned long long: %zu\n”, sizeof(unsigned long long)); printf(“sizeof int: %zu\n”, sizeof(int)); unsigned long long slot = 0; int pon_off = 1; lib_fn(slot, pon_off); return EXIT_SUCCESS; } lib.h: void lib_fn(unsigned slot, int pon_off); lib.c: #include #include void lib_fn(unsigned slot, int […]

将堆栈指针与ARM组件中的4字节对齐8字节

如何将堆栈指针对齐到8字节,现在在ARM中对齐4字节。根据我的理解,如果堆栈指针指向某个地址(如0x4,0x8,0x12和0x16等),则堆栈指针为4字节对齐。 因此,将堆栈指针与8字节对齐意味着它应指向0x8,0x16,0x24和0x32等地址,依此类推。 现在我如何将4字节堆栈指针与8字节对齐指针对齐?

如何防止ARM编译器5 armcc内联汇编程序中的LDM / STM指令扩展?

我正在尝试使用ARM编译器5 armcc编译的.c文件中的内联汇编中的STM / LDM指令生成AXI总线突发访问。 inline void STMIA2(uint32_t addr, uint32_t w0, uint32_t w1) { __asm { STMIA addr!, { w0, w1 } } } 但ARM编译器armcc用户指南第7.18段说:“所有LDM和STM指令都扩展为LDR和STR指令序列,效果相同。但是,编译器可能会在优化期间将单独的指令重新组合成LDM或STM。 “ 这就是实践中真正发生的事情,LDM / STM在某些情况下会扩展为一组LDR / STR,这些指令的顺序是任意的。 这会影响性能,因为我们使用的HW针对突发处理进行了优化。 这也打破了function正确性,因为我们使用的HW考虑了单词序列并忽略了偏移(但编译器认为改变指令的顺序是安全的)。 要解决这个问题,可以使用嵌入式汇编程序而不是内联汇编程序,但这会导致额外的函数调用 – 返回影响性能的因素。 所以我想知道是否有办法在不损失性能的情况下正确生成LDM / STM? 我们能够在GCC中做到这一点,但没有找到任何armcc的解决方案。 目标CPU:Cortex M0 +(ARMv6-M)。 编辑:从设备都是片上设备,大多数都是非内存设备。 对于支持突发访问区域的非内存从站的每个寄存器都保留了地址空间(例如[0x10000..0x10100]),我不完全确定为什么,也许CPU或总线不支持固定(非增量) )地址。 HW忽略该区域内的偏移。 例如,完整请求可以是16字节,并且完整请求的第一个字是第一个字写入的(即使偏移是非零)。