“DB 13, 10, 'hello world', 0”中的“13, 10”是什么意思?

lis*_*aro 1 assembly x86-16

我已经打字了DB 13, 10, 'hello world', 0很长时间,但没有想知道 13、10 和 0 是做什么用的。

我最近注意到这样做:

PTHIS
DB 'hello world', 0
Run Code Online (Sandbox Code Playgroud)

产生了相同的结果,所以我想知道第一个参数的用途是什么,以及简单地这样编写是否是一个好主意。有人可以对此写一个快速解释吗?(我想字符串声明将是主题)

pax*_*blo 7

它是 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)