悬而未决:在C51中子函数使用C51与汇编交互编程的问题

C51源文件选段如下:

void main()
{
 JN1 = 1;
 JN2 = 0;
 while(1)
 {
  JN1 = 0;
  Delay(1);

  JN1 = 1;
  Delay(1);

  
  
//  Pulse();
 }

}

void Delay(u8 counter)
{
 for( ; counter > 0; counter -- )
 {

//

//注意以下程序段在交互编译后生成的汇编SRC文件
// 

 #pragma asm
   NOP
   NOP
   NOP
   NOP
  #pragma endasm
 
 }
}

 

交互编译后生成的汇编SRC文件选段如下:

 RSEG  ?PR?main?MAIN
main:
 USING 0
   ; SOURCE LINE # 18
; {
   ; SOURCE LINE # 19
;  JN1 = 1;
   ; SOURCE LINE # 20
 SETB  JN1
;  JN2 = 0;
   ; SOURCE LINE # 21
 CLR   JN2
?C0001:
;  while(1)
   ; SOURCE LINE # 22
;  {
   ; SOURCE LINE # 23
;   JN1 = 0;
   ; SOURCE LINE # 24
 CLR   JN1
;   Delay(1);
   ; SOURCE LINE # 25
 MOV   R7,#01H
 LCALL _Delay
;
;   JN1 = 1;
   ; SOURCE LINE # 27
 SETB  JN1
;   Delay(1);
   ; SOURCE LINE # 28
 MOV   R7,#01H
 LCALL _Delay
;
;   
;   
; //  Pulse();
;  }
   ; SOURCE LINE # 33
 SJMP  ?C0001
; END OF main

;
; }
;
; void Delay(u8 counter)

 RSEG  ?PR?_Delay?MAIN
_Delay:
 USING 0
   ; SOURCE LINE # 37
;---- Variable 'counter?140' assigned to Register 'R7' ----
; {
   ; SOURCE LINE # 38
;  for( ; counter > 0; counter -- )
   ; SOURCE LINE # 39
?C0004:
 MOV   A,R7
 SETB  C
 SUBB  A,#00H
 JC    ?C0007
;  {
   ; SOURCE LINE # 40
;   counter ++;
   ; SOURCE LINE # 41
 INC   R7
;   #pragma asm
;    NOP
   NOP
;    NOP
   NOP
;    NOP
   NOP
;    NOP
   NOP
;   #pragma endasm
;  
;  }
   ; SOURCE LINE # 49
 DEC   R7
 SJMP  ?C0004
; }
   ; SOURCE LINE # 50
?C0007:

;

;注意,C51调用子函数后,没有执行NOP语句,而是直接返回主函数。

;
 RET   
; END OF _Delay

后记:

关于这个问题,暂无头绪,有知道答案的朋友请联系我,谢谢指教!

posted @   TechStone  阅读(286)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示