前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >主引导扇区程序代码优化-2

主引导扇区程序代码优化-2

作者头像
多凡
发布2021-12-06 13:43:46
2.5K0
发布2021-12-06 13:43:46
举报
文章被收录于专栏:sringboot

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

引言

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

内存复制指令

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

代码语言:javascript
复制
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格式硬盘,以模拟启动硬盘,我们将把二进制程序,写入到该硬盘的第一个扇区。

代码

代码语言:javascript
复制
    jmp near start 

mytext:
    db 'd',0x07,'o',0x07,'u',0x07,'f',0x07,'a',0x07,'n',0x07, ':',0x07
number:
    db 0,0,0,0,0

start:
    ; 设置数据段 基地址
    mov ax,0x7c0
    mov ds,ax

    ; 设置附加段基地址
    mov ax,0xb800
    mov es,ax

    ; 复制内存区域

    ; 清0正向复制   std置1反向复制
    cld         
    mov si,mytext
    mov di,0
    mov cx,(number-mytext)/2
    rep movsw

    mov ax,number

    ;计算各个位
    mov bx,ax
    mov cx,5            ; 循环次数
    mov si,10
digit:
    xor dx,dx
    div si
    mov [bx],dl
    inc bx              ; bx 自增1
    loop digit


    mov bx,number
    mov si,4

show:
    mov al,[bx+si]
    add al,0x30
    mov ah,0x04
    mov [es:di],ax
    add di,2
    dec si      ; 自减1
    jns show    

    mov word [es:di],0x0744

    jmp near $      ; $ 代表当前标号

    ; 填充字节
    times 510-($-$$) db 0    ; $$ 代表当前汇编节(段)的起始汇编地址
    db 0x55,0xaa    

实践结果

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 程序环境
  • 代码
  • 实践结果
  • 资源
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档