在GNU汇编器中声明固定长度的填充字符串

Cra*_*een 3 assembly arm gnu

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

char my_string[32] = "hello";
Run Code Online (Sandbox Code Playgroud)

它是32个字节,并在末尾填充了许多零。

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

my_string:
  .asciz "hello"
  .zero 26
Run Code Online (Sandbox Code Playgroud)

但是,如果该字符串是动态定义的(例如从外部定义或包含中),该怎么办?

Mat*_*ery 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
Run Code Online (Sandbox Code Playgroud)

...这样使用:

my_string:
    padded_string "Hello world!", 16
Run Code Online (Sandbox Code Playgroud)

(这具有类似于C的行为,如果字符串正好是max字符长,则不加终止符0。要确保终止字符串,只需将更.ascii改为即可.asciz。)