在汇编中获取字符串长度的短格式
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
.
为了获取字符串的长度,我使用了以下函数:
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
.