我一直在输入DB 13, 10, 'hello world', 0
很长一段时间而不知道13,10和0是什么。
我最近注意到:
PTHIS
DB 'hello world', 0
产生了相同的结果,所以我想知道第一个参数是什么,以及用这种方式简单地写它是否是一个好主意。有人可以写一个快速解释吗? (我想字符串声明将成为主题)
答案 0 :(得分:4)
这是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
答案 1 :(得分:1)
13是CR ASCII码(carriage return)的十进制值,10是LF ASCII码(line feed)的十进制值,0是字符串的终止零。
此常量背后的想法是在打印hello world
之前更改为下一行。打印子程序需要零终止器才能知道何时结束打印。这类似于null terminating of C strings。
答案 2 :(得分:0)
试试这个
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
看看会发生什么