汇编
org
origin 表示程序加载的开始地址,也就是将程序从什么位置进行加载
JMP
相当于c语言的goto语句,无条件跳转。
jmp entry表示跳转到entry语句块。
MOV
数据传送指令,需要注意的是,mov的操作数和源操作数不能全是内存地址,因为cpu只能对内存进行读操作或者写操作,不能对内存进行即读又写。
mov ax, 20
将20赋值到ax寄存器中
mov SI, msg 将msg的地址存储到SI中
mov ax, [msg] 将msg地址保存的内容存储到ax中
寄存器
AX:累加器,可以将高位8位拆分位AH,将低8位拆分位AL
CX:计数器,可以将高8位拆分位CH,将低8位拆分位CL
DX:数据寄存器,可以将高8位拆分为DH,将低8位拆分位DL
BX:基址寄存器,可以将高8位拆分位BH,将低8位拆分位DL
SP:栈指针寄存器
BP:基址指针寄存器
SI:源变址寄存器
DI:目的变址寄存器
以上寄存器都是16位寄存器,只能存储16个二进制数。
ADD
加分指令
ADD ax, 50
表示 ax = ax + 50
CMP
一般与JE指令一起使用,比较操作数和源操作数的值,如果两者相等则JE进行跳转
CMP AL, 0
JE fin
如果al == 0则跳转到fin语句块中。
INT
调用BIOS中断,BIOS中断向量表详情可看维基百科。
HLT
全称halt,程序运行完毕时,可以使用HLT指令使CPU进入睡眠状态。
0x7c00
BIOS会将0面0道1扇区的数据结尾是不是aa55,如果是则将该硬盘的一个扇区也就是512字节加载到0x7c00-0x7eff处。
```asm
; hello-os
; TAB=4
org 0x7c00
; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト)
DW 512 ; 1セクタの大きさ(512にしなければいけない)
DB 1 ; クラスタの大きさ(1セクタにしなければいけない)
DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする)
DB 2 ; FATの個数(2にしなければいけない)
DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない)
DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない)
DW 9 ; FAT領域の長さ(9セクタにしなければいけない)
DW 18 ; 1トラックにいくつのセクタがあるか(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:
; si中存储的是msg语句块的地址,将msg语句中的地址中保存的值取出来 存储到al中
mov al, [si]
; 每次地址 + 1 也就挪动一个字符
add si, 1
; 当移动到0时表示已经结尾了 当al等于0时 跳转到fin中
cmp al, 0
je fin
mov ah, 0x0e
mov bx, 15
int 0x10
jmp putloop
fin:
hlt
mov ax, 0x0820
mov es, ax
mov ch, 0
mov dh, 0
mov cl, 2
jmp 0x7dff
msg:
DB 0x0a, 0x0a
DB "Hello Lyra OS"
DB 0x0a
DB 0
RESB 0x7dfe-$
DB 0x55, 0xaa
标签:汇编语言,makeFile,DB,mov,DW,寄存器,msg,ax
From: https://www.cnblogs.com/lyraHeartstrings/p/16772524.html