Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28882
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 62
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 15:18
个人简介

游戏!

文章分类

全部博文(5)

文章存档

2013年(5)

我的朋友

分类: 嵌入式

2013-09-12 14:14:33

一.最简单的内嵌

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源文件,编写一个空函数。


点击(此处)折叠或打开

  1. #include<reg51.h>
  2. void test(void)//这是个空函数,以后要在这里写汇编
  3. {

  4. {

  5. int main(void)
  6. {
  7.     test();
  8.     return 0;
  9. }
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行开始看。

点击(此处)折叠或打开

  1. ; .\test.SRC generated from: test.c
  2. ; COMPILER INVOKED BY:
  3. ; D:\keil\C51\BIN\C51.EXE test.c BROWSE DEBUG OBJECTEXTEND TABS(2) SRC(.\test.SRC)

  4. $NOMOD51

  5. NAME    TEST

  6. P0    DATA    080H
  7. P1    DATA    090H
  8. P2    DATA    0A0H
  9. P3    DATA    0B0H
  10. T0    BIT    0B0H.4
  11. AC    BIT    0D0H.6
  12. T1    BIT    0B0H.5
  13. EA    BIT    0A8H.7
  14. IE    DATA    0A8H
  15. RD    BIT    0B0H.7
  16. ES    BIT    0A8H.4
  17. IP    DATA    0B8H
  18. RI    BIT    098H.0
  19. INT0    BIT    0B0H.2
  20. CY    BIT    0D0H.7
  21. TI    BIT    098H.1
  22. INT1    BIT    0B0H.3
  23. PS    BIT    0B8H.4
  24. SP    DATA    081H
  25. OV    BIT    0D0H.2
  26. WR    BIT    0B0H.6
  27. SBUF    DATA    099H
  28. PCON    DATA    087H
  29. SCON    DATA    098H
  30. TMOD    DATA    089H
  31. TCON    DATA    088H
  32. IE0    BIT    088H.1
  33. IE1    BIT    088H.3
  34. B    DATA    0F0H
  35. ACC    DATA    0E0H
  36. ET0    BIT    0A8H.1
  37. ET1    BIT    0A8H.3
  38. TF0    BIT    088H.5
  39. TF1    BIT    088H.7
  40. RB8    BIT    098H.2
  41. TH0    DATA    08CH
  42. EX0    BIT    0A8H.0
  43. IT0    BIT    088H.0
  44. TH1    DATA    08DH
  45. TB8    BIT    098H.3
  46. EX1    BIT    0A8H.2
  47. IT1    BIT    088H.2
  48. P    BIT    0D0H.0
  49. SM0    BIT    098H.7
  50. TL0    DATA    08AH
  51. SM1    BIT    098H.6
  52. TL1    DATA    08BH
  53. SM2    BIT    098H.5
  54. PT0    BIT    0B8H.1
  55. PT1    BIT    0B8H.3
  56. RS0    BIT    0D0H.3
  57. TR0    BIT    088H.4
  58. RS1    BIT    0D0H.4
  59. TR1    BIT    088H.6
  60. PX0    BIT    0B8H.0
  61. PX1    BIT    0B8H.2
  62. DPH    DATA    083H
  63. DPL    DATA    082H
  64. REN    BIT    098H.4
  65. RXD    BIT    0B0H.0
  66. TXD    BIT    0B0H.1
  67. F0    BIT    0D0H.5
  68. PSW    DATA    0D0H
  69. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70. ?PR?test?TEST SEGMENT CODE ;声明两个代码段;test是C源文件中个一个函数名,这个函数没有参数,这里的test前也没有下划线(记住这,后面要区分的)
  71. ;TEST是源文件名
  72. ?PR?main?TEST SEGMENT CODE ;一个C源文件中有两个函数,产生两个代码段。是不是说一个C函数对应应该代码段??
  73. ;main当然也函数名
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75.     EXTRN    CODE (?C_STARTUP)
  76.     PUBLIC    main
  77.     PUBLIC    test
  78. ; #include <reg51.h>
  79. ;
  80. ; void test()

  81.     RSEG ?PR?test?TEST
  82. ;这个段有个前缀?PR?,这个前缀说明这个段是代码段
  83. ;RESG表示test?TEST段可以重定位在任意地方
  84. test:
  85. ;这里,你可以编写任意的汇编代码。
  86.         MOV P0, #0fh;现在编写这个代码
  87.             ; SOURCE LINE # 3
  88. ; {
  89.             ; SOURCE LINE # 4
  90. ;     
  91. ; }
  92.             ; SOURCE LINE # 6
  93.     RET     
  94. ; END OF test

  95. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  96. ; int main(void)

  97.     RSEG ?PR?main?TEST
  98. main:
  99.     USING    0;表示选用寄存器组0(共有四组)
  100.             ; SOURCE LINE # 8
  101. ; {
  102.             ; SOURCE LINE # 9
  103. ;     test();
  104.             ; SOURCE LINE # 10
  105.     LCALL    test
  106. ;     
  107. ;     return 0;
  108.             ; SOURCE LINE # 12
  109.     CLR     A
  110.     MOV     R6,A
  111.     MOV     R7,A
  112. ; }            ; SOURCE LINE # 13
  113. ?C0002:
  114.     RET     
  115. ; END OF main

  116.     END


5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的86行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。
执行hex文件会看到相应的现象。


三,参数的传递

先说说参数传递的方法,keil对参数的传递是有规定的,什么数据类型对应哪个寄存器,这都是有说明的。但是我觉得这个不要刻意记。因为在生成的src文件中我可以清楚的看到参数放在
哪个寄存器中。

步骤是:
1.建立工程后,新建test.c源文件,编写一个空函数。


点击(此处)折叠或打开

  1. #include<reg51.h>
  2. void test(char dat)//这是个空函数,以后要在这里写汇编
  3. {

  4. {

  5. int main(void)
  6. {
  7.     test(55);
  8.     return 0;
  9. }

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)。


点击(此处)折叠或打开

  1. ?PR?_test?TEST SEGMENT CODE ;此时的test前面有了下划线。这是因为他有参数传递过
  2. ?DT?_test?TEST SEGMENT DATA OVERLAYABLE
  3. ?PR?main?TEST SEGMENT CODE
  4.     EXTRN    CODE (?C_STARTUP)
  5.     PUBLIC    main
  6.     PUBLIC    _test

  7.     RSEG ?DT?_test?TEST
  8. ?_test?BYTE:
  9.         dat?040: DS 1;这个伪指令是说从dat?040代表的地址开始,保留一字节的内存空间
  10. ; #include <reg51.h>
  11. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ; void test(char dat)

  13.     RSEG ?PR?_test?TEST
  14. _test:
  15.             ; SOURCE LINE # 3
  16.     MOV     dat?040,R7;将参数保存在dat?040(第十行)
  17. ;这里可以编写自己的汇编代码了
  18.             MOV P0, dat?040
  19. ; {
  20.             ; SOURCE LINE # 4
  21. ;     
  22. ; }
  23.             ; SOURCE LINE # 6
  24.     RET     
  25. ; END OF _test

  26. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. ; int main(void)

  28.     RSEG ?PR?main?TEST
  29. main:
  30.     USING    0
  31.             ; SOURCE LINE # 8
  32. ; {
  33.             ; SOURCE LINE # 9
  34. ;     test(55);;十进制55的十六进制是37
  35.             ; SOURCE LINE # 10
  36.     MOV     R7,#037H;可以看到,参数保存在R7中。
  37.     LCALL    _test
  38. ;     
  39. ;     return 0;
  40.             ; SOURCE LINE # 12
  41.     CLR     A
  42.     MOV     R6,A
  43.     MOV     R7,A
  44. ; }            ; SOURCE LINE # 13
  45. ?C0002:
  46.     RET     
  47. ; END OF main

  48.     END
5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的20行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。执行hex文件会看到相应的现象。


四,有返回值
当然,返回值也通过相应的寄存器返回的。

步骤是:
1.建立工程后,新建test.c源文件,编写一个空函数。

点击(此处)折叠或打开

  1. #include <reg51.h>

  2. char test(void)
  3. {
  4.     
  5. }

  6. int main(void)
  7. {
  8.     char dat;
  9.     
  10.     dat = test();
  11.     P0 = dat;
  12.     
  13.     return 0;
  14. }
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)。

点击(此处)折叠或打开

  1. ?PR?test?TEST SEGMENT CODE
  2. ?PR?main?TEST SEGMENT CODE
  3.     EXTRN    CODE (?C_STARTUP)
  4.     PUBLIC    main
  5.     PUBLIC    test
  6. ; #include <reg51.h>
  7. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. ; char test(void)

  9.     RSEG ?PR?test?TEST
  10. test:
  11.         MOV R7, #0h;将0放入R7中,就是返回0
  12.             ; SOURCE LINE # 3
  13. ; {
  14.             ; SOURCE LINE # 4
  15. ;     
  16. ; }
  17.             ; SOURCE LINE # 6
  18.     RET     
  19. ; END OF test

  20. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. ; int main(void)

  22.     RSEG ?PR?main?TEST
  23. main:
  24.     USING    0
  25.             ; SOURCE LINE # 8
  26. ; {
  27.             ; SOURCE LINE # 9
  28. ;     char dat;
  29. ;     
  30. ;     dat = test();
  31.             ; SOURCE LINE # 12
  32.     LCALL    test
  33. ;---- Variable 'dat?140' assigned to Register 'R7' ----
  34. ;     P0 = dat;
  35.             ; SOURCE LINE # 13
  36.     MOV     P0,R7;R7中值是返回值
  37. ;     
  38. ;     return 0;
  39.             ; SOURCE LINE # 15
  40.     CLR     A
  41.     MOV     R6,A
  42.     MOV     R7,A
  43. ; }            ; SOURCE LINE # 16
  44. ?C0002:
  45.     RET     
  46. ; END OF main

  47.     END
5.将test.c源文件从项目中删除。然后在test.src文件中编写汇编代码。(第四步中的src文件的12很37到39行有说明)
(不要删除C51S.LIB文件,否则有警告,但是教材中说要删除)
6.编译连接,就可以生成hex文件了。执行hex文件会看到相应的现象。





















阅读(2089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~