2012-01-17 2 views
1

선생님은 나중에 도로를 사용하면 도움이 될 수 있으므로 어셈블리에 대한 기본적인 이해를 원합니다. 나는 괜찮습니다.하지만 제 대학에서는 4 개의 작은 예문을 제외하고는이 과목에 대한 제로 문서를 제공하지 않습니다.어셈블리에서 수행하는 작업

.DEVICE ATmega32 

.CSEG 
main: 

ldi ZL,low(varclist<<1) 
ldi ZH,high(varclist<<1) 

.CSEG 
varclist: 
.db 1, 2 
.db 3, 4 
.db 5, 6 
.db 7, 8 
.db 9, 0 

내가 AVR 스튜디오 5에서 작업하고 있어요, 그리고 '프로세서'탭을보고 :이 일에 무슨 일이 일어나고 있는지 알아 내려고 노력하고있어. 나는 'varclist'의 값과 레지스터가 보여주는 16 진수 값 사이의 관계를 찾지 못하는 것 같습니다. 어떻게 보입니까?

Z 레지스터에 0x0100이 포함될 것으로 예상됩니다. 가장 중요한 비트가 선언 된 첫 번째 비트이고 마지막으로 최하위 비트가 선언 된 것입니다. 그러나 나는 0x0070을보고있다. 그래도 나는 변화가 무엇인지 모르겠다.

+0

숙제를 위해, 나는 그 태그를 추가해야한다고 생각합니다. 같은 이유로, 코드가 당신을 도울 수있는 최선의 방법이 아닐 수도 있습니다. 당신은 당신이 생각하는 당신의 레지스터에 존재해야한다고 생각하는 것과 당신이 얻는 가치는 무엇인지 말할 수 있습니까? 일단 당신이 이것을 해내었다면 우리는 당신의 추론에서 무엇이 잘못되었는지를 분명히 설명 할 수있었습니다 :) –

+0

그건 공평합니다, 나는 대답을 찾고 있지 않습니다. 이해하고 싶습니다. 더 많은 정보를 추가하겠습니다. – Lg102

+0

코드를 어셈블 한 다음 해체하는 것이 좋습니다. 그런 다음 각 명령어에 대한 정보는 avr 명령어 세트 설명서를 참조하십시오. atmega32 데이터 시트/매뉴얼의 avr 명령어 세트 문서와 코어/cpu 챕터 사이에서 z 레지스터가 무엇인지, gprs에 매핑되는 방법, 그리고 명령이 실제로 코드화 된대로 무엇을하는지 알아낼 수 있어야합니다. 거기에서 어셈블리 언어로 거꾸로 돌아갑니다. –

답변

2

이동에 대해 궁금한 점에 대답하려면 모든 비트를 왼쪽으로 이동하여 첫 번째 비트를 0으로 추가하십시오. 즉, 변수 varclist의 상위 (하위) 값을 2로 곱합니다.

varclist 여기 프로그램에서 메모리 배열의 바이트 배열 [0x01, 0x02, ... 0x00]의 주소입니다.>varclist은이 배열의 첫 번째 바이트에 대한 포인터입니다. 원래 주소를 얻으려면, 우리는 단지 (곱셈의 역 동작) 2로 분할해야하고 우리는

0x0070 >> 1 = 0000 0000 0111 0000 >> 1 = 0000 0000 0011 1000 = 0x0038 

는 그래서 varclist 주소가 0x0038이었다 구하십시오. 이것이 0x0100이라고 생각하는 방법을 모르겠지만 이제 코드를 이해하시기 바랍니다.

프로그램 저장 공간의 주소가 워드 오프셋으로 표시되기 때문에이 주소에 2가 곱해집니다.이 경우 바이트 오프셋의 주소를 얻기 위해 2를 곱해야합니다. 나중에 LPM 어셈블리 명령어로 인해이 바이트 (배열의 첫 번째 바이트)를 r0에로드 할 수 있습니다.

this pdf의 5.2 장과 가능한 다른 장을 읽어 보시기 바랍니다. AVR Assembler User Guide도 좋은 선택 일 것입니다.

관련 문제