1

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

我最近注意到这样做:

PTHIS
DB 'hello world', 0

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

4

3 回答 3

5

它是 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
于 2013-06-24T01:14:25.840 回答
1

13 是 CR ASCII 码(回车)的十进制值,10 是 LF ASCII 码(换行)的十进制值,0 是字符串的终止零。

这个常量背后的想法是在打印之前更改到下一行hello world。打印子程序需要零终止符才能知道何时结束打印。这类似于C 字符串的空终止

于 2013-06-24T01:14:48.500 回答
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

看看会发生什么

于 2013-06-24T10:21:33.663 回答