我的编译器无法使用我拥有的汇编文件,而其他编译器将无法使用我拥有的c文件。我不懂汇编。我需要将其移开,但不能很快到达任何地方。那里有人可以提供帮助吗?我不敢相信没有翻译器可用。这是文件的开头:
list p=18F4480
#include <p18F4480.inc>
#define _Z STATUS,2
#define _C STATUS,0
GLOBAL AARGB0,AARGB1,AARGB2,AARGB3
GLOBAL BARGB0,BARGB1,BARGB2,BARGB3
GLOBAL ZARGB0,ZARGB1,ZARGB2
GLOBAL REMB0,REMB1
GLOBAL TEMP,TEMPB0,TEMPB1,TEMPB2,TEMPB3
GLOBAL LOOPCOUNT,AEXP,CARGB2
LSB equ 0
MSB equ 7
math_data UDATA
AARGB0 RES 1
AARGB1 RES 1
AARGB2 RES 1
AARGB3 RES 1
BARGB0 RES 1
BARGB1 RES 1
BARGB2 RES 1
BARGB3 RES 1
REMB0 RES 1
REMB1 RES 1
REMB2 RES 1
REMB3 RES 1
TEMP RES 1
TEMPB0 RES 1
TEMPB1 RES 1
TEMPB2 RES 1
TEMPB3 RES 1
ZARGB0 RES 1
ZARGB1 RES 1
ZARGB2 RES 1
CARGB2 RES 1
AEXP RES 1
LOOPCOUNT RES 1
math_code CODE
;---------------------------------------------------------------------
; 24-BIT ADDITION
_24_BitAdd
GLOBAL _24_BitAdd
movf BARGB2,w
addwf AARGB2,f
movf BARGB1,w
btfsc _C
incfsz BARGB1,w
addwf AARGB1,f
movf BARGB0,w
btfsc _C
incfsz BARGB0,w
addwf AARGB0,f
return
我知道我可以大范围地排除前两行,因为设备定义仍然在我的main.c中。两个#define就是这样,但最简单的方法(我认为)是将_Z和_C的实例分别替换为STATUS,2和STATUS,0。接下来的几行(GLOBAL)只是我正在收集的变量声明。与LSB和MSB相同,除了它们也分配值。下一个块,我想我只是用这些名称(AARGB0等)声明了一堆整数,然后是该函数的块。
我什至不用去翻译那个函数,因为我的编译器具有#asm /#end asm指令,因此我可以将其放在raw中(只要将其包装在函数中)。
我想我已经拥有了一切……直到我构建并且我的编译器大叫关于未定义状态的消息。当然不是。那是什么我在网上读到STATUS寄存器很特殊,但我真的不知道它是如何工作的。
如果您没有注意到,我什至不确定我真正要问的是什么。我只希望这件血腥的事情能起作用。
最佳答案
STATUS是PIC体系结构中的内置寄存器,其实现的功能与大多数较大CPU:s中的“状态”或“条件”标志寄存器相同。它包含由微 Controller 在执行代码时设置和清除的位标志,告诉您操作的结果。
例如,每当算术运算结果为零时,就设置Z标志,而当检测到算术溢出时,就设置C(进位)标志。
这些标志通常在C中不可见,因为C不想要求主机处理器甚至具有状态位,因此直接将此代码转换为C将很困难。您将需要找出一种在C代码中包含状态读取位测试的方法,并在可能的情况下使用这些指令。这可能很麻烦,因为从C语言中,您无法控制正在使用的寄存器,从而可能难以确保在正确的位置检查正确的标志。
Here是指向其他人的扩展精度PIC代码的一些链接。多数似乎仍在组装中,但它们可能仍可作为引用或启发。
关于c++ - 帮助将此程序集翻译为c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1384119/