033.实地址模式下写入显存数据输出字符串

     注意,下面的一段代码是在NASM之中编写的一段汇编指令,可以看到在汇编语言中可以直接将数据送至显存中,单步执行并显示它们,这并不是一段完整的汇编代码,但是经过编写之后,可以直接在NASM中工作。这段代码中有几个非常关键的问题,由于在编程的过程中使用了Boch虚拟机下的实地址模式,并且代码编写调试完成之后直接写入虚拟DOS下的主引导扇区,那么根据操作系统对主引导扇区的相关约定,这一部分的代码必须大小为512字节,所以你会看到,在代码的末尾,会使用times伪指令对这部分进行0填充,es:0x??? 表示的是以显存地址0xB800为基址,冒号后面的部分为偏移地址的内存区块,这样做可以直接将字符串送至显存,并且直接输出。最后,整段代码以db 0x55,0xAA结尾,这是主引导扇区代码结束的标志,必须如实按照这种格式编写,否则会导致编译不通过等问题。

mov ax,0xB800
mov es,ax

mov byte [es:0x0000],'H';
mov byte [es:0x0001],0x17;代表黑底白字

mov byte [es:0x0002],'e';
mov byte [es:0x0003],0x17;代表黑底白字

mov byte [es:0x0004],'l';
mov byte [es:0x0005],0x17;代表黑底白字

mov byte [es:0x0006],'l';
mov byte [es:0x0007],0x17;代表黑底白字

mov byte [es:0x0008],'o';
mov byte [es:0x0009],0x17;代表黑底白字

mov byte [es:0x000A],' ';
mov byte [es:0x000B],0x17;代表黑底白字

mov byte [es:0x000C],'W';
mov byte [es:0x000D],0x17;代表黑底白字

mov byte [es:0x000E],'o';
mov byte [es:0x000F],0x17;代表黑底白字

mov byte [es:0x0010],'r';
mov byte [es:0x0011],0x17;代表黑底白字

mov byte [es:0x0012],'l';
mov byte [es:0x0013],0x17;代表黑底白字

mov byte [es:0x0014],'d';
mov byte [es:0x0015],0x17;代表黑底白字

mov byte [es:0x0016],'!';
mov byte [es:0x0017],0x17;代表黑底白字

times 510-($-$$) db 0x00   ;注意这里一定是512个字节,不然主引导扇区会崩溃
db 0x55,0xAA