“13,10”在“DB 13,10,'hello world',0”中意味着什么?

时间:2013-06-24 01:13:04

标签: assembly x86-16

我一直在输入DB 13, 10, 'hello world', 0很长一段时间而不知道13,10和0是什么。

我最近注意到:

PTHIS
DB 'hello world', 0

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

3 个答案:

答案 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

看看会发生什么