您当前的位置:五五电子网电子知识单片机-工控设备综合-其它基于IAR编译器DS80C400的开发 正文
基于IAR编译器DS80C400的开发

基于IAR编译器DS80C400的开发

点击数:7239 次   录入时间:03-04 11:42:13   整理:http://www.55dianzi.com   综合-其它

    为IAR编译器编写DS80C400汇编函数的注意事项

    IAR文档提供了在8051汇编中编写程序,可从C程序中调用的方法。若8051汇编函数由IAR编译器编写的C程序来调用,在编写这些汇编语言时需切记以下几点。如果没有可用的寄存器传递变量时,会将这些变量以Little Endian顺序压入堆栈。

    1.函数参变量传递约定

    下表说明了变量的传递方式。

 

下表显示了函数返回值的规则。

函数int foo(int x, int y,void* ptr);的变量和返回值的传递如下:

2.数据类型存储规则

  IAR遵循Little Endian存储规则。注意,IAR使用最低有效字节在前的二进制数据存储格式。

  例如,一个4字节长的数值0xDEADBEEF,将会按如下方式存储:

    3.一个简单的汇编程序与'C'接口

    本节演示如何编写一个汇编程序并用IAR Embedded Workbench与'C'程序接口。应用程序交换16位和32位字节,并将交换后的字节输出到默认的控制台。C的可调用函数原型是int ltob( int *shortptr , long *longptr)。

    本示例程序由两个文件组成:main.c和eswap.s51.main.c调用我们用汇编语言编写的示例函数ltob()。创建一个新项目,命名为endian;添加cstartup.s51、low_level_init.s51、putchar.c文件以及Dallas Semiconductor ROM初始化库rominit.r51.详细资料请参考上述从8051 IAR Embedded Workbench开始。

    用以下内容来创建一个新的main.c文件,并将该文件添加到项目endian中。在C中,必须声明一个函数,以便让编译器知道如何调用它。ltob()函数在main()之前声明。注意在成功运行后函数ltob()会返回'0',而且,如果任一指针为NULL则返回非零值。程序应向控制台输出以下结果:

    创建一个新文件eswap.s51,输入以下汇编代码,并将它加入到项目endian中。这个汇编程序将我们的函数ltob()声明为PUBLIC,因此它能够由'C'程序调用。ltob()的第一个参数是指针,并通过DS80C400控制器的寄存器r3:r2:r1来传递。第二个参数也是一个指针,由IAR编译器压入偏移3至5堆栈(偏移3含有最低有效字节,偏移5含有最高有效字节)。首先,函数重新找到堆栈中存储的指针(指向一个32位值),交换它所指向的值,将交换后的字节存储在相同位置。同样,16位值也被字节交换并存储在交换前的同一位置。注意,通过汇编函数来保留寄存器r6和r7.这是因为IAR编译器将这些寄存器视为永久寄存器,意味着任何函数调用都不应修改这些寄存器。

    #include "reg400.inc"

    r0_b0     equ 0                         ; Register bank 0 equates.

    r1_b0     equ 1

    r2_b0     equ 2

    r3_b0     equ 3

    r4_b0     equ 4

    r5_b0     equ 5

    r6_b0     equ 6

    r7_b0     equ 7

    PROGRAM ENDIAN_SWAP

    PUBLIC ltob

    RSEG FAR_CODE:CODE:NOROOT(0)

    ; ********************************************************************

    ;

    ; int ltob(unsigned int* shortptr, unsigned long* longptr)

    ;

    ; ********************************************************************

    ltob:

    // shortptr is in r3:r2:r1

    // longptr is in stack at offset 5

    ; get the longptr stored in the stack

    mov a,SP

    clr c

    subb a,#5

    mov b,a

    mov a,esp

    anl a,#0x3

    orl a,#0xDC       ; extended stack is at 0xff dc00

    subb a,#00        ; subtract 0x0005 to point to MSB of 2 nd argument

    mov DPX,#0xFF

    mov DPH,a

    mov DPL,b

    push r6_b0        ; save r6:r7 for the compiler

    push r7_b0

    movx a,@DPTR

    mov r4,a          ;store least signifiCANt byte of 'longptr' in r4

    inc DPTR

    movx a,@DPTR

    mov r5,a          ;store middle byte of 'longptr' in r5

    inc DPTR

    movx a,@DPTR

    mov r6,a          ;store most significant byte of 'longptr' in r6

    mov a,r4_b0

    orl a,r5_b0

    orl a,r6_b0

    jz ltob_err       ; is (longptr == NULL)?

    mov dpx,r6_b0     ; point to the memory where 'longptr' is pointing to

    mov dph,r5_b0

    mov dpl,r4_b0

    pop r6_b0         ; restore r6:r7 for the compiler

    pop r7_b0

    push dpx

    push dpl

    movx a,@dptr      ; get the long value (in r4:r3:r2:r1) from the memory

    mov r4,a

    inc dptr

    movx a,@dptr

    mov r5,a

    inc dptr

    movx a,@dptr

    mov r6,a

    inc dptr

    movx a,@dptr

    mov r7,a

    inc dptr

    pop dpl

    pop dph

    pop dpx

    mov a,r7_b0         ; swap the long value bytes and store it in memory

    movx @dptr,a

    inc dptr

    mov a,r6_b0

    movx @dptr,a

    inc dptr

    mov a,r5_b0

    movx @dptr,a

    inc dptr

    mov a,r4_b0

    movx @dptr,a

    mov a,r1_b0        ; is (shortptr == NULL)?

    orl a,r2_b0

    orl a,r3_b0

    jz ltob_err

    mov dpx,r3_b0      ; point to a memory where the 'shortptr' is pointing to

    mov dph,r2_b0

    mov dpl,r1_b0

    push dpx

    push dph

    push dpl

    movx a,@DPTR        ; get the integer value from memory

    mov r2,a

    inc dptr

    movx a,@dptr

    mov r1,a

    inc dptr

    pop dpl

    pop dph

    pop dpx

    mov a,r1_b0         ; swap the integer bytes

    movx @dptr,a

    inc dptr

上一页  [1] [2] [3] [4]  下一页


本文关键字:开发  编译器  综合-其它单片机-工控设备 - 综合-其它

《基于IAR编译器DS80C400的开发》相关文章>>>