C 와 어 셈 블 리 혼합 프로 그래 밍 의 실현 예시

지난 호 에 서 는 링크 방식 으로 서로 다른 임무 에 대한 호출 을 했 는데 실현 효과 가 좋 았 습 니 다.그러나 임 무 를 진행 하 는 과정 에서 왔다갔다 하 는 전환 을 하지 못 하고 반드시 완성 해 야 합 니 다.이것 은 단점 입 니 다.실시 간 운영 체 제 를 사용 하지 않 으 면 어떻게 전환 합 니까?그러면 만능 어 셈 블 리 를 말 해 야 합 니 다.어 셈 블 리 를 사용 하면 임무 의 전환 을 할 수 있 습 니 다.
우선,c 와 어 셈 블 리 의 공동 사용 은 세 가지 상황 에 대해 다음 과 같다 는 것 을 알 고 있 습 니 다.
1.C 언어 내 연 어 셈 블 리
일단 코드 를 볼 게 요.

__inline int ADD(int input1,int intput2)
{
	int output;
	__asm{
		ADD output,input1,intput2
	}
	return output;
}


int Number(void);

int value;
int main(void)
{
	int a = 12,b = 13;
	while(1)
	{
		value = ADD(a,b);
	}
}
실행 효과
在这里插入图片描述
0x 19 의 십 진법 은 25 이다.
2.C 언어 호출 어 셈 블 리 함수
어 셈 블 리 함 수 를 호출 하여 먼저.s어 셈 블 리 파일 을 만 듭 니 다.
在这里插入图片描述
생 성 완료 후 어 셈 블 리 파일 에 어 셈 블 리 함 수 를 기록 합 니 다.

				AREA |.text|,CODE,READONLY
				EXPORT Get_Number
Get_Number
		MOV		R0,#761
		BX		LR
		ALIGN
		END	
그리고main함 수 를 써 서 호출 합 니 다.

int Get_Number(void);

int value;
int main(void)
{
	while(1)
	{
		value = Get_Number();
	}
}
실행 효과 보기
在这里插入图片描述
3.어 셈 블 리 코드 호출 C 언어 함수
어 셈 블 리 파일 에 다음 코드 를 입력 하 십시오.

				AREA 	|.text|,CODE,READONLY
				IMPORT Get_Number
				IMPORT Number
				
				EXPORT __main
				ENTRY
				
__main 	
				LDR		R1,=Number
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Number
				
				END
C 파일 에 다음 코드 를 입력 하 십시오.

int Number;

int Get_Number(void)
{
	Number = Number + 32;
	
	return Number;
}
실행 효과 한번 볼 게 요.
在这里插入图片描述
在这里插入图片描述
계속 아래로 실행
在这里插入图片描述
숫자 가 100 에서 132 로 바 뀌 기;기능 을 실현 하 다
설명:

/*
AREA    
        :    
    AREA      1 ,  2 ,……    
    AREA                。  ,        ,      “|”   , :|1_test| 。    
              (    )     ,         。       :    
    ― CODE   :       ,   READONLY 。    
    ― DATA   :       ,   READWRITE 。    
    ― READONLY   :       ,      READONLY 。    
    ― READWRITE   :         ,         READWRITE 。    
    ― ALIGN   :     ALIGN   。    ,ELF(       )              ,         0~31,        2     。    
    ― COMMON   :           ,             。        COMMON          。 
	
*/

/*
MOV
	    	            
LDR 
	                
BX	
	             、   、    
BL
	    

LR r14
(1)   bl  blx         ,r14       ,           
(2)       ,           R14                

ENTRY           。                 ENTRY,                    。
		        ,                           。                ENTRY。

ENDP      PROC        . (end procedure)
ENDS      SEGMENT      .   (end segment)
END         .
*/
사용BL점프
BL 명령 은 PC 레지스터 의 값 을 LR 레지스터 에 저장 하 는 동시에 되 돌아 오 는 점프 명령 입 니 다.
그래서.
어 셈 블 리 프로그램 에서 C 언어 함수 두 개 를 호출 할 것 이 라 고 가정 합 니 다.
사실 로 증명 하면 돌아 올 수 있다.
어 셈 블 리 코드 를 다음 과 같이 수정 합 니 다.

				AREA 	|.text|,CODE,READONLY
				IMPORT Get_Number
				IMPORT Number
				IMPORT Get_Value
				IMPORT Value
				
				EXPORT __main
				ENTRY
				
__main 	
				LDR		R1,=Number
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Number
				
				LDR		R1,=Value
				MOV		R0,#100
				STR		R0,[R1]
				BL		Get_Value
				
				END
대응 하 는 c 파일 은

int Number;

int Get_Number(void)
{
	Number = Number + 32;
	
	return Number;
}

int Value;

int Get_Value(void)
{
	Value = Value - 32;
	
	return Value;
}
코드 실행 상황 보기
먼저 첫 번 째 함수 의 집행 을 진행 하여 숫자 가 바 뀌 었 다.
在这里插入图片描述
다음은 두 번 째 함수 가 실 행 됩 니 다.숫자 가 바 뀌 었 습 니 다.
在这里插入图片描述
BL 점프 가 되 돌아 갈 수 있 음 을 증명 합 니 다.
어 셈 블 리 와 C 언어의 프로 그래 밍 사고방식 을 사용 하여 약간의 제한 을 깨 뜨 릴 수 있다
뒤에서 하 는PC점프 에 도 기 초 를 다 졌 다.
C 와 어 셈 블 리 혼합 프로 그래 밍 의 실현 예시 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C 와 어 셈 블 리 혼합 프로 그래 밍 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기