混合编程调用子程序疑问?
时间:10-02
整理:3721RD
点击:
按照2812开发板的一个混和编程调用子程序做个实验
主程序如下:
int add(int a,int b);
int x=0,y=0,z=0;
main()
{
x=3; y=17;
while ( 1 )
{
z=add(x,y);
x+=1;
y+=1;
}
}
调用情况时,C子程序另存文件名add.c如下:
int add(int a,int b);
{
return(a+b);
}
C相对应的Disassembly相应段为
0800BF add:
0800BF FE02 ADDB SP,#2
0800C0 9742 MOV *-SP[2],AH
0800C1 9641 MOV *-SP[1],AL
0800C2 9242 MOV AL,*-SP[2]
0800C3 9441 ADD AL,*-SP[1]
0800C4 FE82 SUBB SP,#2
0800C5 0006 LRETR
而调用调用汇编,asm程序文件add.asm如下:
FP .set XAR2
.file \"add.c\"
.sect \".text\"
.global _add
.sym _add,_add, 36, 2, 0
.func 2
_add:
; .line 2
;* AL assigned to _a
.sym _a,0, 4, 17, 16
;* AH assigned to _b
.sym _b,1, 4, 17, 16
.sym _a,-1, 4, 1, 16
.sym _b,-2, 4, 1, 16
ADDB SP,#2
MOV *-SP[2],AH ; |3|
MOV *-SP[1],AL ; |3|
; .line 3
MOV AL,*-SP[2] ; |4|
ADD AL,*-SP[1] ; |4|
; .line 4
SUBB SP,#2 ; |4|
LRETR
; return occurs
.endfunc 5,000000000h,2
汇编情况下的disassembly和C的相同
为什么汇编的子程序中虚多加一些?什么作用?
主程序如下:
int add(int a,int b);
int x=0,y=0,z=0;
main()
{
x=3; y=17;
while ( 1 )
{
z=add(x,y);
x+=1;
y+=1;
}
}
调用情况时,C子程序另存文件名add.c如下:
int add(int a,int b);
{
return(a+b);
}
C相对应的Disassembly相应段为
0800BF add:
0800BF FE02 ADDB SP,#2
0800C0 9742 MOV *-SP[2],AH
0800C1 9641 MOV *-SP[1],AL
0800C2 9242 MOV AL,*-SP[2]
0800C3 9441 ADD AL,*-SP[1]
0800C4 FE82 SUBB SP,#2
0800C5 0006 LRETR
而调用调用汇编,asm程序文件add.asm如下:
FP .set XAR2
.file \"add.c\"
.sect \".text\"
.global _add
.sym _add,_add, 36, 2, 0
.func 2
_add:
; .line 2
;* AL assigned to _a
.sym _a,0, 4, 17, 16
;* AH assigned to _b
.sym _b,1, 4, 17, 16
.sym _a,-1, 4, 1, 16
.sym _b,-2, 4, 1, 16
ADDB SP,#2
MOV *-SP[2],AH ; |3|
MOV *-SP[1],AL ; |3|
; .line 3
MOV AL,*-SP[2] ; |4|
ADD AL,*-SP[1] ; |4|
; .line 4
SUBB SP,#2 ; |4|
LRETR
; return occurs
.endfunc 5,000000000h,2
汇编情况下的disassembly和C的相同
为什么汇编的子程序中虚多加一些?什么作用?
有很多是引用说明呀!
还有一些。SECT等是伪指令
.func .sym 哪位兄弟能给解释一下?
我没用过28的,你看下书后的附录应该有讲解