一.最简单的内嵌
1.结构
#pragma asm
// assembly code
#pragma endasm
2.选中group ---
generate assembly src file、assembly src file (l两个都要选定,否则要是没选定assembly src file,会有下面警告)
3.编译连接就可以生成可执行的hex文件。
二、无参数的内嵌汇编函数调用
上面是在一个函数中内嵌汇编代码,这里说另外一种方法
步骤是:
1.建立工程后,新建test.c源文件,编写一个空函数。
-
#include<reg51.h>
-
void test(void)//这是个空函数,以后要在这里写汇编
-
{
-
-
{
-
-
int main(void)
-
{
-
test();
-
return 0;
-
}
2.根据编译器的编译模式(small, compact, large),将相应的lib文件加入工程。这里选用small模式。那么选择C51S.LIB 加入到工程。
3.鼠标选定test.c文件(因为要在这里内嵌汇编),右击后在弹出菜单中选“option for group”,勾选右边的generate assembly src file 和generate src file
4.编译工程。这时可以得到test.src文件(文件名是test.c,所以是test.src)。
从第72行开始看。
5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的86行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。
执行hex文件会看到相应的现象。
三,参数的传递
先说说参数传递的方法,keil对参数的传递是有规定的,什么数据类型对应哪个寄存器,这都是有说明的。但是我觉得这个不要刻意记。因为在生成的src文件中我可以清楚的看到参数放在
哪个寄存器中。
步骤是:
1.建立工程后,新建test.c源文件,编写一个空函数。
-
#include<reg51.h>
-
void test(char dat)//这是个空函数,以后要在这里写汇编
-
{
-
-
{
-
-
int main(void)
-
{
-
test(55);
-
return 0;
-
}
2.根据编译器的编译模式(small, compact, large),将相应的lib文件加入工程。这里选用small模式。那么选择C51S.LIB 加入到工程。
3.鼠标选定test.c文件(因为要在这里内嵌汇编),右击后在弹出菜单中选“option for group”,勾选右边的generate assembly src file 和generate src file
4.编译工程。这时可以得到test.src文件(文件名是test.c,所以是test.src)。
-
?PR?_test?TEST SEGMENT CODE ;此时的test前面有了下划线。这是因为他有参数传递过
-
?DT?_test?TEST SEGMENT DATA OVERLAYABLE
-
?PR?main?TEST SEGMENT CODE
-
EXTRN CODE (?C_STARTUP)
-
PUBLIC main
-
PUBLIC _test
-
-
RSEG ?DT?_test?TEST
-
?_test?BYTE:
-
dat?040: DS 1;这个伪指令是说从dat?040代表的地址开始,保留一字节的内存空间
-
; #include <reg51.h>
-
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
; void test(char dat)
-
-
RSEG ?PR?_test?TEST
-
_test:
-
; SOURCE LINE # 3
-
MOV dat?040,R7;将参数保存在dat?040(第十行)
-
;这里可以编写自己的汇编代码了
-
MOV P0, dat?040
-
; {
-
; SOURCE LINE # 4
-
;
-
; }
-
; SOURCE LINE # 6
-
RET
-
; END OF _test
-
-
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
; int main(void)
-
-
RSEG ?PR?main?TEST
-
main:
-
USING 0
-
; SOURCE LINE # 8
-
; {
-
; SOURCE LINE # 9
-
; test(55);;十进制55的十六进制是37
-
; SOURCE LINE # 10
-
MOV R7,#037H;可以看到,参数保存在R7中。
-
LCALL _test
-
;
-
; return 0;
-
; SOURCE LINE # 12
-
CLR A
-
MOV R6,A
-
MOV R7,A
-
; } ; SOURCE LINE # 13
-
?C0002:
-
RET
-
; END OF main
-
-
END
5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的20行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。执行hex文件会看到相应的现象。
四,有返回值
当然,返回值也通过相应的寄存器返回的。
步骤是:
1.建立工程后,新建test.c源文件,编写一个空函数。
-
#include <reg51.h>
-
-
char test(void)
-
{
-
-
}
-
-
int main(void)
-
{
-
char dat;
-
-
dat = test();
-
P0 = dat;
-
-
return 0;
-
}
2.根据编译器的编译模式(small, compact, large),将相应的lib文件加入工程。这里选用small模式。那么选择C51S.LIB 加入到工程。
3.鼠标选定test.c文件(因为要在这里内嵌汇编),右击后在弹出菜单中选“option for group”,勾选右边的generate assembly src file 和generate src file
4.编译工程。这时可以得到test.src文件(文件名是test.c,所以是test.src)。
-
?PR?test?TEST SEGMENT CODE
-
?PR?main?TEST SEGMENT CODE
-
EXTRN CODE (?C_STARTUP)
-
PUBLIC main
-
PUBLIC test
-
; #include <reg51.h>
-
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
; char test(void)
-
-
RSEG ?PR?test?TEST
-
test:
-
MOV R7, #0h;将0放入R7中,就是返回0
-
; SOURCE LINE # 3
-
; {
-
; SOURCE LINE # 4
-
;
-
; }
-
; SOURCE LINE # 6
-
RET
-
; END OF test
-
-
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
; int main(void)
-
-
RSEG ?PR?main?TEST
-
main:
-
USING 0
-
; SOURCE LINE # 8
-
; {
-
; SOURCE LINE # 9
-
; char dat;
-
;
-
; dat = test();
-
; SOURCE LINE # 12
-
LCALL test
-
;---- Variable 'dat?140' assigned to Register 'R7' ----
-
; P0 = dat;
-
; SOURCE LINE # 13
-
MOV P0,R7;R7中值是返回值
-
;
-
; return 0;
-
; SOURCE LINE # 15
-
CLR A
-
MOV R6,A
-
MOV R7,A
-
; } ; SOURCE LINE # 16
-
?C0002:
-
RET
-
; END OF main
-
-
END
5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的12很37到39行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。执行hex文件会看到相应的现象。
阅读(2096) | 评论(0) | 转发(0) |