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

问题描述 投票:3回答:3

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

char my_string[32] = "hello";

这是32个字节,并且填充了最后需要的许多零。

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

my_string:
  .asciz "hello"
  .zero 26

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

assembly arm gnu
3个回答
5
投票

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

    .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。)


3
投票

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

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

可以简化为:

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

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确保字符串为零终止。

© www.soinside.com 2019 - 2024. All rights reserved.