알고리즘 티 타임 시리즈 - 복습 어 셈 블 리 (6) [AT & T 어 셈 블 리 이해 절]
우선 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
메모리 의 일반적인 할당 방식 은 다음 과 같 습 니 다.
첫째, 정적 분 배 는 모든 이름 이 컴 파일 할 때 특정한 저장 위 치 를 연결 합 니 다.실행 할 때 두 번 째, 스 택 분 배 를 바 꿀 수 없고 활동 할 때 시스템 스 택 에 눌 러 넣 을 수 없습니다.셋째, 쌓 아 분배 하고 임 의 순서 로 분배 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.