自制操作系统(二、类似终端的操作系统框架)

一、模拟终端的输入循环

直接上源代码

[org 0x7c00]

start:
	
	mov bp, 0x8000
	mov sp, bp

	mov ax, 0x0600
	mov bx, 0x0700
	mov cx, 0
	mov dx, 0x184f
	int 0x10

	mov ah, 0x02
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 0x10

.print:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'H'
	int 0x10

	mov al, 'a'
	int 0x10

	mov al, 'n'
	int 0x10

	mov al, 'O'
	int 0x10

	mov al, 'S'
	int 0x10


	mov al, '>'
	int 0x10

	mov al, '>'
	int 0x10




.wait_input:
	mov ah, 0x00
	int 0x16

	cmp al, 0x0D
	je .bad_input
	
	mov ah, 0x0E
	int 0x10
	jmp .wait_input
.bad_input:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'b'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'd'
	int 0x10

	jmp .print
.done:
	ret
	jmp .done






times 510-($-$$) db 0
dw 0xAA55

大家应该都看得懂,循环输入,回车就打印bad

jmp是跳转,相当于c语言里的goto,跳转到标签的地址

cmp是比较,je是比较为正确就跳转,jne是比较为错误就跳转

ret在这里相当于hlt,即挂起,这条指令实际没有执行,这是后面用的

二、试添加清屏指令

无论输入什么都是bad,添加一点指令吧

[org 0x7c00]

start:
	
	mov bp, 0x8000
	mov sp, bp

	mov ax, 0x0600
	mov bx, 0x0700
	mov cx, 0
	mov dx, 0x184f
	int 0x10

	mov ah, 0x02
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 0x10

.print:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'H'
	int 0x10

	mov al, 'a'
	int 0x10

	mov al, 'n'
	int 0x10

	mov al, 'O'
	int 0x10

	mov al, 'S'
	int 0x10


	mov al, '>'
	int 0x10

	mov al, '>'
	int 0x10




.wait_input:
	mov ah, 0x00
	int 0x16

	cmp al, 'c'
	je .check_input_c1

	cmp al, 0x0D
	je .bad_input

	mov ah, 0x0E
	int 0x10
	jmp .wait_input

.check_input_c1:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
.check_input_c2:
	mov ax, 0x0600
	mov bx, 0x0700
	mov cx, 0
	mov dx, 0x184f
	int 0x10
	mov ah, 02h
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 10h
	jmp .print
	
.bad_input:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'b'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'd'
	int 0x10

	jmp .print
.done:
	ret
	jmp .done






times 510-($-$$) db 0
dw 0xAA55

输入c,回车就可以清屏, 

编译方法一样

在当前目录打开终端,用nasm编译成二进制文件

nasm hanos.asm -o hanos.bin

点开 Cygwin.bat,输入

cd /
dd if=/dev/zero of=hanos.img bs=512 count=2
dd if=hanos.bin of=hanos.img bs=512 count=1

虚拟机运行

 

随便写点东西

输入c

清屏了! 

照这样,添加自己的命令吧!

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值