汇编学习

学习教程

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
1
make && ./hello

参考学习的项目

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
  • 两个指令学习
    • push (入栈)
      • push ax, 寄存器ax数据送入栈中
    • pop 出栈
      • pop ax,栈顶数据送入 ax中
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. CPU如何知道一段内存空间被当作栈使用?
  2. 执行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