2013-06-12 1 views
1

어셈블리에서 간단한 프로그래밍을 수행하는 방법에 대한 이해를 돕기 위해 노력해 왔습니다. 나는 튜토리얼의 안녕하세요 세계 프로그램을 다룰 것이며 그들이 설명했던 대부분의 것들이 의미가 있지만, 그것들은 정말로 그것을 덮어 쓰고 있습니다. 프로그램의 다른 부분을 이해하는데 도움이 필요합니다. 자습서 예제는 다음과 같습니다 -기본 어셈블리 이해에 대한 지침이 필요합니다.

section .text 
    global main  ;must be declared for linker (ld) 
main:    ;tells linker entry point 
    mov edx,len  ;message length 
    mov ecx,msg  ;message to write 
    mov ebx,1  ;file descriptor (stdout) 
    mov eax,4  ;system call number (sys_write) 
    int 0x80  ;call kernel 

    mov eax,1  ;system call number (sys_exit) 
    int 0x80  ;call kernel 

section .data 
msg db 'Hello, world!', 0xa ;our dear string 
len equ $ - msg    ;length of our dear string 

텍스트 섹션과 데이터 섹션이 있습니다. 데이터 섹션은 프로그램에 대한 사용자 정의 정보를 보유하고있는 것으로 보입니다. 프로그램의 "프레임"이 텍스트 섹션에 있고 "고기"가 데이터 섹션에있는 것처럼 보입니다 ...? 컴파일 할 때 프로그램이 텍스트 섹션에 채워진 데이터 섹션의 데이터로 텍스트 섹션을 실행한다고 가정합니다. bss/text/data 섹션 상호 작용은 내게 외국의 일종입니다. 또한 데이터 섹션에서 msg와 len .... 변수는? 언급되면서, 나는 그들이 무엇을 만들 것인지에 관해 명확히하지 않고있는 약간의 정보에 뒤이어 계속된다. msg 다음에 db가옵니다. 이것은 무엇을 의미합니까? 그런 다음 텍스트와 0xa, 0xa는 무엇입니까? 또한 len 다음에 equ가옵니다.이 평균은 같습니까? len은 dollarsign에서 msg 변수를 뺀 값입니까? 달러 기호는 무엇입니까? 일종의 연산자 요? 또한 텍스트 섹션의 지침, mov ebx, 1 명백하게, 또는 STDOUT을 활용하도록 프로그램에 지시하는 것 같습니다. ebx 레지스터로 1을 이동하는 것이 stdout을 설정하기위한 표준 명령어입니까?

아마도 누군가가 좀 더 철저한 튜토리얼을 추천 할 수 있습니까? 나는 어셈블리로 더러워지기를 기대하고있다. 당신이 원한다면 ... "핵심 기본"중 일부를 스스로 가르쳐야한다. 모든 도움에 감사드립니다!

+0

호기심에서 벗어나서 어셈블리를 배우고 싶다면 무엇이 중요할까요? 나는 왜하고 싶은지에 대해 비판하지 않고 단지 이유를 궁금해합니다. 고급 언어를 사용했기 때문에 개인적으로 어셈블리를 배울 필요가 없습니다. 내가 놓친 게 있니? –

+2

데이터 섹션이 텍스트 섹션에 붙여 넣어지지 않습니다. 코드는 데이터를 원하는대로 사용할 수 있습니다. 'db'는 raw 바이트, 문자열 "Hello, world!"를 나타내는 바이트를 의미합니다. 줄 바꿈 (0xa, 16 진수 10, ascii의 줄 바꿈)이 뒤 따른다. ''len equ $ - msg'는 "여기서 lus가 msg와 같은 수임을 선언한다"는 것을 의미하고, "here minus msg"는 물론 그 사이의 바이트 수, 즉 문자열의 길이이다. 'mov ebx, 1'은 단지'ebx'를 1로 설정하지만, 값 1은 파일 핸들로서 사용될 때 STDOUT을 의미합니다. – harold

+0

@wagregg, 어떤 종류의 베어 메탈 개발을 해본 적이 있습니까? –

답변

7

[NB - 당신이 사용하고있는 어셈블러 방언을 모르기 때문에이 부분의 일부 부분에서 "가장 좋은 추측"을했습니다. 누군가 명확하게 설명하면 도움이 될 것입니다.]

프로그램의 "프레임"이 텍스트 섹션에 있고 "고기"가 데이터 섹션에있는 것처럼 보입니다 ... ...?

텍스트 섹션에는 프로그램을 구성하는 실행 가능 명령어가 들어 있습니다. 데이터 섹션에는 프로그램이 작동 할 데이터가 들어 있습니다. 두 가지 섹션이있는 이유는 프로그램 로더와 운영 체제가 사용자에게 몇 가지 보호 기능을 제공 할 수 있도록 허용하기 위해서입니다. 텍스트 섹션은 예를 들어 읽기 전용 메모리에로드 할 수 있으며 데이터 섹션은 "실행 불가능"으로 표시된 메모리에로드 될 수 있으므로 코드가 실수로 (또는 악의적으로) 해당 지역에서 실행되지 않습니다.

나는 컴파일 된 프로그램이 텍스트 섹션에 채워진 데이터 섹션의 데이터를 텍스트 섹션을 실행 같은데요?

프로그램 (텍스트 섹션의 지침)은 일반적으로 기호를 참조하고 데이터 섹션의 데이터를 조작합니다 (사용자가 요구하는 경우).

bss/text/data 섹션 상호 작용은 내게 외국의 일종입니다.

BSS 섹션은 모두 0으로 초기화된다는 점을 제외하고는 데이터 섹션과 유사합니다. 즉, 실제로 실행 파일에서 공간을 차지할 필요가 없습니다. 프로그램 로더는 메모리에서 0 바이트의 적절한 크기의 블록을 만들어야합니다. 프로그램에 BSS 섹션이 없습니다.

또한 msg와 len .... 변수의 데이터 섹션에서? 언급되면서, 나는 그들이 무엇을 만들 것인지에 관해 명확히하지 않고있는 약간의 정보에 뒤이어 계속된다. msg 다음에 db가옵니다. 이것은 무엇을 의미합니까?

msglen은 일종의 변수입니다. msg은 다음 문자열을 가리키는 전역 변수입니다. dbdata byte을 의미합니다. 이는 어셈블러가 뒤따라 오는 리터럴 바이트를 방출해야 함을 나타냅니다. len은 문자열의 길이로 설정됩니다 (아래 참조).

그런 다음 텍스트와 0xa는 무엇을위한 0xa입니까?

0x0a은 ASCII 개행 문자의 16 진수 값입니다.

또한 len 다음에 equ가옵니다.이 평균은 같습니까?

예.

len은 dollarsign 빼기 msg 변수입니까? 달러 기호는 무엇입니까? 일종의 연산자 요?

$은 "현재 위치"를 의미합니다. 어셈블러가 작업을 진행함에 따라 카운터에서 생성되는 데이터의 바이트 수와 코드를 추적합니다. 따라서이 코드는 다음과 같이 말합니다. "현재 위치에서 msg 레이블의 위치를 ​​빼고 해당 번호를 len"으로 저장하십시오. "현재 위치"가 문자열의 끝 부분을 지나치므로 길이를 가져옵니다.

텍스트 섹션의 지침, mov ebx, 1이 분명히 STDOUT을 사용하도록 프로그램에 지시하는 것 같습니다. ebx 레지스터로 1을 이동하는 것이 stdout을 설정하기위한 표준 명령어입니까?

프로그램은 int 0x80 명령을 통해 시스템 호출을하고 있습니다. 그 전에는 OS가 예상하는 방식으로 설정해야합니다.이 경우 ebx11을 넣고 다른 세 개의 레지스터와 함께 stdout을 의미하는 것으로 보입니다. 메시지 길이는 edx이고 메시지의 포인터는 ecx 및 시스템 호출 번호는 eax입니다. 나는 당신이 리눅스에 있다고 생각할 것이다 - 당신은 너무 많은 문제없이 구글로부터 시스템 콜 테이블을 찾을 수있다.

아마도 누군가가 좀 더 철저한 튜토리얼을 추천 할 수 있습니까?

미안하지만 내 머리 꼭대기에서 떨어져 있지 않습니다.

+0

이것은 내 머리 속에서 이것을 함께 모을 수 있도록 나에게 좋은 정보이다. 탁아 단계. 내가 제공하는이 샘플 코드에서 각 라인을 완전히 이해하려고 노력할 때 분명히 답을 찾을 것입니다. 그렇다면 더 많은 두통으로 인해 코드가 생성됩니다. 많이 감사합니다 칼! – 0xhughes

+0

아무런 문제가 없으면, 내가 당신의 이해를 돕기 위해 더 육체가 될 수있는 것이 있는지 알려주십시오. –

+0

가능한 튜토리얼 : http://www.drpaulcarter.com/pcasm - 충분히 낮은 수준은 아니지만 여러 OS에서 작동 할 수 있습니다. 기타 (Linux 지향) http://asm.sourceforge.net - (이것이있을 수도 있습니다). 리눅스를 사용하지 않는다면, 예제 코드는 작동하지 않을 것이지만, 여전히 공부하기에 유용합니다 ... –

관련 문제