Pinvon's Blog

所见, 所闻, 所思, 所想

汇编语言学习与Makefile入门

Table of Contents

汇编语言

; 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个磁道(track)有几个扇区(必须是18)
		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			; 给SL加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		; 换行2次
		DB		"hello!world!"
		DB		0x0a			; 换行
		DB		0

		RESB	0x7dfe-$		; 0x7dfe到0x00来填补命令

		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

ORG指令: 告诉系统, 在开始执行的时候, 把这些机器语言指令装载到内存中的哪个地址. 指令名称来源于英文origin.

entry: 声明标签, 用于指定JMP指令的跳转目的地.

MOV: 赋值.

Comments

使用 Disqus 评论
comments powered by Disqus