deer-develop / study

2 stars 0 forks source link

6장 어셈블러 #27

Open hyewoncc opened 4 months ago

hyewoncc commented 4 months ago

6.1 배경

두 번째로 관찰할 수 있는 것은 주석 및 레이블 선언은 아무런 코드도 생성하지 않는다는 사실인데... p134

6.2 핵 기계어 명세

레이블 기호: 의사 명령어는 프로그램의 다음 명령어를 저장하고 있는 ROM의 주소를 기호 xxx가 참조하도록 정의한다. 레이블 기호가 한 번 정의되면 아셈블리 프로그램 내 어디서든 사용할 수 있으며, 심지어 그 기호를 정의한 라인 앞부분에서도 쓸 수 있다. p137

6.3.2 기호 처리

어셈블리 프로그램에서는 기호 레이블(goto 명령어 목적지)을, 그 기호가 정의된 라인 앞부분에서도 사용할 수 있다. ...이 문제는 코드를 처음부터 끝까지 두 번 읽는 2패스 어셈블러로 해결한다. 이 어셈블러가 1차로 코드를 읽을 때는 기호 테이블을 만들고 레이블 기호들을 모두 테이블에 기록하며, 아무런 코드도 생성하지 않는다. 2차로 코드를 읽을 때는 앞에서 만든 기호 테이블을 활용해서 변수 기호들을 처리하고 2진 코드를 생성한다. p138

앞부분에 아직 정의되지 않은 레이블도 쓸 수 있다 하는 얘기가 나와서, 그게 어떻게 가능한지 궁금했는데 해결이 되었다
근데 효율성을 따지면 당연히 코드를 한 번만 읽는 게 나을 것 같은데, 왜 이렇게 하나 해서 간단하게 찾아봤는데 1패스 어셈블러는 정의되지 않은 기호 레이블이 나오면 테이블에 주소값과 함께 넣어 놓고, 나중에 걔를 발견했을 때 주소값을 대체시킨다고 한다 그리고 구문 분석이 끝났을 때 대체되지 않은 게 있으면 오류를 발생시킨다 오히려 메모리 효율 상으로 2패스가 더 뛰어나다는데 1패스가 처리하는 방식이랑 연관이 있을지... 현대 컴퓨터에서는 사실 저정도 메모리 효율을 따질 필요는 없다고 합니다

myeongjae-kim commented 4 months ago

명재: 자바스크립트의 호이스팅이랑 비슷하네

myeongjae-kim commented 4 months ago

노엄 촘스키 언어 구분에서 한 번만 읽어도 의미를 알 수 있는 언어와, 두 번 이상 읽어야 의미를 알 수 있는 언어를 구분한다.

한 번만 읽어도 의미를 알 수 있는 언어의 대표적인 예시가 정규표현식.