Tag: 组装

如何使用内联汇编写入闪存?

我正在使用带有PIC18F87J11的 MPLAB C18编译器,我正在尝试使用内联汇编将一些值保存到闪存中,这是C和汇编代码的组合。 看起来我可以正确地写入和读取闪存,但是一旦我重新启动PIC然后尝试读取我之前从特定地址保存的内容,我就得不到相同的值。 我将0x09保存到0xB22A地址。 就像我说的,如果我保存值然后立即读取它,一切都正确,但重置PIC后我得到0x00 。 我不是永久保存到闪存或这里真的发生了什么? 这是我的代码: 擦除内存行 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF TBLPTRH,BANKED MOVLW 0x2A MOVWF TBLPTRL,BANKED _endasm EECON1bits.FREE = 1; INTCONbits.GIE = 0; _asm MOVLW 0x55 MOVWF EECON2,BANKED MOVLW 0xAA MOVWF EECON2,BANKED _endasm EECON1bits.WR = 1; INTCONbits.GIE = 1; 写入闪存 _asm MOVLW 0x00 MOVWF TBLPTRU,BANKED MOVLW 0xB2 MOVWF […]

从编译器asm输出反向设计数组维度/结构布局?

在此代码中,A和B是使用#define定义的常量。 A和B的值是多少? typedef struct { int x[A][B]; long y; } str1; typedef struct { char array[B]; int t; short S[A]; long u; } str2; void setVal(str1 *p, str2 *q) { long v1 = q->t; long v2 = q->u; p->y = v1+v2; } 为setVal过程生成以下汇编代码: setVal: movslq 8(%rsi), %rax addq 32(%rsi), %rax movq %rax, 184(%rdi) ret

从C中的内联汇编程序中定义的访问数组

我在Assembler中声明了一个整数,我在C中以下列方式使用它: asm( “number: \n” “.long 0xFFFFFFFF \n ); extern int number; int main(){ //do something with number } 现在我想在Assembler中声明一个32字节的数组。 我尝试了以下方法: asm( “number: \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” “.long 0xFFFFFFFF \n” ); extern unsigned char* number; int main() { […]

高效的memcspn

有谁知道memcspn函数的有效实现? 它应该像strcspn一样,但在内存缓冲区中查找span,而不是在以null结尾的字符串中查找。 目标编译器是visualC ++。 谢谢,卢卡

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} /* […]

循环展开优化,这是如何工作的

考虑这个C代码: int sum=0; for(int i=0;i<5;i++) sum+=i; 这可以通过这种方式转换为(伪)汇编(无需循环展开): % pseudo-code assembly ADDI $R10, #0 % sum ADDI $R11, #0 % i LOOP: ADD $R10, $R11 ADDI $R11, #1 BNE $R11, #5 LOOP 所以我的第一个问题是如何在这两种方式之间使用循环展开来翻译此代码: 1) ADDI $R10, #0 ADDI $R10, #0 ADDI $R10, #1 ADDI $R10, #2 ADDI $R10, #3 ADDI $R10, #4 2) ADD $R10, #10 […]

混合程序(.asm + .cpp):修改小数学程序的代码以包含浮点输入

(Intel x86.TASM和BorlandC编译器,以及TLINK使用。) 在main1.cpp ,程序接受int输入(直到输入小于-999999的数字),将其放入数组x[] ,将输入数量放入数组的第0个元素,将数组的指针发送到f1.asm ,添加数字,并将结果返回到main1.cpp以便显示它。 如何修改它以包含浮点数作为输入? 我的具体问题: 当我将int转换为float ,输入在f1.asm的偏移量的f1.asm发生变化,而我找不到它; .asm浮点数的数学运算。 (我无法理解我在其他地方找到的.asm花车的解释。) 先感谢您。 main1.cpp: #include #include #include extern “C” int f1( int* x ); int main() { int x[100], i ; for( i = 1 ; x[i-1]>=-999999 ; i++ ) { cout << "x[" << i <> x[i] ; // Input elements while they’re >= […]

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编译器。 我也在这个论坛中寻找类似的问题,但我没有得到有用的结果,所以有人可以帮我解决这个问题吗? 非常感谢。

在汇编中添加浮点/双精度数

我正在尝试内联汇编,我试图在内联汇编中添加十进制数字(不,不是整数)。 问题是,当我调用以下函数时: inline double ADD(double num1, double num2) { double res; _asm{ push eax; push the former state of eax onto stack mov eax, num1; add eax, num2; mov res, eax; pop eax; restore the former state of eax now that we are done } return res;} 编译器抱怨内联汇编中的操作数大小不合适(除了push和pop指令行之外的所有汇编行)。 所以我必须更改为整数类型,例如unsigned long,然后它可以工作,但当然只支持整数类型; 十进制结果四舍五入。 有没有办法添加允许像8.4这样的十进制结果的程序集?

错误的gcc生成的assembly顺序,导致性能损失

我有以下代码,它将数据从内存复制到DMA缓冲区: for (; likely(l > 0); l-=128) { __m256i m0 = _mm256_load_si256( (__m256i*) (src) ); __m256i m1 = _mm256_load_si256( (__m256i*) (src+32) ); __m256i m2 = _mm256_load_si256( (__m256i*) (src+64) ); __m256i m3 = _mm256_load_si256( (__m256i*) (src+96) ); _mm256_stream_si256( (__m256i *) (dst), m0 ); _mm256_stream_si256( (__m256i *) (dst+32), m1 ); _mm256_stream_si256( (__m256i *) (dst+64), m2 ); _mm256_stream_si256( […]