汇编学习
学习教程
1.1 机器语言介绍
- 指令: 01010000 (push ax)
- 电平脉冲
- 计算机里面 0101 是通过电平脉冲来传导表示的 ,0 低点平,1 高电平
- 以后我们提到的计算机是指由CPU和其他受CPU直接或者间接控制的芯片、器件、设备组成的计算机系统
- 汇编指令只是便于记忆和书写而已
参考学习教程,loop,stack,printf,scanf, condition
nasm 是个可以移植的程序,支持的文件格式有:
Aout,as86,coff,elf32,elf64,elfx32,ieee,macho32,macho64,dbg,rdf,ith,srec,bin等
配置 Makefile并且允许代码
1
2
3
4
5
6
7
|
all:
nasm -f elf64 -o hello.o hello.s
ld -o hello hello.o
clean:
rm hello hello.o
|
参考学习的项目
8086汇编基础
网上找了很多教程,都是教这种
栈
下面例子,我们可以将1000H到1000FH这段内存当作栈来使用
1
2
3
4
5
6
7
8
9
|
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx, 1122H
push cx
pop ax
pop bx
pop cx
|
1
2
3
4
5
6
7
8
9
|
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx 1122H
push cx
pop ax
pop bx
pop cx
|
思考问题
- CPU如何知道一段内存空间被当作栈使用?
- 执行push和pop的时候,如何知道哪个单元是栈顶单元?
实现一个简单的操作系统引导程序
从零开发操作系统-参考学习教程
操作系统引导程序教程2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 创建虚拟磁盘
diskpart
# 创建虚拟磁盘的命令
create vdisk file=G:\\osLab\disk.vhd maximum=10 type=fixed
# 创建一个10M的 虚拟磁盘文件
exit
nasm day1.asm -o boot.bin
# 将 boot.bin 启动的二进制文件写进虚拟磁盘
dd if=boot.bin of=./os.vhd bs=512 count=1
# 必须要 1+0 recorde in 出行才表示写成功
# 注意,这个 dd.exe 最好自己去下载一个,我用 msys2 自带的 dd.exe 发现有问题,自己把原来的 vhd 文件覆盖了
# if 表示 input file,os 表示 outputfile
# vbox运行要选 other,因为是我们自己写的系统引导程序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
org 07c00h
;这是所有硬件厂商规定的
; bios检查完毕后 就能跳到这个位置
mov ax,cx
; 代码段放到 ax寄存器里面
mov dx,ax
mov es,ax
call Disp
# 显示程序
jmp $
; cpu 会不停在这里等待,无限运行,表示跳到当前位置
;display 的意思
Disp:
mov ax,BootMsg
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
;调第10号中断
BootMsg: db "Hello,OS !!!"
times 510 - ($-$$) db 0
dw 0xaa55
; magic code, 必须是特定位置是 55aa的时候,才能被识别为可加载扇区
|
编写 makefile
1
2
3
4
5
6
7
8
|
srcFile=hello.s
# dd if=hello.bin of=G:/osLab/OsLab.vhd bs=512 count=1
buildOsBoot:
nasm -o hello.bin ${srcFile}
clean:
rm hello hello.o
|