在汇编中获取字符串长度的短格式

Short-form to get string length in assembly

为了获取字符串的长度,我使用了以下函数:

string:     .asciz "hello world!\n"
get_string_length:
    mov [=10=], %eax    # size goes in rax
  .L1_loop:
    movzbw string(,%eax,1), %ebx
    cmp [=10=], %ebx
    je .L1_exit
    inc %eax
    jmp .L1_loop
  .L1_exit:
    ret

不过,我也看到了以下内容:

hello_world:
    .ascii "hello world\n"
    hello_world_len = . - hello_world

以下是如何工作的?那就是 . 符号和所有的长度?例如,在此处的 github 片段中:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9dccafe00d9b0affa8847836a71ebb4c37be7090/userland/arch/x86_64/freestanding/linux/hello.S

第一个版本在run-time确定长度,第二个版本在汇编时间设置长度。

第二个表达式中的.表示当前地址(在数据段中)。然后,表达式

hello_world_len = . - hello_world

当前地址(由.表示)中减去.ascii "hello world\n"由标签hello_world:表示的字符串的起始地址导致长度值 hello_world_len.