Intel8086处理器使用NASM汇编语言实现操作系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)

本文主要是介绍Intel8086处理器使用NASM汇编语言实现操作系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文涉及到的汇编指令及关键字mov,jmp,times(独有),dd(独有),dw (独有),db(独有),$,$$,byte,word
dd/dw

times 10 db 0		  ;db在8086下占用1个字节
times 10 dw 0		  ;dd表示一个字,在8086下占用2个字节
times 10 dd 0		  ;dd表示一个双字,在8086下占用4个字节,这句话是编译器编译的时候,从当前行开始填充0;一个0占用4个字节,填充10次,那么最终的意思就是从当前位置开始,后续的40个字节,都会被0填充					

mov正确写法

mov ax,bx
mov ax,666            ;666是个立即数,而不是地址
mov ax,0x7c00         ;7c00是个立即数,可不是地址
mov [0x7c05],ax       ;以ds为段寄存器,也可以写成[ds:0x7c05]
mov byte [0x7c05],0x01;byte指定0x011个字,如果没有byte关键字,那么将0x01放到[0x7c05]位置之后,;编译器不知道0x01应该占用几个字节
mov word [0x7c05],0x01;同上,只不过word表示2个字节宽度,而byte表示1个字节宽度
mov ax,[0x7c05]       ;此处没必要使用byte,因为ax的长度就是1个字

mov错误写法

mov [0x7c10],0x123    ;没有指定0x123的长度
mov [0x7c10],[0x7c00] ;不允许两个操作数都是地址,;因为CPU不能自己直接将一个内存地址的数据放到另外一个地址,;必须得通过寄存器,但是如果通过寄存器,那么应该通过哪个寄存器?;所以必须我们指定才行mov ds,0x7c00		  ;不能直接给段寄存器赋值立即数
mov ax,ah			  ;ax与ah的宽度不同,mov的两个操作数要求宽度必须相同

[address] 正确写法

mov ax,[bp]            ;使用ss段寄存器,ss,bp,sp是个组合
mov ax,[ss:bp]  	   ;上面代码的完整写法
mov ax,[bx] 		   ;使用ds段寄存器
mov ax,[si] 		   ;使用ds段寄存器
mov ax,[di] 		   ;使用ds段寄存器
mov ax,[bp+si] 		   ;使用ss段寄存器
mov ax,[bp+di] 		   ;使用ss段寄存器

[address] 错误写法

mov ax,[dx]			   ;[]里面的非段寄存器只能放bp,bx,di,si
mov [es:ax],bx		   ;[]出现ax是不可以的,只能是bp,bx,di,si
mov ax,[bp+bx]		   ;bp和bx冲突,因为不知道应该使用ss还是ds

jmp正确写法

;标号跳转
a:mov ax,666
jmp a  				   ;标号这种写法是通过减偏移量的方式跳转,没有改变CS;如果往前跳转,则a位置-jmp位置,得到一个负数偏移量;如果往后跳转,则后面那个位置-jmp位置,得到一个正数偏移量
;寄存器跳转
mov ax,0x7c00
jmp ax 				   ;在当前段内跳转,因为没改变CS
;指定物理地址跳转
jmp 0x0000:0x7c00	   ;跳转到指定物理地址,可以跳到其他段去,因为改变了CS

NOTE:虽然mov指令的用法很多,但是每一种用法,都对应一种机器码,mov的多样性其实还是编译器导致的

示例代码:屏幕左上角显示A

mov ax,0b800h
mov ds,axmov byte [0],41H		;asicc码41H是大写英文字母A
;7=0111表示背景白色,并且不闪烁;F=1111表示白字,高亮    
mov byte [1],7FH

了解了这个简单的原理之后,我们就可以自己往硬盘上写程序,然后开机立马显示我们想要的画面,下面的代码是NASM汇编代码,将下面代码放入硬盘主引导扇区,则开机会显示XY

codestart:
mov ax,0b800h
mov ds,ax
show:
mov byte [0],'X'
mov byte [1],0bH
mov byte [2],'Y'
mov byte [3],0bH
jmp show
codeend:
times 510-(codeend-codestart) db 0cch
dw 0AA55H  

NASM提供了$符号来表示当前行汇编地址,$$符号表示当前段的汇编地址,所以上述代码可以按照如下修改

mov ax,0b800h
mov ds,ax
show:
mov byte [0],'X'
mov byte [1],0bH
mov byte [2],'Y'
mov byte [3],0bH
jmp show
times 510-($-$$) db 0cch
dw 0AA55H

上一章:NASM汇编语言与计算机系统02-显存原理
下一章:NASM汇编语言与计算机系统04-屏幕显示不定长度的字符串

这篇关于Intel8086处理器使用NASM汇编语言实现操作系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057308

相关文章

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os