我已经打字了DB 13, 10, 'hello world', 0很长时间,但没有想知道 13、10 和 0 是做什么用的。
我最近注意到这样做:
PTHIS
DB 'hello world', 0
Run Code Online (Sandbox Code Playgroud)
产生了相同的结果,所以我想知道第一个参数的用途是什么,以及简单地这样编写是否是一个好主意。有人可以对此写一个快速解释吗?(我想字符串声明将是主题)
它是 ASCII CR/LF(回车/换行)序列,用于前进到下一行的开头。
历史教训:在旧的电传打字机上,回车就是这样做的,它将滑架(打印头)返回到当前行的开头,而换行则使纸张前进,以便在下一行进行打印。
并且您的两个样本不应产生相同的结果。如果当您输出不带 的字符串时CR/LF,光标不在行首,则Hello world会显示在中行某处,即使您确实从行首开始,带 的版本也CR/LF应首先将光标向下移动一个排。
末尾的零只是字符串的终止符。一些早期的系统使用其他字符,例如$原始 BIOS 中的 :
str db "Hello, world$"
Run Code Online (Sandbox Code Playgroud)
$这使得将符号输出到控制台变得相当痛苦:-)
终止符之所以存在,是因为您的字符串输出几乎肯定会以字符输出的形式编写,例如伪 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
Run Code Online (Sandbox Code Playgroud)