一、模拟终端的输入循环
直接上源代码
[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
清屏了!
照这样,添加自己的命令吧!