在GNU汇编程序中声明一个固定长度的填充字符串

时间:2011-02-08 10:02:49

标签: assembly arm gnu

我正在尝试在汇编程序中以固定大小的结构定义一些数据。我想声明一个固定字节数的字符串数据,用字符串初始化。在C中它将是:

char my_string[32] = "hello";

这是32个字节,并在最后填充了许多零。

汇编程序中的等价物是什么?我知道我可以手动计算字符串的长度并声明必要的零字节数以填充到32,例如:

my_string:
  .asciz "hello"
  .zero 26

但是,如果动态定义字符串,如何从外部定义或包含?

,我该怎么办呢?

3 个答案:

答案 0 :(得分:4)

我想我会使用带有本地标签的宏。例如:

    .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,则此类具有类似C的行为,即不添加终止0。为确保字符串终止,只需将.ascii更改为.asciz 。)

答案 1 :(得分:3)

你所描述的仍然是一个静态字符串,虽然大小不详。您可以从当前数据指针($)中获取字符串的大小,减去字符串的地址。从最大大小中减去字符串的大小,您知道要添加多少个零:

my_string:
    .ascii "mystery string"
    .zero (maxsize-($-my_string)) ;maxsize-actualsize

可以简化为:

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

答案 2 :(得分:0)

我希望Jens' answer使用例如.zero (32+my_string-$),但我收到错误消息Error: .space specifies non-absolute value

这似乎是一个可行的选择:

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

我不知道它是否保证将整个32个字节设置为特定值(即用零填充的尾随字节),但使用.asciz确保字符串为零终止。