将ASM转换为C

elv*_*tar -4 c embedded assembly microchip pic

我不知道是否有一个程序可以将ASM转换为C.我检查了谷歌,我已经读过IDA Pro可以做到但我不知道如何做.无论如何,你能帮我把这个用ASM编写的代码转换成C吗?我不擅长集会,所以我希望你能帮助我.谢谢 :)

这是代码:

#define CALIBRATIONTIME     .10 ;Number Of Times To Measure Signal During Calibration

;**********************************************************************************************
;Calibrate() - Measures A Period From The Input(GP0) Reference Signal
;            - Updates Osccal Value
;            - Updates E^2 
;**********************************************************************************************
CALIBRATE
    movlw   CALIBRATIONTIME
    movwf   COUNTER     ;Calibration Counter

LOW0
    btfsc   INPUT0      ;Wait To Sample Low Edge #0 (Makes Sure We Are Synchronized First Time Through)
    goto    LOW0        

HIGH1
    btfss   INPUT0      ;Wait To Sample High Edge #1
    goto    HIGH1   
    clrf    TMR0        ;Start Timer  (Timer Will Be Behind By 5us After This Instruction)

LOW1
    btfsc   INPUT0      ;Wait To Sample Low Edge #1
    goto    LOW1

HIGH2
    btfss   INPUT0
    goto    HIGH2
    movf    TMR0,W      ;Stop Timer (Timer Will Be Stopped 3us Late)
    addlw   .2      ;Timer Is Behind By 2us Total From Start To Stop    
    call    CHECKPERIOD ;See If Osccal Needs To Be Adjusted

LOW2
    btfsc   INPUT0      ;Wait To Sample Low Edge #2
    goto    LOW2
    decfsz  COUNTER,F   ;Decrement The Calibration Counter
    goto    HIGH1
    call    UPDATE_EE   ;Update E^2
    return
Run Code Online (Sandbox Code Playgroud)

Cra*_*tey 7

这似乎适用于PIC18F单片机.是?见http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/

PIC非常老,可能无法支持C.您是否尝试在C中重写PIC或转换为其他架构?PIC有可靠的C编译器和工具链吗?

对于基本的asm,左边的符号是"标签",就像在C中一样.

PIC有许多指令是"测试条件,如果是,则跳过下一条指令".

例如,第一个循环具有标签"LOW0".在C中,这看起来像:

LOW0:
    if (INPUT0 != 0)
       goto LOW0;
Run Code Online (Sandbox Code Playgroud)

清理这个:

while (INPUT0 != 0);
Run Code Online (Sandbox Code Playgroud)

但是,有许多未定义的符号:INPUT0,TMR0,COUNTER.INPUT0似乎是存储器映射的I/O端口,TMR0也是如此.COUNTER看起来像一个普通的全球,但你必须弄清楚哪个是哪个.

有些调用未定义的其他子例程.他们是集会还是C?如果汇编,参数的调用约定是一样的吗?

如果其他所有内容都已移植到C,并且这只是一个落后者,重新编码它是微不足道的.如果我回答了上述问题中的更多问题,我可以用比写这篇文章更少的时间来记录整个事情.

如果你的项目正在离开PIC拱门,那就有意义了.什么是动机[和背景]?

更新:

我已经下载了您的完整文件并进行了分析.警告:虽然我已经做了30多年的C和40+的汇编,但我是PIC18F的新手,但我已经能够借鉴经验了.

PIC是一个8位微控制器,带有一个称为"W"或"工作寄存器"的通用寄存器.它还有"寄存器文件",用"F"表示.它有一些指令可以将字节移入/移出W和给定寄存器文件中的给定寄存器.稍后会详细介绍.

打印 [重复:打印 ]所有相关文件/网页.创建一本书.

PIC相对简单,指令相对较少.我建议你在汇编程序中进行分析.当你足够了解asm和arch实际转换为C时,你实际上可以理解asm.

C的类比是你只允许这样做:

if (x) goto label
if (! x) goto label
foo() // with _no_ arguments
W = ...
F[idx] = W
W = F[idx]
Run Code Online (Sandbox Code Playgroud)

首先,p12f675.inc是PIC的主定义文件.这只是一堆定义.注意 ";" 是注释字符,相当于C的ANSI"//"[它们都是"实线"]."EQU"就像一个C enum.如果要将整个文件转换为C .h文件,请更改所有";" 进入"//".把"enum {"放在顶部和"};" 在底部.然后改变所有:

OSCCAL EQU H'0090'
Run Code Online (Sandbox Code Playgroud)

成:

OSCCAL = 0x0090,
Run Code Online (Sandbox Code Playgroud)

你实际上不需要这样做,我建议不要这样做.只需咬紧牙关,熟悉EQU语法即可.

以下是一般资源:http: //www.pic18f.com/,本教程将非常有用入门:http://www.pic18f.com/tutorial/2007/12/04/18f4550-and-assembly-overview /

对于每个asm/machine指令,使用我提到的原始站点,打印给定页面以获取给定指令.例如,对于"movwf",请打印此页面:http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/MOVWF.html

确实没有那么多.有些不在索引页面中.只是谷歌他们.实际上,打印索引页面上的每个链接可能更容易.然后,你将拥有完整的"指令集参考"

PIC寄存器文件是"存储"的.我能想到的最接近的类比是考虑一个2-Dim C数组:"F [2] [256]".但是,您无法直接访问F [y] [x].你必须做一个"selectY(1)"[选择"bank"1]和a"getF(x)"[得到给定银行中的第x个寄存器].请参阅.inc文件以获取给定银行的x值.并非x的所有值都可能对给定的银行有效.不知道.

寄存器文件中的一些寄存器是I/O端口(例如GPIO).有些是内部的,例如STATUS.因此,在将给定的F寄存器(例如STATUS)传送到W寄存器之后,您可以检查各个位.在.inc文件中,对于"C"[处理器"进位"标志]和"Z"[CPU的"零"标志"],存在EQU(称为"等于").

请注意,".whatever"表示常量值(与内存位置相对).

请注意,代码的INIT部分的倒数第二部分是BANKSEL GPIO.因此,当我们执行LOW0循环时,INPUT0被"GPIO,0"替换,这意味着寄存器GPIO的位0,它是存储区0中的寄存器5.

在C中,对硬件寄存器的访问必须标记为"volatile",因此,为了说明,F应为"volatile unsigned char F [2] [256]".

所以,再次重新编码"LOW0":

LOW0:
    if ((F[0][0x0005] & (1 << 0)) != 0)
        goto LOW0
Run Code Online (Sandbox Code Playgroud)

此外,您的main.asm有很好的评论.尝试忽略asm insts,只需阅读几次评论.然后返回并阅读指令定义几次.交叉引用它们.

哦耶.在方格纸上绘制寄存器文件可能会有所帮助.

文笔比刀剑更有力.要理解asm,笔和纸可能比计算机更强大:-)