我已经打字DB 13, 10, 'hello world', 0
很长时间了,不知道 13、10 和 0 是干什么用的。
我最近注意到这样做:
PTHIS
DB 'hello world', 0
产生了相同的结果,所以我想知道第一个参数是做什么用的,以这种方式简单地编写它是否是个好主意。有人可以对此写一个快速的解释吗?(我想字符串声明将是主题)
它是 ASCII CR/LF(回车/换行)序列,用于前进到下一行的开头。
历史教训:在旧的电传打字机上,回车正是这样做的,它将马车(打印头)返回到当前行的开头,而换行使纸张前进,以便在下一行进行打印。
你的两个样本不应该产生相同的结果。如果在输出不带 的字符串时光标不在行首CR/LF
,则Hello world
将显示在某处的中线,即使您确实从行首开始,带有的版本CR/LF
也应首先将光标向下移动一个排。
最后的零只是字符串的终止符。一些早期系统使用其他字符,例如$
原始 BIOS 中的 :
str db "Hello, world$"
$
这使得将符号输出到控制台相当痛苦:-)
终结符在那里是因为您的字符串输出几乎肯定会以字符输出的形式编写,例如伪 asm 代码:
; func: out_str
; input: r1 = address of nul-terminated string
; uses: out_chr
; reguse: r1, r2 (all restored on exit)
; notes: none
out_str push r1 ; save registers
push r2
push r1 ; get address to r2 (need r1 for out_chr)
pop r2
loop: ld r1, (r2) ; get char, finish if nul
cmp r2, 0
jeq done
call out_chr ; output char, advance to next, loop back
incr r2
jmp loop
done: pop r2 ; restore registers and return
pop r1
ret
; func: out_chr
; input: r1 = character to output
; uses: nothing
; reguse: none
; notes: correctly handles control characters
out_chr ; insert function here to output r1 to screen
尝试这个
PTHIS
DB 'hello world'
DB 10 ;line feed
DB 13 ;carriage return
DB 'hello world2',0
然后摇动代码
PTHIS
DB 'hello world'
DB 10 ;line feed no carriage return
DB 'hello world2',0
PTHIS
DB 'hello world'
DB 13 ;carriage return no line feed
DB 'hello world2',0
看看会发生什么