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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在GNU汇编程序中声明一个固定长度的填充字符串相关的知识,希望对你有一定的参考价值。

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

char my_string[32] = "hello";

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

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

my_string:
  .asciz "hello"
  .zero 26

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

答案

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

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

另一答案

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

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

可以简化为:

my_string:
    .ascii "mystery string"
    .zero (maxsize+my_string-$)
另一答案

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

以上是关于在GNU汇编程序中声明一个固定长度的填充字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL记录-PLSQL字符串

如何在 Python 中用空格将字符串填充到固定长度?

PL/SQL字符串声明字符串函数和操作符实例源码说明

MySQL数据类型 - 字符串数据类型

Entity Framework技巧系列之六 - Tip 20 – 25

C ++在固定大小9的右填充空终止字符数组中找到第一个空格的最快方法