第2天 汇编语言与makeFile

汇编

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

批处理,可以根据配置项,自动执行命令。在执行make命令时首先回自动查找目录下名称未Makefile的文件,然后解析文件。

posted @   RainbowMagic  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示