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

启动代码:

  1. 使用nasm将上述代码翻译为.bin文件
  2. 使用Vhd Writer将bin文件写入到vhd虚拟硬盘中
  3. 启动虚拟机
    如图:


解释:

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相关推荐

  1. NASM汇编helloworld图解

    NASM是一个为可移植性与模块化而设计的一个80x86的汇编器.它支持相当多的目标文件格式,包括 Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'' ...

  2. 在Mac上写汇编!(一)helloworld nasm on macos

    参考和感谢: https://blog.csdn.net/s793223706/article/details/82469971 教你在Mac上写汇编 https://stackoverflow.co ...

  3. NASM汇编语言与计算机系统03-实模式-屏幕显示HelloWorld(mov,jmp,time,dd,dw,$$)

    本文涉及到的汇编指令mov,jmp,times(独有),dd(独有),dw (独有),$,$$ dd/dw times 10 dd 0 ;dd表示一个双字,在8086下占用4个字节 times 10 ...

  4. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

    0. 说明 本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程 系统环境搭建:(我用的是ubuntu18.04 ...

  5. 如何在Mac上用汇编语言写HelloWorld

    首先,Mac自带nasm,不过我们要先将其升级. 升级它的方法有很多种,因为我已经装好了homebrew,所以我直接在终端输入: brew install nasm 这样就升级啦- 接下来,创建一个H ...

  6. 1、环境搭建、Helloworld

    1.NASM环境搭建 参考:NASM环境搭建 2.Diskpart创建虚拟硬盘 百度百科Diskpart C:\>diskpart Microsoft DiskPart 版本 10.0.1506 ...

  7. NASM汇编语言与计算机系统02-实模式-显存原理

    显卡以高频的刷新速度一直不停的扫描显存中的数据,将显存中的数据显示到屏幕上 显卡有两种模式 1.文本模式:为了方便叙述,本文的代码示例采用文本模式 2.图形模式 对于CPU来说,显存也是内存,显存的地 ...

  8. NASM汇编初探(入门教程)

    Learn Assembly Language 文章目录 Learn Assembly Language 1. Lesson 1 Hello, world! 1.1 Background 1.2 Wr ...

  9. 【asm基础】使用nasm进行汇编(基础)

    说明 nasm与vs的masm存在差异,如nasm源程序可以只有指令,而不需要段分布,主函数等等.以下是一个例子: mov eax, 0 inc eax 通过nasm编译: 编译完成后生成一个test ...

最新文章

  1. java VM 推荐的命令行设置
  2. (已解决) MySQL: ERROR 1045 (28000): Access denied for user 'xxxxx'@'localhost' (using password: NO)
  3. 新手入门Web安全学习Week7
  4. 开源学习管理系统(LMS)的比较
  5. LVS学习笔记之三种模式的特点概括
  6. mvc+ef中比较数据
  7. 小米新生态总监董红光:致力打造智能服务开放平台
  8. 网站服务器系统组成,linux系统由哪几部分组成_网站服务器运行维护,linux
  9. 实现会员到期_微信电子会员卡管理系统
  10. 永中office之在线预览(vue/js版)
  11. [ZZ]美图秀秀怎么加水印
  12. 面试之防火墙软硬件架构
  13. matlab求两向量夹角_MATLAB基础练习(一)
  14. 基于物联网技术的校园智慧消防管理平台-Susie 周
  15. 爬取豆瓣电影排行榜top 250
  16. OSPF路由器类型 ABR与ASBR路由聚合区别
  17. 低配电脑不能运行大型游戏?试试AWS EC2
  18. 安卓仿微信录音功能实现
  19. NVML编译官方用例报错
  20. Android——浙理体育(飞翔的红蜻蜓)反编译分析

热门文章

  1. react+flexible兼容分辨率
  2. Eclipse中Tomcat 修改后台代码即时生效
  3. 数码计算机英语翻译,计算机数码动画,computer digital cartoon,音标,读音,翻译,英文例句,英语词典...
  4. mysql存储过程返回查询结果集_MYSQL存储过程查询返回结果处理方法
  5. java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 手机端基础设置
  6. QD港服务器配置完整过程
  7. 好看的皮囊千篇一律,有趣的书籍万里挑一,学习Java必读的两款书籍推荐
  8. NKOJ 4974 「NOIP模拟」乌鸦坐飞机【倍增优化DP】
  9. 如果你想做实施,那么你必须要了解实施的这些冷知识
  10. C语言之位域(位段)入门详解