2010-07-19 2 views
2

편집 : 내 질문에 답합니다. 아래를 참조하십시오. -_- 다음과 같이 이상하게 작동하는 변수 (인텔 8086)

내가 .DATA 세그먼트에 정의 된 변수가 :

retVal DW 0100h ;stores hex fraction of the intermediate value. Starts at 1.00 

이 내가 추가하거나 내 반환 값을 얻기 위해 할 빼기 값입니다.

는 코드 세그먼트에 표시 처음으로 다음과 같은 점에 :

sub [retVal], ax  ; 

내가 디버거를 사용했으며,이 작업시 다음 사항을 확인 할 수 있습니다, 도끼 레지스터입니다 : 0000H .

그러나, 나는 바로 전에 다음 코드 줄을 추가하는 경우 :

mov dx, 0100h; 
mov [retVal], 0100h; 

내가 (또한 잘못된) 완전히 다른 가치를 얻을. 나는 꽤 당황 스럽다. 근본적으로 변수를 잘못 사용하고 있습니까? 변수가 원래 초기화 된 동일한 값을로드하는 (그리고 아직 수정되지 않은)로드가 결과를 변경하는 이유는 없습니다.

아이디어가 있으십니까? 그렇다면 누군가 CodeView를 통해 변수의 가치를 추적하는 방법을 생각 나게 할 수 있습니까? (내가 사용중인 DOSBox 디버거)

+0

문제의 원인이되는 것으로 생각되는 코드 줄만 표시하면 문제의 원인을 추측 할 수 없습니다. 보고있는 문제를 보여주는 짧은 예를 게시하십시오. * 예상 * 및 * 실제 * 결과를 모두 정확하게 명시하는 것을 잊지 마십시오. –

답변

0

해당 프로그램이 서브 루틴입니까?

그렇다면 서브 루틴을 반복적으로 호출하면 변경 한 변수가 재설정됩니까?

변수를 다시 선언하지 않으면 이전에 선언 된 값을 두 번째 또는 미래의 서브 루틴 실행 시간으로 사용하지 않고 처음 실행이 끝날 때 변경 한 값을 사용합니다.

0

이것이 실제 8086 (즉, 세그먼트 아키텍처) 인 경우, 뺄셈을 수행하는 시점에서 ds은 무엇으로 설정되어 있습니까? 마음에 떠오르는 첫 번째 일, 완전히 다른 메모리 위치를 변경하는 것일 수 있습니다.

은 그 꼭대기에, 당신은 제공해야

  • (당신이이 일을하는 동안 자신의 문제를 해결 찾을 수 있습니다 - 내가 자주 할) 문제가있는 행동을 나타내는 가장 짧은 완전한 프로그램.
  • 두 경우 모두 retVal이 설정되는 실제 잘못된 값입니다.