NASM实现Helloworld
NASM实现Hello,world
本人以《X86汇编语言:从实模式到保护模式》为参考书。
运行环境
- VirtualBox、.vhd固定大小分配
- 虚拟机的配置为:Other–other/unknow
需要软件:
《X86汇编语言:从实模式到保护模式》附带工具包中的"Vhd Writer"工具。
NASM编译器
前提了解
①在8086CPU中,其中0xB800~0xBFFF是显卡所在区域,因此,只要将数据写显存,就可以在屏幕上输出。
②一个有效的主引导扇区,最后两个字节应该是0x55和0xaa。
③ROM-BIOS读取主引导扇区(512字节)的时候,会将其加载到逻辑地址0x0000:0x7c00处,也就是物理地址0x07c00处,然后判断它是否有效。
代码实现如下:
;显示Hello,world!jmp near start ;跳过数据段mytext: db 'H',0x07,'e',0x07,'l',0x07,'l',0x07,'o',0x07,',',0x07,\'w',0x07,'o',0x07,'r',0x07,'l',0x07,'d',0x07start:mov ax,0x7c0 ;设置数据段基地址mov ds,axmov ax,0xb800 ;设置附加段地址mov es,axcld ;正向传送mov si,mytext ;设置源索引地址mov di,0 ;设置目标索引地址:mov cx,(start-mytext)/2 ;设置传送次数rep movsw ;开始传送times 510-($-$$) db 0db 0x55,0xaa
启动代码:
- 使用nasm将上述代码翻译为.bin文件
- 使用Vhd Writer将bin文件写入到vhd虚拟硬盘中
- 启动虚拟机
如图:
解释:
1. 电脑启动时,会将上述代码顺序加载到0x0000:0x7c00。因此我们要先获得Hello,world的地址。
2. 由于逻辑地址0x0000:0x7c00对应的物理地址是0x07c00,该地址又是段 0x07C0 的起始地址。因此,这个物理地址可以解释为另一个逻辑地址0x07c0:0000。
**3.**movsw每次传送一个字(2个字节),执行时,原始数据串的段地址由DS指定,偏移地址由SI指定,简写为DS:SI。传送目的地由ES:DI指定。传送的字数由CX指定。传送方向由DF指定
**4.**因此,首先将DS设置为0x07c0。然后将ES设置为0xb800
**5.**然后使用cld将DF设置为0,进行正向传送
**6.**字符串的偏移地址就是mytext。
**7.**再使用(start-mytext)/2计算出要传送的字数
**8.**由于movsw每次仅传送一个字,所以要使用rep来重复传送
**9.**最后,使用times重复得到510-(−-−$)个0来填充其余部分,并设置最后两个字节为0x55和0xaa
需要知道的是:
一个字符占用两个字节,一个用来存储ASCII码,另外一个用来存储字符的属性。0x07意味着“黑底白字”
NASM实现Helloworld相关推荐
- NASM汇编helloworld图解
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器.它支持相当多的目标文件格式,包括 Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'' ...
- 在Mac上写汇编!(一)helloworld nasm on macos
参考和感谢: https://blog.csdn.net/s793223706/article/details/82469971 教你在Mac上写汇编 https://stackoverflow.co ...
- NASM汇编语言与计算机系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)
本文涉及到的汇编指令mov,jmp,times(独有),dd(独有),dw (独有),$,$$ dd/dw times 10 dd 0 ;dd表示一个双字,在8086下占用4个字节 times 10 ...
- linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
0. 说明 本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程 系统环境搭建:(我用的是ubuntu18.04 ...
- 如何在Mac上用汇编语言写HelloWorld
首先,Mac自带nasm,不过我们要先将其升级. 升级它的方法有很多种,因为我已经装好了homebrew,所以我直接在终端输入: brew install nasm 这样就升级啦- 接下来,创建一个H ...
- 1、环境搭建、Helloworld
1.NASM环境搭建 参考:NASM环境搭建 2.Diskpart创建虚拟硬盘 百度百科Diskpart C:\>diskpart Microsoft DiskPart 版本 10.0.1506 ...
- NASM汇编语言与计算机系统02-实模式-显存原理
显卡以高频的刷新速度一直不停的扫描显存中的数据,将显存中的数据显示到屏幕上 显卡有两种模式 1.文本模式:为了方便叙述,本文的代码示例采用文本模式 2.图形模式 对于CPU来说,显存也是内存,显存的地 ...
- NASM汇编初探(入门教程)
Learn Assembly Language 文章目录 Learn Assembly Language 1. Lesson 1 Hello, world! 1.1 Background 1.2 Wr ...
- 【asm基础】使用nasm进行汇编(基础)
说明 nasm与vs的masm存在差异,如nasm源程序可以只有指令,而不需要段分布,主函数等等.以下是一个例子: mov eax, 0 inc eax 通过nasm编译: 编译完成后生成一个test ...
最新文章
- java VM 推荐的命令行设置
- (已解决) MySQL: ERROR 1045 (28000): Access denied for user 'xxxxx'@'localhost' (using password: NO)
- 新手入门Web安全学习Week7
- 开源学习管理系统(LMS)的比较
- LVS学习笔记之三种模式的特点概括
- mvc+ef中比较数据
- 小米新生态总监董红光:致力打造智能服务开放平台
- 网站服务器系统组成,linux系统由哪几部分组成_网站服务器运行维护,linux
- 实现会员到期_微信电子会员卡管理系统
- 永中office之在线预览(vue/js版)
- [ZZ]美图秀秀怎么加水印
- 面试之防火墙软硬件架构
- matlab求两向量夹角_MATLAB基础练习(一)
- 基于物联网技术的校园智慧消防管理平台-Susie 周
- 爬取豆瓣电影排行榜top 250
- OSPF路由器类型 ABR与ASBR路由聚合区别
- 低配电脑不能运行大型游戏?试试AWS EC2
- 安卓仿微信录音功能实现
- NVML编译官方用例报错
- Android——浙理体育(飞翔的红蜻蜓)反编译分析
热门文章
- react+flexible兼容分辨率
- Eclipse中Tomcat 修改后台代码即时生效
- 数码计算机英语翻译,计算机数码动画,computer digital cartoon,音标,读音,翻译,英文例句,英语词典...
- mysql存储过程返回查询结果集_MYSQL存储过程查询返回结果处理方法
- java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 手机端基础设置
- QD港服务器配置完整过程
- 好看的皮囊千篇一律,有趣的书籍万里挑一,学习Java必读的两款书籍推荐
- NKOJ 4974 「NOIP模拟」乌鸦坐飞机【倍增优化DP】
- 如果你想做实施,那么你必须要了解实施的这些冷知识
- C语言之位域(位段)入门详解