创建一个 ASM 文件,该文件将返回位于 8 个连续寄存器中的字符

发布于 2024-12-07 04:15:18 字数 1026 浏览 4 评论 0原文

我必须为 PIC18F452 创建一个 ASM 文件,该文件执行以下操作:

(a) 将标签 MapName 定义为 8 个连续寄存器中的第一个,其中包含不超过 7 个字符的以 null 结尾的字符串。 (b) 访问在 C 文件中声明的名为 MapIndex 的 8 位无符号整数变量。 (c) 定义一个 ASM 函数 getMapChar,可以使用函数原型 char getMapChar(void) 从 C 调用该函数。当 MapIndex 的值 <= 7 时,该函数应返回适当的字符;如果 MapIndex 的值 > 7,则该函数应返回值 255。 7. (d) 使外部 C 文件可以访问标签 MapNamegetMapChar

到目前为止,我的代码如下所示:

; Configuration word : WDT off, power-up timer on, code protect off, RC oscillator

list = p18f452

MapName     equ     0x20
MapName1    equ     0x21
MapName2    equ     0x22
MapName3    equ     0x23
MapName4    equ     0x24
MapName5    equ     0x25
MapName6    equ     0x26
MapName7    equ     0x27
CurrentChar equ     0x28

extern  MapIndex

org 0x00
goto    getMapChar

getMapChar
    movlw   0x00
    movwf   MapName7

GLOBAL  getMapChar
GLOBAL  MapName

    END

我已经完成了 (a)、(b) 和 (d) 部分,但是在编写使用 的值自动移动通过每个连续寄存器的代码时遇到了一些问题地图索引。有人可以帮我吗?我们将不胜感激。

I have to create an ASM file for the PIC18F452 that does the following:

(a) define the label MapName as the first of 8 consecutive registers containing a null-terminated string of not more than 7 characters. (b) access an 8-bit unsigned integer variable called MapIndex which was declared in a C file. (c) define an ASM function getMapChar which can be called from C using the function prototype char getMapChar(void). The function should return the appropriate character when the value of MapIndex is <= 7 or the value 255 if MapIndex is > 7. (d) make the labels MapName and getMapChar accessible to an external C file.

My code so far is shown below:

; Configuration word : WDT off, power-up timer on, code protect off, RC oscillator

list = p18f452

MapName     equ     0x20
MapName1    equ     0x21
MapName2    equ     0x22
MapName3    equ     0x23
MapName4    equ     0x24
MapName5    equ     0x25
MapName6    equ     0x26
MapName7    equ     0x27
CurrentChar equ     0x28

extern  MapIndex

org 0x00
goto    getMapChar

getMapChar
    movlw   0x00
    movwf   MapName7

GLOBAL  getMapChar
GLOBAL  MapName

    END

I have already done parts (a), (b) and (d) but I am having some problems with writing the code that moves through each of the consecutive registers automatically using the value of MapIndex. Could anyone help me please? It would be much appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

殤城〤 2024-12-14 04:15:18

您可以使用FSR(文件选择寄存器)之一来寻址MapName文件寄存器:

lfsr    0, MapName      ;Load 12bit file address pointer to FSR0
movf    MapIndex, w     ;Load MapIndex to WREG  ; or movff MapIndex, WREG
addwf   FSR0L, f        ;Add MapIndex to FSR0 low byte
movf    INDF0, w        ;Load MapName[MapIndex] to WREG

如果变量MapName的所有文件寄存器不在8内位地址空间,然后将MapIndex添加到FSR0L后检查进位标志是否溢出。如果设置了进位,也会增加FSR0H文件寄存器。

You can use one of FSR (file select registers) to address MapName file registers:

lfsr    0, MapName      ;Load 12bit file address pointer to FSR0
movf    MapIndex, w     ;Load MapIndex to WREG  ; or movff MapIndex, WREG
addwf   FSR0L, f        ;Add MapIndex to FSR0 low byte
movf    INDF0, w        ;Load MapName[MapIndex] to WREG

If all file registers of variable MapName aren't inside 8 bit address space then after adding MapIndex to FSR0L check Carry flag for overflow. If Carry is set increase also the FSR0H file register.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文