![9497b0a24bbef11b06bd6aa6dea42ac9.gif](https://i-blog.csdnimg.cn/blog_migrate/06aa1e43b1790960d8f1915e4fa7a533.gif)
先说说今天(文章是21号写的)最大的事情,量子计算机的突破:
据英国《金融时报》报道,谷歌声称已经达到“量子霸权”,打造出第一台能够超越当今最强大的超级计算机能力的量子计算机!该计算机能够在 3 分 20 秒内执行一个计算,而同样的计算用当今最强大的超级计算机 Summit 进行,需要约 10000 年。这是一个真正里程碑式的进展!
![9961305975f92afccbe4f603cdce87a2.png](https://i-blog.csdnimg.cn/blog_migrate/8e38045023a84890bcab5108c66fa620.jpeg)
这标志着量子理论开始走向应用,注定是一场科技的变革,IT行业也将发生翻天覆地的变化!
不再只是二进制的运算方式也颠覆了当下cpu的格局,让我们再用cpu干点事。。。
众所周知,想在屏幕上输出,要么printf、要么cout、要么Console.WriteLine...,在Linux上,甚至还可以使用int 0x80中断。这里的中断是汇编实现的,Windows上比较麻烦,需要调用API,估计看masm文档的恼火了不少 :-)
既然说到没有系统调用,我们就另寻途径:BIOS中断!BIOS这东西历史很老了,比笔者老多了,现在都在用UEFI模式了,当年Intel为了电脑上电时能硬件自检、加载操作系统等等可谓花了不少心思,设计了8086指令集,统一主板接口...最重要的就是他的中断了,今天的屏幕输出,就是靠这个“与生俱来”的中断,先上好代码:
org 0x7c00 2 3POINT_TITLE: 4 mov ax,MESSAGE 5 mov bp,ax 6 mov cx,12 7 mov ax,0x1300 8 mov bx,0xc 9 mov dx,010 int 0x101112MESSAGE db 'Hello World!'1314times 510-($-$$) db 015dw 0xaa55
用nasm编译:nasm xxx.asm -o xxx.img,然后扔到虚拟机里,有闲情之人可以刷进U盘真机测试(即使失败也没关系,没有硬盘操作一般不会对电脑有损坏)。
这是运行截图,这是在虚拟机Qemu - i386上运行的,其他输出是qemu生成的,我们的代码是成功的!
![5c7f48c2ed6a8a50199e87ad74173c08.png](https://i-blog.csdnimg.cn/blog_migrate/cc8615abc3cc20b19747bc9eb156b597.jpeg)
我们一行行来,很简单的。
org 0x7c00:
org是程序的加载地址,7c00h是一个真实的物理地址,所有的开机引导程序都在这里加载,至于为什么这么规定,还是去问Intel的大叔们吧,到现在都没有官方的说法。
POINT_TITLE::
这是一个函数入口,相当于C系列语言的void POINT_TITLE(){}
mov ax,MESSAGE:
这里是把后面的MESSAGE db 'Hello World!'指令的地址传给ax(通用寄存器),可以理解为高级语言中的参数传递。
后面的指令功能依次是:传递指令的指针、设置指令中字符串的长度、设置显示模式(CGA)、设置字体颜色(参考cmd的color)、打印页面的位置(80*25分辨率,位置是呈线性的)
如何就是伟大的Int中断了,这个中断比较常用,后面会具体讲。这里就是屏幕输出的功能。
times 510-($-$$) db 0:
引导程序是512字节,为了让文件达到512字节,需要510减去前面的指令数(510-(首部-尾部) = 510-($-$$)),还有2字节后面说,times是nasm的特殊语法,一般拿来自动补0。
dw 0xaa55:
这也是Intel一个奇怪的规定,引导扇区最后两个指令必须是55,aa才能被BIOS识别到。
说到引导扇区也些人觉得奇怪,不是在写屏幕输出程序吗?是的这确实是个屏幕输出,只不过是在引导程序里执行的,不写成引导程序BIOS不会识别到 :-)
当然了,引导程序不是来给我们屏幕输出的,DOS时代已经过去了,我们后面会拿他来读取硬盘,软盘,来加载操作系统加载器。今天先这样。