2011-02-08 1 views
3

저는 어셈블러에서 고정 크기 구조의 데이터를 정의하려고합니다. 문자열로 초기화 된 고정 된 바이트 수의 문자열 데이터를 선언하고 싶습니다. C에서는이 될 것이다 : 32 바이트, 그리고 마지막에 필요하지만 많은 0으로 채워GNU 어셈블러에서 고정 길이 패딩 된 문자열 선언

char my_string[32] = "hello"; 

.

어셈블러에서 무엇이 해당합니까? 내가 수동으로, 예를 들어 내 문자열의 길이를 계산하고 32 패드에 0 바이트의 필요한 수를 선언 할 수 있습니다 알고

my_string: 
    .asciz "hello" 
    .zero 26 

그러나이 문자열이 같은에서와 같이 동적으로 정의되고 있는지 나는 그것을 할 수있는 방법 외부 정의 또는 포함?

답변

3

로컬 레이블이있는 매크로를 사용한다고 생각합니다. 예를 들어 :

.macro padded_string string, max 
1: 
    .ascii "\string" 
2: 
    .iflt \max - (2b - 1b) 
    .error "String too long" 
    .endif 

    .ifgt \max - (2b - 1b) 
    .zero \max - (2b - 1b) 
    .endif 

    .endm 

...이처럼 사용할 :

my_string: 
    padded_string "Hello world!", 16 

(이 문자열이 정확히 max 자이면 종료 0을 추가하지 않는 C와 같은 동작을 가지고있는 문자열을 확인합니다. 종료되었습니다. .ascii.asciz으로 변경하십시오.

+0

감사합니다, 나는 당신의 교육적 대답에 감사드립니다. –

3

설명하는 내용은 알 수없는 크기이지만 정적 문자열입니다. 문자열의 크기를 현재 데이터 포인터 ($)에서 문자열의 주소를 뺀 값을 얻을 수 있습니다. 최대 크기의 문자열의 크기를 빼기 그리고 당신은 추가하는 방법에 많은 제로 알고

로 단순화 할 수
my_string: 
    .ascii "mystery string" 
    .zero (maxsize-($-my_string)) ;maxsize-actualsize 

:

my_string: 
    .ascii "mystery string" 
    .zero (maxsize+my_string-$) 
+0

고마워요. 불행히도, 나는 그것을 시도 할 때, "오류 : .space 절대가 아닌 값을 지정합니다"라는 메시지가 나타납니다. –

+1

'.'은'$'보다 더 잘 작동합니다. 이것은'가스'문법이 다른 타겟 플랫폼에 따라 다른 영역 중 하나입니다 ... –

0

내가 예를 들어, 사용하는 Jens' answer 선호하는 것 .zero (32+my_string-$) 그러나 오류 메시지 Error: .space specifies non-absolute value이 있습니다. 는 전체 32 바이트 (즉 0으로 채워 바이트 후행), 그러나 .asciz가하는 사용하여 특정 값으로 설정되어 있는지 보장 경우

my_string: 
    .asciz "mystery string" 
    .org my_string + 32 
other_stuff: 
    ... 

나도 몰라 :

이 실행 가능한 대안이 될 것으로 보인다 문자열이 0으로 종료되었는지 확인하십시오.