这次要实现操作系统大众化,制作一个让普通人能自制操作系统的软件,不然就算你的操作系统做得再好,依然无人问津,大家都在用 Windows
我们选择用 python 实现,因为 python 比较简单,就算没学过也看得懂(至少我是这样的),下面是代码实现
没有python环境的在这里下载已经打包好的exe
from tkinter import*
code = '\n[org 0x7c00]\nstart1:\n\tmov ax, 0x0820\n\tmov es, ax\n\tmov bx, 0x0000\n\tmov ax, 2\n\tmov cl, 2\n\tmov dh, 0\n\tmov ch, 0\n\tmov dl, 0\nread_loop:\n\tmov ah, 0x02\n\tmov al, 1\n\tint 0x13\n\tjc error\n\tadd ax, 1\n\tadd bx, 512\n\tcmp ax, 6\n\tjb read_loop\nstart:\n\t\n\tmov bp, 0x8000\n\tmov sp, bp\n\n\t\n\tmov ax, 0x0600\n\tmov bx, 0x0700\n\tmov cx, 0\n\tmov dx, 0x184f\n\tint 0x10\n\n\n\tmov ah, 0x0E\n'
def assign_to_os_name1():
global code, os_name
os_name = entry.get()
print(os_name)
os_print(os_name)
os_print(">>")
label.pack_forget()
entry.pack_forget()
button.pack_forget()
window2()
def assign_to_os_name2():
global code, main, os_name
code = f"{code}\n.wait_input:\n\tmov ah, 0x00\n\tint 0x16\n\tcmp al, '1'\n\tje .check_input\n\tcmp al, 'c'\n\tje .check_input_\n"
cmd = entry1.get()
command = entry2.get()
print(cmd)
print(command)
label.pack_forget()
entry.pack_forget()
button.pack_forget()
window2()
os_first(cmd)
code = f"{code}\n\tcmp al, 0x0D\n\tje .bad_input\n\tmov ah, 0x0E\n\tint 0x10\n\tjmp .wait_input\n.check_input:\n\tmov ah, 0x0E\n\tint 0x10\n\tmov ah, 0x00\n\tint 0x16\n\tmov ah, 0x0E\n\tint 0x10\n\tcmp al, '2'\n\tjne .wait_input\n\tmov ah, 0x00\n\tint 0x16\n\tmov ah, 0x0E\n\tint 0x10\n\tcmp al, '3'\n\tjne .wait_input\n\tmov ah, 0x00\n\tint 0x16\n\tcmp al, 0x0D\n\tjne .wait_input\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, '4'\n\tint 0x10\n\tmov al, '5'\n\tint 0x10\n\tmov al, '6'\n\tint 0x10\n\tmov al, '!'\n\tint 0x10\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tmov ah, 0x0E\n\tmov al, '>'\n\tint 0x10\n\tjmp .wait_input\n.check_input_:\n\tmov ah, 0x0E\n\tint 0x10\n\tmov ah, 0x00\n\tint 0x16\n\tmov ah, 0x0E\n\tint 0x10\n\tcmp al, 'l'\n\tjne .wait_input\n\tmov ah, 0x00\n\tint 0x16\n\tmov ah, 0x0E\n\tint 0x10\n\tcmp al, 's'\n\tjne .wait_input\n\tmov ah, 0x00\n\tint 0x16\n\tcmp al, 0x0D\n\tjne .wait_input\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov ax, 0x0600\n\tmov bx, 0x0700\n\tmov cx, 0\n\tmov dx, 0x184f\n\tint 0x10\n\tmov ah, 02h\n\txor bh, bh\n\tmov dh, 0\n\tmov dl, 0\n\tint 10h\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tmov ah, 0x0E\n\tmov al, '>'\n\tint 0x10\n\tjmp .wait_input\n\t.bad_input:\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, 'b'\n\tint 0x10\n\tmov al, 'a'\n\tint 0x10\n\tmov al, 'd'\n\tint 0x10\n\tmov al, '!'\n\tint 0x10\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tjmp .wait_input\n\t.done:\n\tret\n"
code = f"{code}\n.check_input_{cmd}:\n\tmov ah, 0x0E\n\tint 0x10"
os_other(cmd)
os_print(command)
os_end_print()
os_end()
f = open(f'{os_name}.asm', 'w')
f.write(code)
f.close()
exit()
def os_print(string):
global code
for s in string:
code = f"{code}\n\tmov al, '{s}'\n\tint 0x10\n"
def os_first(string):
global code
i = 0
for s in string:
i += 1
code = f"{code}\n\tcmp al, '{s}'\n\tje .check_input_{string}\n"
if i >= 1:
break
def os_other(string):
global code
string = string[1:]
i = 0
for s in string:
i += 1
code = f"{code}\n\t\n\tmov ah, 0x00\n\tint 0x16\n\tmov ah, 0x0E\n\tint 0x10\n\tcmp al, '{s}'\n\tjne .wait_input\n"
code = f"{code}\n\t\n\tmov ah, 0x00\n\tint 0x16\n\tcmp al, 0x0D\n\tjne .wait_input\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n"
def os_end_print():
global code
code = f"{code}\n\tmov ah, 0x0E\n\tmov al, 0x0D\n\tint 0x10\n\tmov al, 0x0A\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tmov al, '>'\n\tint 0x10\n\tjmp .wait_input\n"
def os_end():
global code
code = f"{code}\ntimes 510-($-$$) db 0\ndw 0xAA55\n"
root = Tk()
root.title("自制操作系统")
root.geometry("400x300")
def window1():
global label, entry, button
label = Label(root, text="操作系统的名字")
label.pack()
entry_var = StringVar()
entry = Entry(root, textvariable=entry_var)
entry.pack()
button = Button(root, text="下一步", command=assign_to_os_name1)
button.pack()
def window2():
global label, entry1, entry2, button
label = Label(root, text="添加命令")
label.pack()
entry_var1 = StringVar()
entry1 = Entry(root, textvariable=entry_var1)
entry1.pack()
entry_var2 = StringVar()
entry2 = Entry(root, textvariable=entry_var2)
entry2.pack()
button = Button(root, text="完成", command=assign_to_os_name2)
button.pack()
window1()
root.mainloop()
代码非常通俗易懂对不对,为了体谅没有学过 python的读者,没有导入任何第三方库(冷知识:tkinter是python标准库)
代码实现了根据用户输入,创造asm文件
代码不多不少,刚刚好100行,逻辑清晰,不难理解
看看效果:
没有任何问题