EXTRN DATA (DATT0,DATT1,DATT2) ,然后,另建立一个c语言的文件,(千万不要把汇编和c放到一个文件中)并加入到新的工程中,进行编译。下面给一个在网上搜的,有空我编一个例子。
汇编语言调用C语言
这是我刚开始学硬件时做过的一个项目,刚开始是从汇编开始的,从下位机采集上来的数据是浮点数(4字节)我要用接收下来,然后再送到数码管去显示这个浮点数,这首先要把接收到的数(4字节数)再变成浮点数,虽然有浮点数的变换原理但要是用汇编程序来实现非常的繁琐,我想到用C语言来自动实现,如把4字节数赋给一个浮点变量后,这个变量就是一个浮点数然后再一位位分开送到数码管去显示根据这个原理理解下面的两段程序。
-------------------------------------------------
三位数带有一位小数的程式(例如显示“15.2”)
SLAVE EQU 26
FLAG BIT 2EH
REV0 EQU 30H
REV1 EQU 31H 存放收到的字符
REV2 EQU 32H
REV3 EQU 33H
DAT0 EQU 34H
DAT1 EQU 35H 要显示的字符
DAT2 EQU 36H
EXTRN CODE (function)
EXTRN DATA (DATT0,DATT1,DATT2)
ORG 0023H
AJMP RECV
ORG 0000H
AJMP START
ORG 0040H
START: NOP
MOV SP,#60H
SETB EA
SETB ES
MOV TMOD,#20H
MOV SCON,#0F4H
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV PCON,#00H
SETB TR1
MOV R6,#4
CLR FLAG
MOV DAT0,#0
MOV DAT1,#0
MOV DAT2,#0
MOV DPTR,#NUM
MOV R1,#REV0
LOOP: MOV R0,#DAT0
MOV A,@R0
MOVC A,@A+DPTR
CLR P3.4
MOV P1,A
ACALL DELAY
ACALL DELAY
SETB P3.4
CLR P3.3
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ANL A,#7FH
MOV P1,A
ACALL DELAY
ACALL DELAY
SETB P3.3
CLR P3.2
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY
ACALL DELAY
SETB P3.2
JNB FLAG,GGG
MOV DAT0,DATT0
MOV DAT1,DATT1
MOV DAT2,DATT2
CLR FLAG
GGG: SJMP LOOP
DELAY: MOV R7,#0FFH
DJNZ R7,$
RET
----------------------------------
从机接收程序
RECV: PUSH ACC
PUSH PSW
CLR RI
MOV A,SBUF
XRL A,#SLAVE
JZ TORECV
OUT: POP PSW
POP ACC
RETI
TORECV: CLR SM2
RECVNEXT:JNB RI,$
CLR RI
JNB RB8,ISNUM
SJMP OUT
ISNUM: MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R6,RECVNEXT
LCALL function 调用C语言函数
SETB FLAG
MOV R6,#4
MOV R1,#REV0
SETB SM2
SJMP OUT
NUM: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,98H
DB 86HEND
//C语言被调用部分
char data DATT0,DATT1,DATT2
void function()
{
float data *good=0x30
int data *gg=0x3a
// *good=(*good)*100
*gg=(int)*good
if(*gg>=0)
{
DATT0=(*gg)%10
*gg=(*gg)/10
DATT1=(*gg)%10
DATT2=(*gg)/10
}
else
{
DATT0=10
DATT1=10
DATT2=10
}
}
首先需要计算出 DEL 和 DEL1 的执行时间,由于 DEL 只有一条指令,所以执行时间为一个机器周期(1/12MHz = 83.33ns)。DEL1 的执行时间也为一个机器周期,即83.33ns。
接下来计算 DEL2 的执行时间。由于 DEL2 中只有一条指令 DJNZ R6,DEL1,因此需要计算 DJNZ R6 的执行时间。DJNZ 指令的执行时间为2个机器周期,因此 DJNZ R6 的执行时间为2 * 83.33ns = 166.67ns。由于 DEL1 的执行时间也为一个机器周期,因此 DEL2 的执行时间为 166.67ns + 83.33ns = 250ns。
最后计算 DJNZ R7,DEL1 和 RET 的执行时间。DJNZ R7 的执行时间与 DJNZ R6 相同,为166.67ns。RET 的执行时间为2个机器周期,即 2 * 83.33ns = 166.67ns。因此 DJNZ R7,DEL1 和 RET 的总执行时间为 166.67ns + 83.33ns + 166.67ns = 416.67ns。
ANL A,#17H: A 的值为 A &17H = 83H &17H = 03H。
ORL 17H,A: (17H) 的值为 (17H) | A = 44H | 03H = 47H。
XRL A,@RO: A 的值为 A ^ [(RO)] = 03H ^ [(17H)] = 54H。
CPL A: A 的值为 ~A = ~54H = ABH。
MCS-51单片机汇编语言中,没有SP这条指令,只有针对SP *** 作的指令。51单片机中SP是堆栈指针寄存器,存放着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时程序返回的地址,或者用来临时保存某一寄存器的值。除了初始化堆栈时直接给SP赋值,SP显式存在,其它的对SP有影响的指令,对SP的 *** 作都是隐式的,就是说SP并不出现在指令 *** 作数当中。例如:MOVSP,#80H初始堆栈指针,(SP)=80HLCALLXXXX调用XXXX处的子程序,下一条指令PC值压栈,(SP)=(SP)+2NOP子程序返回时,RET指令从堆栈中d出PC值,所以会返回到这里,(SP)=(SP)-2PUSHACC累加器A的内容压栈保存,(SP)=(SP)+1POPB堆栈内保存的累加器A的内容d出到B寄存器中,(SP)=(SP)-1使用PUSH、POP指令使用堆栈,要注意进出栈的匹配,否则将引起不可预期的后果。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)