어셈블리에서 간단한 프로그래밍을 수행하는 방법에 대한 이해를 돕기 위해 노력해 왔습니다. 나는 튜토리얼의 안녕하세요 세계 프로그램을 다룰 것이며 그들이 설명했던 대부분의 것들이 의미가 있지만, 그것들은 정말로 그것을 덮어 쓰고 있습니다. 프로그램의 다른 부분을 이해하는데 도움이 필요합니다. 자습서 예제는 다음과 같습니다 -기본 어셈블리 이해에 대한 지침이 필요합니다.
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을 설정하기위한 표준 명령어입니까?
아마도 누군가가 좀 더 철저한 튜토리얼을 추천 할 수 있습니까? 나는 어셈블리로 더러워지기를 기대하고있다. 당신이 원한다면 ... "핵심 기본"중 일부를 스스로 가르쳐야한다. 모든 도움에 감사드립니다!
호기심에서 벗어나서 어셈블리를 배우고 싶다면 무엇이 중요할까요? 나는 왜하고 싶은지에 대해 비판하지 않고 단지 이유를 궁금해합니다. 고급 언어를 사용했기 때문에 개인적으로 어셈블리를 배울 필요가 없습니다. 내가 놓친 게 있니? –
데이터 섹션이 텍스트 섹션에 붙여 넣어지지 않습니다. 코드는 데이터를 원하는대로 사용할 수 있습니다. 'db'는 raw 바이트, 문자열 "Hello, world!"를 나타내는 바이트를 의미합니다. 줄 바꿈 (0xa, 16 진수 10, ascii의 줄 바꿈)이 뒤 따른다. ''len equ $ - msg'는 "여기서 lus가 msg와 같은 수임을 선언한다"는 것을 의미하고, "here minus msg"는 물론 그 사이의 바이트 수, 즉 문자열의 길이이다. 'mov ebx, 1'은 단지'ebx'를 1로 설정하지만, 값 1은 파일 핸들로서 사용될 때 STDOUT을 의미합니다. – harold
@wagregg, 어떤 종류의 베어 메탈 개발을 해본 적이 있습니까? –