2014-12-15 3 views
2

어셈블리 언어로 변환하는 컴파일러를 작성하는 중입니다. while 루프에 문제가 있습니다. 아무리 간단한 프로그램으로 만들면 언제나 세그먼트 결함이 생깁니다. 생성 된 것 어셈블리 언어 코드 여기어셈블리 언어 While 루프

start 
    start 
     int x. 
     x = 0. 
     repeat[x <= 5] //while x is less than or equal to 5 print out x 
     start 
      print x. 
     finish 
    finish 
finish 

것 : 여기

내가 어셈블리 언어로 컴파일하고있어 프로그램의 코드입니다

PUSH 
LOAD x 
STACKW 0 
LOAD 0 
STACKW 0 

L0: 
LOAD 5 
STORE V0 
STACKR 0 
SUB V0 
BRPOS L1 

STACKR 0 
STORE V1 
WRITE V1 

BR L0 
L1: NOOP 
POP 

STOP 
V0 0 
V1 0 
x 0 

논리가 나에게 좋아 보인다,하지만 난 이 어셈블리 언어 코드를 실행할 때 세분화 오류가 발생합니다. 아무도이 문제의 원인이 무엇인지 말해 줄 수 있습니까? 감사!

+1

어셈블리 구문 중 일부를 설명 할 수 있습니까? BRPOS와 NOOP는 무엇입니까? – mohsaied

+0

"BRPOS arg"1, ACC> 0이면 arg로 점프하고 "NOOP"는 조작 없음을 의미하므로 기본적으로 아무것도하지 않습니다. while 루프는 x> 5 일 때 NOOP으로 점프합니다. – Sarah

+1

OK, 컴파일러는 소스 코드를 ** 일부 ** 어셈블리 코드로 컴파일하고 예상대로 작동합니다. 그래서, ** 당신이 사용하는 어셈블리 언어 구문은 무엇입니까? ** 당신이 타겟으로하는 CPU 아키텍처는 무엇이며, 컴파일러가 생성 한 어셈블리 코드를 어셈블하는 데 사용하는 어셈블러는 무엇입니까? ** 어셈블러와 링커가 명령 줄에서 실행되는 경우 정확한 어셈블러와 링커 명령과 매개 변수는 무엇입니까? 어셈블러 및 링커가 일부 IDE에서 실행되는 경우 어느 것입니까? – nrz

답변

0

"L0 :"다음에 NOOP를 넣는 것이 필요한 것으로 밝혀졌으며 세그먼트 화 오류를 제거하고 올바르게 작동했습니다. 따라서 최종 프로그램은 다음과 같습니다 :

PUSH 
LOAD x 
STACKW 0 
LOAD 0 
STACKW 0 

L0: NOOP 
LOAD 5 
STORE V0 
STACKR 0 
SUB V0 
BRPOS L1 

STACKR 0 
STORE V1 
WRITE V1 

BR L0 
L1: NOOP 
POP 

STOP 
V0 0 
V1 0 
x 0 
1

지침에 대한 설명이 없어도 대답하기가 어렵습니다.
...
추가가 표시되지 않습니다. 그렇다면 어떻게하면 표시되는 값을 증가시킬 수 있습니까?
그리고 ...
루프의 모든 반복은 LOAD 5부터 시작됩니다.이 루프를 루프 외부/외부에 배치하면 안됩니까?