一个controller调用另一个controller_写一个无需系统调用的屏幕输出

9497b0a24bbef11b06bd6aa6dea42ac9.gif

先说说今天(文章是21号写的)最大的事情,量子计算机的突破:

据英国《金融时报》报道,谷歌声称已经达到“量子霸权”,打造出第一台能够超越当今最强大的超级计算机能力的量子计算机!该计算机能够在 3 分 20 秒内执行一个计算,而同样的计算用当今最强大的超级计算机 Summit 进行,需要约 10000 年。这是一个真正里程碑式的进展!

9961305975f92afccbe4f603cdce87a2.png

这标志着量子理论开始走向应用,注定是一场科技的变革,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

我们一行行来,很简单的。

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一个奇怪的规定,引导扇区最后两个指令必须是55aa才能被BIOS识别到。

说到引导扇区也些人觉得奇怪,不是在写屏幕输出程序吗?是的这确实是个屏幕输出,只不过是在引导程序里执行的,不写成引导程序BIOS不会识别到 :-)

当然了,引导程序不是来给我们屏幕输出的,DOS时代已经过去了,我们后面会拿他来读取硬盘,软盘,来加载操作系统加载器。今天先这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值