2016-06-19 5 views
1

저는 8086 어셈블러로 코딩 중이며 흥미로운 질문에 답했습니다. 주제는 괄호를 평가하는 것입니다. 이 질문이 Java 또는 C 인 경우 숫자와 피연산자의 두 스택을 정의하기 만하면됩니다. Assembly에서 비슷한 것을 할 수 있습니까? 내가 아는 한, 스택은 데이터 세그먼트의 마지막 메모리 셀에 정의됩니다. 다른 데이터 세그먼트를 정의하면 사용 가능한 다른 스택이 있습니까?어셈블러에 두 개의 스택이 있습니까?

다른 정보 : 처음에는 입력 크기를 알 수 없으므로 가능한 한 효율적으로 프로그램을 작성해야합니다.

감사합니다.

답변

2

모든 세그먼트 레지스터가 가지고 .COM 스타일의 프로그램을 개발하는 경우 지금까지 내가, 스택은 데이터 세그먼트의 마지막 메모리 셀에 difined 알고로

마찬가지입니다 이 값은 DOS가 stackpointer를이 64KB 메모리의 하이 엔드에 놓은 위치와 같습니다.

다른 데이터 세그먼트를 디프 로프하는 경우 다른 유용한 스택이 있습니까?

다른 스택을 위해 데이터 세그먼트을 변경할 필요가 없습니다. SS : SP 레지스터 쌍을 변경하고 새로 정의 된 스택을 사용하십시오.
스택은 SP에서 시작하여 아래쪽으로 확장됩니다. 따라서 SP = 4096이면 스택은 4096 바이트가됩니다. (어쨌든 어쩌면 잘못된 것일 수도 있습니다)

+0

감사합니다. 이게 효과가 있을까요? 스택 100h 푸시 도끼 푸시 bx ... mov 인 도끼, SS mov 인 BX, SP mov 인 SS, 0f00h mov 인 SP, 0f00h 내가 한 도끼에 스택이 그리고보다 : BX와 SS의 다른 스택 : SP는? – DoronZor

+0

SS : SP로 정의 된 스택은 한 번에 1 개만 활성화 할 수 있습니다. 스태킹 목적으로 두 번째 메모리 영역을 설정할 수 있지만 SS : SP 쌍에서이 영역에 대한 전체 포인터를로드해야합니다. –

+0

또한 'mov ss, 0f00h'와 같은 명령어가 존재하지 않습니다! 세그먼트 레지스터에서 즉시 값 (수)을 이동할 수 없습니다. –

0

((a+b) + (c))과 같은 표현을 평가하려면 stack data structures 두 개를 사용 하시겠습니까?

입력시 구문 오류가 프로그램을 중단시키지 않도록주의해야한다면 그 중 하나에 call stack (sp)을 사용할 수 있습니다. (예 : bpsp과 비교하여 호출 스택에 저장중인 스택 데이터 구조를 비울 때 감지).

sp을 다른 스택 데이터 구조를 가리 키도록 변경하지 마십시오. 다른 레지스터 (예 : si)를 사용하여 액세스하십시오.

lodsw을 사용하여 도끼를 튀길 수 있습니다 (스택이 성장하는 방향에 맞게 방향 플래그가 설정 됨). 또는 stosw을 사용하여 di이 가리키는 스택으로 도끼를 밀어 넣으십시오. 그러나 그들은 다른 인덱스 레지스터를 사용하기 때문에 가치가 없습니다 (특히 방향 플래그를 항상 변경하지 않음).

두 번째 스택 데이터 구조의 경우 정상적인 mov로드/저장과 add/subb si, 2을 적절하게 사용하십시오.

스택 중 하나를 통화 스택 (sp)으로 유지하는 것이 불편한 것으로 판명되면 그 중 하나를 수행하지 마십시오.