例如,如果我们编写一个简单的hello world类型程序,.data部分可能包含以下内容:
section .data
msg db 'Enter something: '
len equ $ - msg
Run Code Online (Sandbox Code Playgroud)
这个例子中的$代表什么,为什么$ - msg等于字符串的长度?
所以我想在bootsector中添加填充.比方说,目前只有一个无限循环:jmp ..扇区需要512字节长.此外,0xaa55需要在最后添加的幻数.
jmp .
.skip 508, 0
.word 0xaa55
Run Code Online (Sandbox Code Playgroud)
但是,如果我想打印一些但不想将所有字节计算到适当大小的内容,该怎么办?
在Intel/NASM中,语法是:
; print something
times 510-($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
但在AT&T语法中呢?好了,循环(.rept)在这里不起作用,因为这里.不需要给出绝对值.我们和.skip/ 有同样的问题.space,他们也需要一个绝对值.
是否有使用某种循环/ .align/ .skip/ etc 添加填充的方法?
编辑:我as用来构建和链接,ld -Ttext 0x7c00 --oformat binary直到yasmAT&T语法足够稳定.
我看到如下代码:
section .data
db 'hello'
db 'h', 'e', 'l','l','o'
data_segment_size equ $-$$
Run Code Online (Sandbox Code Playgroud)
为什么data_segment_size等于25?我知道$和$$表示什么,但是根据我的书我不明白为什么这个变量是25。也许那本书里有一个错误。