2013-10-26 1 views
5

나는이 과정을 수강 중이며, .align이라는 개념을 이해하는 데 정말로 어려움을 겪고있다.어셈블리 MIPS의 이해 .ALIGN 및 메모리 어드레싱

는 여기에 내가 이해하지 수있는, 예입니다 :

enter image description here

나는 데이터 세그먼트 내에서, 등, 0x10010000,0x10010020로 시작, 주소가 있다는 것을 알고있다.

그리고 각 주소에는 8 개의 메모리 필드가 있고 각각 32 비트가 있다는 것을 알고 있습니다.

자, 내가 이해할 수없는 것은, 어떻게 그리고 왜 var2은 주소 0x10010010 안에 있습니까? str1var1의 3 비트를 예약했기 때문에 주소 0x10010003 안에 있습니다.

마지막으로 정확히 지시문 인 .align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used은 3을 기준으로 위로 정렬되지만 실제로 얻지는 않습니다.

이것이 매우 혼란 스럽다면 미안합니다. 필사적으로 생각합니다.

답변

9

정렬은 MIPS 프로세서에서 중요합니다. 정렬은 데이터 크기의 배수 인 주소의 메모리에서 멀티 바이트 값을 읽기만합니다.

.ASCIIZ 필드는 한 번에 한 바이트 씩 문자열을 읽으므로 아무 데나 놓을 수 있습니다. 0x10010003에 두는 것이 좋습니다.

.WORD 필드는 4의 배수로 정렬되어야합니다. 따라서 문자열 다음에 사용할 수있는 위치 인 0x1001000E에 넣을 수 없습니다. 어셈블러는 의도적으로 값을 시프트하고 2 바이트를 사용하지 않습니다. 다음 주소는 4의 배수 0x10010010입니다.

.ALIGN 지시문은 기본 정렬 규칙을 대체하는 방법입니다. 지시문 다음의 다음 필드는 2의 배수로 n의 제곱 (n은 .ALIGN 값)으로 정렬됩니다. 귀하의 경우 pow (2, 3) = 8 바이트입니다.

.ALIGN 지시문없이 .HALF 필드가 0x10010014에 저장됩니다. 8의 배수가 아니므로 0x10010018로 이동합니다.

예를 들어 인위적으로 여기에 .ALIGN 지시문을 사용하는 명백한 이유는 .HALF는 2의 배수로만 조정해야 0x10010014에 저장할 수 있기 때문입니다.

+1

아무 대답도없는 동안 내 대답을 전화로 입력하고 있었습니까 ... 귀하의 것이 다른 답변의 필요성을 없앴습니다. – gnometorule

+0

답변 해 주셔서 감사합니다. 질문 : 0x10010010은 4의 배수가되는 방식은 무엇입니까? – Sobiaholic

+0

0x10010010 = 2^28 + 2^16 + 2^4, 이는 4의 곱셈입니다. 계산이 이해가되지 않으면 16 진수를 다시 읽으십시오. – gnometorule

3

특정 어셈블리 지시문은 데이터가 정렬되어 저장된다는 것을 의미합니다. 즉, 주소가 이고 주소가 인 주소에서 시작한다는 의미입니다. MIPS에서 규칙의 처음 몇 기억 :

(1) "단어는"4 바이트 (당신은 때때로 2 바이트로 정의 볼),

(2) 하프 워드입니다 (.half)이다 2 바이트 및

(3) .asciiz null은 문자열을 종료합니다 (C와 유사).

이것을 사용하면 var1과 str1이 저장되는 방법을 이미 설명했습니다. 왜 var2 전에 2 바이트의 빈 버퍼가 필요합니까? 그것은 .word로 선언 되었기 때문에 (위의 (1)에 의해) 4의 배수 인 메모리 위치에서부터 저장됩니다. 당신이 그것을 .half로 선언했다면, str1 사이에 2 개의 빈 바이트를 가지지 않을 것입니다 및 var2.

var2가 선언되었습니다. 하프 - 하나의 16 비트 (2 바이트) 주소입니다. 그러나 그것을 선언하기 전에 정렬은 3으로 변경됩니다. 이제 첫 번째 문장을 확인하십시오 : 이것은 의 힘입니다. 따라서 재정의 할 때까지 변수는 선언 된대로 배치되지만 추가적으로 초기 저장 위치는 8의 배수 여야합니다. 따라서 어셈블러는 var3을 저장하기 위해 4 개의 빈 바이트를 8의 배수로 삽입합니다.