例如,如果我们编写一个简单的hello world类型程序,.data部分可能包含以下内容:
section .data
msg db 'Enter something: '
len equ $ - msg
Run Code Online (Sandbox Code Playgroud)
这个例子中的$代表什么,为什么$ - msg等于字符串的长度?
例如:
a = 1
Run Code Online (Sandbox Code Playgroud)
和:
.equ a, 1
Run Code Online (Sandbox Code Playgroud)
和:
.set a, 1
Run Code Online (Sandbox Code Playgroud)
所有这些都在以下情况下逐字节产生相同的输出:
as --32 main.S
Run Code Online (Sandbox Code Playgroud)
根据cmp。
我知道这一点.equ,并.set根据以下文档执行相同的操作.equ:https://sourceware.org/binutils/docs-2.25/as/Equ.html:
它与“.set”同义。
我知道ARM 汇编中 .equ 和 .word 之间的区别.equ是什么?
那么呢=?和另外两个一样吗?
message db "Enter a digit ", 0xA,0xD
Length equ $- message
Run Code Online (Sandbox Code Playgroud)
它用于获取字符串的长度吗?
它在内部如何运作?
为了获取字符串的长度,我使用以下函数:
string: .asciz "hello world!\n"
get_string_length:
mov $0, %eax # size goes in rax
.L1_loop:
movzbw string(,%eax,1), %ebx
cmp $0, %ebx
je .L1_exit
inc %eax
jmp .L1_loop
.L1_exit:
ret
Run Code Online (Sandbox Code Playgroud)
不过,我也看到了以下情况:
hello_world:
.ascii "hello world\n"
hello_world_len = . - hello_world
Run Code Online (Sandbox Code Playgroud)
以下是如何工作的?这就是.符号和所有得到长度的东西?例如,在此 github 代码片段中:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/9dccafe00d9b0affa8847836a71ebb4c37be7090/userland/arch/x86_64/freestand/linux/hello.S