上一期的代码使用笨拙的手段,将字符传入到显卡里,如果要增加或减少字符,工作量就会很大,考虑到这点,汇编当然有更好的方式去实现了,那就是循环,这篇文章将详细介绍。
会使用到一些新的指令 cld, movsw,rep,inc,loop,dec,jns,,,,$等

引言

依然先介绍会使用到的指令。主要是循环,和内存搬运指令。

内存复制指令

movsb,movsw
这里有两个同样功能的指令区别在于,一次转移内存的大小,movsb 的传送是以字节为单位的,而 movsw 的传送是以字为单位的。
从ds:si地址复制到es:di,复制字节数由cx指定。

DS:SI  ->  ES:DI

这里会有正向和反向复制。
当正向复制时会从内存低地址到高地址复制,反向相反。
分别通过cld和std指令控制。
正向时si和di加1或者加2(由使用复制字节还是字的指令控制)反向则是减。
每次复制一次,CX 的内容自动减一。
rep 则是使指令不断运行知道cx为0结束。

循环指令

loop 标号
循环指令标号位置指令,直到cx寄存器值为0

条件转移指令

jns
处理器在执行它的时候要参考标志寄存器的 SF 位。jns 当SF位为0,执行标号处指令。和jmp相似。(结果为负数会触发sf置1)

汇编伪指令

$$,$
$ 代表当前指令的标号,
$$是 NASM编译器提供的另一个标记,代表当前汇编节(段)的起始汇编地址。当前程序没有定义节或段,就默认地自成一个汇编段,而且起始的汇编地址是 0(程序起始处)。

这样,用当前汇编地址减去程序开头的汇编地址(0),就是程序实体的大小。再用 510 减去程序实体的大小,就是需要填充的字节数

程序环境

NASM 编译器版本 :nasm-2.07
IDE :vs code
虚拟机: oracle vm virtualBox 最新版
写入工具:fixvhdwr.exe

虚拟机

创建的虚拟机要使用固定大小vhd格式硬盘,以模拟启动硬盘,我们将把二进制程序,写入到该硬盘的第一个扇区。

代码

    jmp near start mytext:db 'd',0x07,'o',0x07,'u',0x07,'f',0x07,'a',0x07,'n',0x07, ':',0x07
number:db 0,0,0,0,0start:; 设置数据段 基地址mov ax,0x7c0mov ds,ax; 设置附加段基地址mov ax,0xb800mov es,ax; 复制内存区域; 清0正向复制   std置1反向复制cld         mov si,mytextmov di,0mov cx,(number-mytext)/2rep movswmov ax,number;计算各个位mov bx,axmov cx,5            ; 循环次数mov si,10
digit:xor dx,dxdiv simov [bx],dlinc bx              ; bx 自增1loop digitmov bx,numbermov si,4show:mov al,[bx+si]add al,0x30mov ah,0x04mov [es:di],axadd di,2dec si      ; 自减1jns show    mov word [es:di],0x0744jmp near $      ; $ 代表当前标号; 填充字节times 510-($-$$) db 0    ; $$ 代表当前汇编节(段)的起始汇编地址db 0x55,0xaa

实践结果

nasm.exe -f bin  .\Learn.ASM -o  learn.bin
编译代码,生成二进制文件。
写入到虚拟机的vhd里。运行虚拟机显示如下

资源

汇编代码及二进制文件:https://github.com/duofanCoder/x86-NASM/tree/master/ASM-Learn-2/code

虚拟机固定大小硬盘vhd文件:https://github.com/duofanCoder/x86-NASM/tree/master/ASM-Learn-2

vhd写入工具:https://github.com/duofanCoder/x86-NASM/tree/master/tools

主引导扇区程序代码优化-2相关推荐

  1. [Intel汇编-NASM]主引导扇区程序介绍

    1. 主引导扇区的作用以及开机之后的大致流程: 1) 为了学习实模式下的编程而不受操作系统的影响,因为在正常的开机后,经过主引导扇区的对操作系统的加载就会把计算机的控制权交给操作系统从而进入保护模式, ...

  2. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序

    本汇编代码对应保户模式下操作系统内核如何加载用户程序并运行 的实际主引导扇区代码: 对应的内核代码在:内核代码 对应的用户程序代码在:用户程序代码 ;代码清单13-1;文件名:c13_mbr.asm; ...

  3. 【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章,我们用比较原始的方法编写了主引导扇区的代码.点击链接查看 ...

  4. 第五章 编写主引导扇区代码

    本章的思路是,在本机上上写一段代码(这些代码的意义是往显存中写一些数据)-->编译成bin文件-->写入到vhd硬盘的引导扇区(即第一扇区,见第四章详述)-->开机从硬盘启动,从而执 ...

  5. 【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

    本文是以下几篇文章对应的主引导扇区代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式 ...

  6. 【OS学习笔记】六 实模式:编写主引导扇区代码

    上一篇文章学习了:计算机的启动过程(点击链接查看上一篇文章) 这篇文章学习记录为:编写主引导扇区代码. 参考:<X86汇编语言-从实模式到保护模式>-李忠.纯学习笔记,更详细内容请阅读正版 ...

  7. 第5章 编写主引导扇区代码

    开机过程 一.在屏幕上显示文本 01.显卡和显存 每个字节表示三原色中的一个(红绿蓝) 两种模式|-文本模式|-图像模式两种模式的显存是分开的;文本模式下,显存的内容是文本的编码:图像模式下,显存的内 ...

  8. 主引导扇区及主引导记录MBR的详细说明

    引导扇区在每个分区里都存在,但是我们常说的*主引导扇区*是硬盘的 第一物理扇区.它由两个部分组成:即主引导记录MBR和硬盘分区表DPT.在 总共512字节的主引导分区里其中MBR占446个字节(偏移0 ...

  9. 主引导扇区(MBR),分区表(DPT)及活动分区(DBR)

    主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区,从偏移01BEH开始到偏移01FDH结束的64字节. 活动分区DBR:DBR ...

最新文章

  1. MongoDB中_id(ObjectId)生成
  2. oracle导入数据
  3. CF 839 E-最大团
  4. leetcode 810. 黑板异或游戏
  5. 程序设计语言基础-知识点
  6. jQuery源码研究分析学习笔记-jQuery.deferred()(12)
  7. [思]刻意练习是不是这样的
  8. Python字符串isalpha()
  9. ESP8266 arduino下载程序不执行的若干bug
  10. meltdown漏洞解释_“ Meltdown” CPU漏洞的简化解释
  11. 【Luogu】P7995 [USACO21DEC] Walking Home B
  12. 网工学习 第十一章 网络管理 网络管理基础 网络管理协议五大标准 SNMP协议 RMON
  13. e1000e网卡驱动分析—概述
  14. 引领世界企业通讯革命——AVAYA IP Office 云计划
  15. unity ugui改变width,height,pos
  16. Python-群发推广邮件
  17. android tabhost 分割线,FragmentTabHost使用方法详解
  18. Ubuntu 20.04 安装教程
  19. 移动硬盘传输大文件容易中途断开连接
  20. html 中引入外部 css 、js 文件

热门文章

  1. 四旋翼飞行器5——各类方案设计及参考
  2. itpt_TCPL 第一章:C简要教程
  3. SpringBoot移除内置Tomcat
  4. c语言五猴分桃案例分析,C语言程序设计五猴分桃问题实验报告.doc
  5. C# 母版页页面导航
  6. excel单元格数字拆分比较
  7. 练习3-2,编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符转换为\n、\t等相应的可见的转义字符序列。要求使用switch语句。
  8. 完美解决:调用sklearn出现诸如ImportError: cannot import name ‘LogisticR‘ from ‘sklearn.linear_model‘ (D:\Progr
  9. 数据驱动VR流体仿真技能
  10. Minigui实现半透效果