【问题标题】:Converting ASM to C [closed]将 ASM 转换为 C [关闭]
【发布时间】:2015-12-29 01:16:10
【问题描述】:

我不知道是否有可以将 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

【问题讨论】:

  • 确实已经在 cmets 中编写了算法,用另一种语言实现它应该不难。
  • 所以这应该是一个“if”语句吧?
  • 这看起来像 PIC 程序集。
  • 我投票结束这个问题,因为它属于reverseengineering.stackexchange.com

标签: c assembly embedded pic microchip


【解决方案1】:

这似乎适用于 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;

清理一下:

while (INPUT0 != 0);

但是,有许多未定义的符号: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]

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

OSCCAL EQU H'0090'

进入:

OSCCAL = 0x0090,

您实际上不需要这样做,我建议不要这样做。咬紧牙关,熟悉 EQU 语法。

这是一个通用资源:http://www.pic18f.com/,本教程对入门很有帮助:http://www.pic18f.com/tutorial/2007/12/04/18f4550-and-assembly-overview/

对于每个 asm/机器指令,使用我提到的原始站点,打印给定指令的给定页面。例如,对于“movwf”,打印此页:http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/MOVWF.html

真的没有那么多。有些不在索引页面中。只是谷歌他们。事实上,打印索引页面上的每个链接可能会更容易。然后,您将拥有完整的“指令集参考”

PIC 寄存器文件是“存储的”。我能想到的最接近的类比是考虑一个二维 C 数组:“F[2][256]”。但是,您不能直接访问 F[y][x]。您必须执行“selectY(1)”[选择“bank”1] 和“getF(x)”[获取给定 bank 中的第 x 个寄存器]。有关给定银行的 x 值,请参见 .inc 文件。对于给定的银行,并非所有 x 值都有效。不知道。

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

请注意,“.whatever”表示一个常量值(相对于内存位置)。

请注意,代码的 INIT 部分的最后一件事是 BANKSEL GPIO。因此,当我们开始执行 LOW0 循环时,INPUT0 被替换为“GPIO,0”,这意味着寄存器 GPIO 的第 0 位,即 bank 0 中的寄存器 5。

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

所以,重新编码“LOW0”:

LOW0:
    if ((F[0][0x0005] & (1 << 0)) != 0)
        goto LOW0

此外,您的 main.asm 具有出色的 cmets。尝试忽略 asm insts,只阅读 cmets 几次。然后返回并阅读指令定义几次。交叉引用它们。

哦,是的。在方格纸上画出登记文件可能会有所帮助。

笔胜于剑。并且要理解 asm,笔和纸可能比计算机更强大:-)

【讨论】:

  • 非常感谢您回答我的问题并分享有关组装说明的链接。我发布的代码只是代码的一部分。我试图通过阅读代码来理解项目的概念,但我无法完全理解它,因为代码是用汇编编写的。由于我确实对 C 有一定的了解,因此我正在尝试用 C 重写代码,以便完全理解它。
  • 顺便说一下,整个代码在这里:dropbox.com/s/936xnw75xzfjnfx/main.asm?dl=0
  • @elvinguitar 下载了您的文件和 .inc,并使用更精确的方法更新了我的答案。这取决于我会怎么做。
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 2011-05-11
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多