알고리즘 티 타임 시리즈 - 복습 어 셈 블 리 (6) [AT & T 어 셈 블 리 이해 절]

4237 단어
더 읽 기
우선 AT & T 어 셈 블 리 의 의 미 를 살 펴 보 자.
 
 
마디.
속뜻
.text
컴 파 일 된 기계 코드
.rodata
pintf 와 switch 문장의 문자열 과 상수 값 같은 데이터 만 읽 습 니 다.
.data
초기 화 된 전역 변수
.bss
초기 화 되 지 않 은 전역 변수
.symtab
기호 표, 프로그램 에 정의 되 고 인 용 된 함수 와 전역 변수의 정 보 를 저장 합 니 다.
.rel.text
링크 기 가 대상 파일 과 다른 파일 을 결합 할 때. text 섹 션 의 정 보 를 수정 해 야 합 니 다.
.rel.data
모듈 에 의 해 정의 되 고 인 용 된 모든 전역 변수의 정보
.debug
디 버 깅 기호 표
.line
원본 C 프로그램의 줄 번호 와. text 절 에서 기계 명령 사이 의 맵
.strtab
'systab' 과 'debug 절' 의 기호 표를 포함 하 는 문자열 표
 
위의 목록 은 추상 적일 수 있 습 니 다. 우 리 는 C 프로그램 에서 생 성 된 중간 어 셈 블 리 코드 분석:
#include 

void main(){

   char *x="xxxx";

   char y[]="yy";//y 16  ASCII  97,9797     31097

   printf("%s-----%s",x,y);

   exit(0);

}


   우 리 는 gcc - S testcr. c 를 사용 하여 컴 파일 생 성 된 어 셈 블 리 코드 를 보 았 습 니 다. (이해 하기 위해 생 성 된 어 셈 블 리 코드 를 주석 하 였 습 니 다)
.file	"testcr.c"

	.section	.rodata

.LC0:

	.string	"xxxx"#  char *  

.LC1:

	.string	"%s-----%s"

	.text

.globl main

	.type	main, @function

main:

	pushl	%ebp

	movl	%esp, %ebp

	andl	$-16, %esp

	subl	$32, %esp#  32     ,        

	movl	$.LC0, 24(%esp)#x      (4     ),    ,    ,            

	movw	$31097, 29(%esp)#  'yy'  main     ,   y        

	movb	$0, 31(%esp)#  NULL  ,       

	movl	$.LC1, %eax

	leal	29(%esp), %edx

	movl	%edx, 8(%esp)

	movl	24(%esp), %edx

	movl	%edx, 4(%esp)

	movl	%eax, (%esp)

	call	printf

	movl	$0, (%esp)

	call	exit

	.size	main, .-main

	.ident	"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

	.section	.note.GNU-stack,"",@progbits

 


 
 
MAIN 함수 에서 char * 는 읽 기 전용 데이터 세그먼트 에 할당 되 며, 실제 사용 시 프로그램 스 택 에 만 포인터 공간 을 할당 합 니 다.char [] 프로그램 스 택 에서 공간 을 분배 한 다음 에 movl, movw 와 같은 어 셈 블 리 를 사용 하여 스 택 에 값 을 직접 넣 습 니 다.그렇다면 다른 함수 에서 설명 한 것 은 다음 프로그램 에서 볼 수 있 듯 이 여전히 그렇다.
 
#include 

void myprinf(){

   char *x="xxxx";

   char y[]="yy";//y 16  ASCII  97,9797     31097

   printf("%s-----%s",x,y);

}

void main(){

   int num=1;

   myprint();

   exit(0);

}


 
 
생 성 된 중간 어 셈 블 리 코드 는:
.file	"testcr.c"

	.section	.rodata

.LC0:

	.string	"xxxx"

.LC1:

	.string	"%s-----%s"

	.text

.globl myprinf

	.type	myprinf, @function

myprinf:

	pushl	%ebp

	movl	%esp, %ebp

	subl	$40, %esp

	movl	$.LC0, -16(%ebp)

	movw	$31097, -11(%ebp)

	movb	$0, -9(%ebp)

	movl	$.LC1, %eax

	leal	-11(%ebp), %edx

	movl	%edx, 8(%esp)

	movl	-16(%ebp), %edx

	movl	%edx, 4(%esp)

	movl	%eax, (%esp)

	call	printf

	leave

	ret

	.size	myprinf, .-myprinf

.globl main

	.type	main, @function

main:

	pushl	%ebp

	movl	%esp, %ebp

	andl	$-16, %esp

	subl	$32, %esp

	movl	$1, 28(%esp)

	call	myprint

	movl	$0, (%esp)

	call	exit

	.size	main, .-main

	.ident	"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"

	.section	.note.GNU-stack,"",@progbits


 
 
메모리 의 일반적인 할당 방식 은 다음 과 같 습 니 다.
첫째, 정적 분 배 는 모든 이름 이 컴 파일 할 때 특정한 저장 위 치 를 연결 합 니 다.실행 할 때 두 번 째, 스 택 분 배 를 바 꿀 수 없고 활동 할 때 시스템 스 택 에 눌 러 넣 을 수 없습니다.셋째, 쌓 아 분배 하고 임 의 순서 로 분배 한다.
 

좋은 웹페이지 즐겨찾기