2013-03-05 6 views
2

TI MCU (msp430)에서 gnu 어셈블러를 사용 중이고 어셈블리에서 혼합 된 정렬 변수를 정의하려고합니다. 어떤 것은 바이트 정렬되고, 다른 것은 워드 (16 비트) 정렬되어야합니다. 일부 변수는 어셈블리 언어 모듈에 공용으로 유지해야하며 다른 변수는 공용 (전역)으로 유지해야합니다. 그래서 저는 .lcomm을 기본값으로 사용하고 싶습니다. 그리고 적절할 때 그것을 오버 라이드하기 위해 .global을 사용하십시오.gnu-assembler에서 서브 섹션 패딩을 얻는 방법

는 는 그러나 심지어 나는 GCC 컴파일 된 프로그램의 연결시 정렬 오류를 얻고 바이트 정렬 지시어를 적용한 후

:

ssegLED.c : 200 : 위험 이전 : 정렬되지 않은 주소

그리고 그 선에 불과하다 단어가 정렬하도록되어 데이터에 액세스하려고 :

경우 (손잡이) {...} 어셈블리 언어 모듈에서

문제의 원인을, 나는 메모리에 효율적으로 데이터 팩을 만들려고 해요 ; 따라서 하위 섹션을 사용하여 같은 종류의 데이터를 그룹화하여 서로 다른 정렬 된 데이터 사이에 구멍이 생기지 않도록하고 싶습니다. 예 : 기본 하위 섹션 (0)에서 정렬하려는 모든 단어 정렬 데이터, 하위 섹션 1에서 원합니다.

다음은 키 스트로크, 구적법, 키 구성, 및 손잡이. 처음 세 개는 바이트 정렬되고, 마지막은 워드 정렬됩니다.

.section .bss ;; doesn't matter if .bss or .section .bss -- same err. 
.subsection 1 
.balign  1 ;; can add a ,0 -- but it changes nothing 

.global  keystroke 
.type  keystroke,@object 
.size  keystroke,1 ;; Tried with and without this line, no change... 
.lcomm  keystroke,1 

.lcomm  quadrature,1 
.lcomm  keystate,1 

.section .bss 
.subsection 0 
.balign  2 ;; tried adding ,0 -- but it fixes nothing 

.global  knob ;; Present knob value 
.type  knob, @object 
.size  knob, 2  ;; doesn't affect error whether commented out/not 
.lcomm  knob, 2 

이제 잘못 정렬 문제를 방지해야하는 두 가지 작업이 있습니다. GNU AS 매뉴얼에 따르면, 서브 섹션 0은 서브 섹션 1 이전에 메모리에 위치해야합니다; 따라서 섹션 0은 자동으로 기본 섹션으로 정렬됩니다. 둘째, .balign 지시문을 명시 적으로 사용하고 있습니다.

하지만 ... 등, 그것을 해결되지 .b2align을 변경 작동하지 않습니다

I 오류가 명시 적으로 하위 섹션에 다른 바이트 정렬 변수를 추가하여 멀리 갈 수 있습니다 1 개의 변수 keystroke, quadrature 및 keystate; 전체 하위 섹션은 단어 경계에서 끝납니다. 문제가되는 부분은 숫자가 작기 때문에 (1) 하위 섹션 (1)의 정렬은 아무런 효과가 없어야합니다 ....

두 번째로 .lcomm을 .comm으로 변경하면 오류도 사라집니다. ; 그러나 나는 이유를 모른다.

무슨 일 이니? 내가 뭘 잘못하고 있니?

답변

0

.lcomm은 현재 섹션이나 하위 섹션이 무엇이든지간에 .bss 섹션 (하위 섹션 0)에 내재적으로 기호를 삽입합니다. 이와 같이 기호는 소스에 나타나는 순서대로 나타나므로 knob은 1 바이트 변수 뒤에옵니다. 또한 .balign은 현재 (하위) 섹션에 적용되므로 차이가 없습니다.

대신 .fill을 사용해보세요. 내 검사 결과에 따르면 효과가있는 것 같습니다.

+0

예. 실제로 문서화되지 않은 동작입니다. 채우기가 데이터를 거부하는 섹션에서도 작동한다는 것은 이상한 일입니다. 그러나 작동하는 것처럼 보입니다 - 전반적으로 이것은 "as"디자인 또는 문서의 버그처럼 보입니다. 나는 그것을 어떻게보고 할 지 모르겠다. 그러나 나는 문제가 고쳐질 때 쉽게 변경할 수있는 .fill을 사용하기 위해 지금 매크로를 만들 것이라고 생각한다. 감사. :) – user2133679

+0

내가 말했던 모든 것이 문서화되어있다. '.건너 뛰기 '지시어를 사용하는 것이 좋습니다. 동일한 지시를하는 여러 가지 지시어를 제외하고는 GAS에서 어떤 문제도 보이지 않습니다. 어쩌면 나는 상황을 명확하게 설명하지 않았을 것이다. – Jester