《30天自制操作系统》一书中第1天和第二天中有关汇编语言的程序的理解

; hello-os
; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下的记述用于标准FAT12格式的软盘 JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区的名称可以是任意的字符串(8字节)
DW 512 ; 每个扇区(sector)的大小(必须为512字节)
DB 1 ; 簇(cluster)的大小(必须为1个扇区)
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数(必须为2)
DW 224 ; 根目录的大小(一般设成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘的种类(必须是0xf0)
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道有几个扇区
DW 2 ; 磁头数(必须是2)
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明,固定
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; 磁盘的名称(11字节)
DB "FAT12 " ; 磁盘格式名称(8字节)
RESB 18 ; 先空出18字节 ; 程序核心 entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; 给SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 让CPU停止,等待指令
JMP fin ; 无限循环 msg:
DB 0x0a, 0x0a ; 换行两次
DB "hello, world"
DB 0x0a ; 换行
DB 0 RESB 0x7dfe-$ ; 填写0x00,直到0x001fe DB 0x55, 0xaa ; 以下是启动区以外部分的输出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
  • DB:define byte 往文件里直接写入1个字节 的指令

  • RESB:reserve byte 储备 RESB 10 储备10行

  • 0x:16进制数

  • DW:define word word表示16位 就是2字节

  • DD:define double-word 32位表示4个字节

  • RESB 0x1fe-$ $可以表示这一行现在的字节数

  • TAB=4:tab键的宽度

  • FAT12格式:(FAT12 Format)用Windows或MS-DOS格式化出来的软盘就是这种格式

  • 启动区:(boot sector):软盘的第一个扇区称为启动区 该扇区的最后两个字节的内容不是55 AA,计算机会认为这张盘没有所需的启动程序,就会保一个不能启动的错误

  • IPL:initial program loader启动程序加载器 加载操作系统本身的程序放在启动区

  • ORG:origin 告诉nask,在开始执行时,将这些机器指令装载到内存中的指定地址

    • $:代表将要读入的内存地址
  • JMP:jump goto

  • entry:标签的呃声明,用于指定JMP指令的跳转目地等 入口

  • MOV:赋值

    • AX:accumulator,累加寄存器

    • CX:counter,计数寄存器

    • DX:data,数据寄存器

    • BX:base,基址寄存器

    • SP:stack pointer,栈指针寄存器

    • BP:base pointer,基址指针寄存器

    • SI:source index,源变址寄存器

    • DI:destination index,目的变址寄存器

    • 16位寄存器,因此可以存储16位的二进制数 X表示扩展

    • ======================================================================================================================================================

    • AL:累加寄存器低位(accumulator low)

    • CL:计数寄存器低位(counter low)

    • DL:数据寄存器低位(data low)

    • BL:基址寄存器低位(base low)

    • AH:累加寄存器高位(accumulator high)

    • CH:计数寄存器高位(counter high)

    • DH:数据寄存器高位(data high)

    • BH:基址寄存器高位(base high)

    • ================================================================================================================================================================

    • AX = AL + AH

    • ================================================================================================================================================================

    • 32位寄存器:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI

    • 段寄存器(segment register):16位寄存器

      • ES:附加段寄存器(extra segment)
      • CS:代码段寄存器(code segment)
      • SS:栈段寄存器(stack segment)
      • DS:数据段寄存器(data segment)
      • FS:没有名称(segment part 2)
      • GS:没有名称(segment part3)
    • ===========================================================================================================================================================

      • MOV BYTE [678], 123 :用内存的’678‘号地址来保存’123‘这个数值

      • MOV WORD [678], 123:678号和旁边的679都会做出反应,低位保存在678,高位保存在679

      • 数据大小[地址]

      • 可以用寄存器来指定内存地址

        只有BX、BP、SI、DI 不可以:AX、CX、DX、SP

      • MOV BX, DX

      • MOV AL, BYTE[BX]

      • 源数据和目的数据必须位数相同 MOV AL [BX]

  • CMP:比较指令

  • JE:条件跳转指令,比较结果相等,跳转到指定的地址;不相等,则不跳转,继续执行下一条指令

  • fin:标号,表示结束

  • INT:软件中断指令 interrupt

  • BIOS:basic input output system基本输入输出系统(程序) 出厂时就组装在电脑主板上的ROM单元里 各种函数的集合,可以被INT调用

  • HLT:让CPU进入待机状态 halt

最新文章

  1. Redis 连接问题
  2. js实现-下拉列表左右选择
  3. 如何解压.bz2文件包
  4. 关闭VS实时调试器
  5. TI CC2541的整体目标
  6. [SAP ABAP开发技术总结]将文件存储到数据库表中,并可发送邮件
  7. java.util.ResourceBundle
  8. SNMP中文
  9. 一个c++给程序打log的单例模式类
  10. GUI编程笔记(java)11:使用Netbeans工具进行GUI编程
  11. Rosenbrock function
  12. the.book.of.gimp.pdf文字不显示
  13. 怎样查看Jdk是32位还是64位
  14. 从零开始学习前端开发 — 12、CSS3弹性布局
  15. Firefox书签同步工具Xmarks
  16. [面试题]vi/vim快捷键及面试题系列
  17. excel图片链接转图片
  18. 子数组的最大异或和---Trie
  19. Linux - 文件和目录
  20. 前景检测(1):VIBE

热门文章

  1. .NetCore下构建自己的服务配置中心-手动造轮子
  2. mysql自动安装脚本
  3. Linux的六种查找命令
  4. mysql 的 if 和 SQL server 的 iif
  5. EgLine V0.3—LVGL官方拖拽式UI编辑工具(可导出代码)
  6. 【Java常用类】System
  7. sql语句操作(详细)
  8. [开发笔记usbTOcan]系统架构设计
  9. unity3d百度语音合成mp3流转换byte[]失败
  10. Mybatis插件,能做的事情真的很多