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)
这似乎适用于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,笔和纸可能比计算机更强大:-)