我正在尝试在汇编程序中以固定大小的结构定义一些数据。我想声明一个固定字节数的字符串数据,用字符串初始化。在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
确保字符串为零终止。