在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汇编程序中声明一个固定长度的填充字符串的主要内容,如果未能解决你的问题,请参考以下文章