x86:有没有办法确定缓冲区的长度?

问题描述 投票:0回答:1

假设我有一个这样声明的缓冲区:

.section .bss
.lcomm buffer, 33

我将它推入堆栈,并将其作为参数传递给另一个需要 44 字节长度缓冲区的函数。

被调用函数有办法检查接收到的缓冲区长度是否为 44 字节吗?因为如果缓冲区为空,您无法迭代它并检查当前字节是否等于

$0
,因为这样它的所有字节都将等于
$0

x86-64 gnu-assembler
1个回答
0
投票

您可以添加第三行来定义新符号

buffer_size
:

.section .bss
.lcomm buffer, 33
buffer_size = . - buffer

注意

.
是当前位置,即缓冲区之后,因此
. - buffer
是缓冲区开始 (
buffer
) 和缓冲区之后 (
.
) 之间的差值,即缓冲区的大小缓冲液。

您可以像任何其他符号一样以多种方式使用该

buffer_size
符号:

  • 您可以在符号列表中看到它的值,例如与

    nm

  • 您可以通过向每个接受缓冲区指针参数的函数添加缓冲区大小参数,在 C 代码或汇编代码中使用此符号进行运行时检查。这就是你问题的直接答案。

  • 您可以使用此符号通过链接器脚本进行链接时间检查,例如

    -T check-buffer-size.x
    -Wl,-T,check-buffer-size.x
    :

    SECTIONS {
    }
    INSERT AFTER .noinit ;
    ASSERT( (buffer_size == 44), "buffer_size is not the required 44" );
    

    这给了你一个链接时断言,虽然经常有用,但似乎是一个不寻常的想法,以至于像C这样的编程语言只给你编译时断言运行时断言,但没有链接时断言

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