自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)

先修复上一次的bug,添加新指令,并增加图形界面

#include <graphics.h>
#include <conio.h>
#include <windows.h>
#include <commdlg.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <thread>
#include <mutex>
#include <functional>
#include <vector>
#include <string>
#include <map>


void VM(const std::string& file);
// 虚拟机配置结构体
struct VMConfig {
    std::string name;
    std::string asmPath;
};

// 全局配置存储
std::map<std::string, VMConfig> vmConfigs;
const char* CONFIG_FILE = "vm.dll";

// 图形界面尺寸参数
const int WIDTH = 800;
const int HEIGHT = 600;
const int BTN_WIDTH = 200;
const int BTN_HEIGHT = 40;

// 当前操作状态
enum class AppState {
    MAIN_MENU,
    CREATE_VM,
    OPEN_VM,
    SETTINGS
};
AppState currentState = AppState::MAIN_MENU;

char vmNameInput[64] = {0};
char asmPathInput[256] = {0};



// 初始化图形界面
void InitGUI() {
    initgraph(WIDTH, HEIGHT);
    setbkcolor(WHITE);
    cleardevice();
    settextcolor(BLACK);
    settextstyle(30, 0, "宋体");
}

// 保存配置到文件
void SaveConfig() {
    std::ofstream fout(CONFIG_FILE);
    for (auto it = vmConfigs.begin(); it!= vmConfigs.end(); ++it) {
        fout << it->first << std::endl;
        fout << it->second.asmPath << std::endl;
    }
    fout.close();
}

// 加载配置文件
void LoadConfig() {
    vmConfigs.clear();
    std::ifstream fin(CONFIG_FILE);
    std::string name, path;
    while (std::getline(fin, name) && std::getline(fin, path)) {
        vmConfigs[name] = {name, path};
    }
    fin.close();
}

// 绘制主界面
void DrawMainMenu() {
    cleardevice();

    // 绘制标题
    settextcolor(BLUE);
    outtextxy(100, 50, "VMwork 虚拟机");

    // 绘制按钮
    setfillcolor(LIGHTGRAY);

    // 新建虚拟机按钮
    fillroundrect(300, 150, 300 + BTN_WIDTH, 150 + BTN_HEIGHT, 5, 5);
    outtextxy(330, 155, "新建虚拟机");

    // 打开虚拟机按钮
    fillroundrect(300, 250, 300 + BTN_WIDTH, 250 + BTN_HEIGHT, 5, 5);
    outtextxy(330, 255, "打开虚拟机");

    // 设置按钮
    fillroundrect(300, 350, 300 + BTN_WIDTH, 350 + BTN_HEIGHT, 5, 5);
    outtextxy(350, 355, "设置");
}

// 文件选择对话框封装
std::string SelectFile() {
    OPENFILENAMEA ofn;
    char szFile[260] = {0};

    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "ASM Files (*.asm)\0*.asm\0All Files (*.*)\0*.*\0";
    ofn.nFilterIndex = 1;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    if (GetOpenFileNameA(&ofn)) {
        return szFile;
    }
    return "";
}

// 输入框处理函数
bool InputBox(const char* title, char* buffer, int bufferSize) {
    char prompt[10] = "";
    // 这里直接调用 easyx 的 InputBox 函数,按照其参数要求传递
    return InputBox(buffer, bufferSize, prompt, title); 
}

// 创建虚拟机流程
void CreateVMProcess() {
    // 第一步:选择ASM文件
    std::string asmPath = SelectFile();
    if (asmPath.empty()) return;

    // 第二步:输入虚拟机名称
    if (!InputBox("输入虚拟机名称", vmNameInput, sizeof(vmNameInput))) return;

    // 保存配置
    vmConfigs[vmNameInput] = {vmNameInput, asmPath};
    SaveConfig();

}

void OpenVMProcess() {
    LoadConfig();

    // 创建选择列表
    cleardevice();
    settextcolor(BLACK);
    outtextxy(50, 50, "选择虚拟机:");

    // 绘制虚拟机列表
    int y = 100;
    for (auto it = vmConfigs.begin(); it!= vmConfigs.end(); ++it) {
        std::string text = it->first + " (" + it->second.asmPath + ")";
        outtextxy(100, y, text.c_str());
        y += 50;
    }

    // 等待用户选择
    int choice = 0;
    while (true) {
        if (MouseHit()) {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.uMsg == WM_LBUTTONDOWN) {
                int clickY = msg.y;
                int index = 0;
                for (auto it = vmConfigs.begin(); it!= vmConfigs.end(); ++it) {
                    int itemTop = 100 + index * 40;
                    if (clickY > itemTop && clickY < itemTop + 50) {
                        choice = index + 1;
                        break;
                    }
                    index++;
                }
            }
        }
        if (choice!= 0) break;
    }

    // 启动选定虚拟机
    if (choice > 0 && choice <= vmConfigs.size()) {
        auto it = vmConfigs.begin();
        std::advance(it, choice - 1);
        std::string selectedAsmPath = it->second.asmPath;
        VM(selectedAsmPath);
    }
}

void SetVMProcess() {
    LoadConfig();
    cleardevice();
    cleardevice();
    settextcolor(BLACK);
    outtextxy(30, 50, "虚拟机");
    outtextxy(50, 90, "处理器  : 1");
    outtextxy(50, 130, "内存    : 64KB");
    outtextxy(50, 170,"启动方式: 软盘");
    outtextxy(50, 210,"光盘    : 无");
    outtextxy(50, 250,"BIOS    : VMwork");
    outtextxy(50, 290,"方式    : .ASM");
    while(1) {
    	
	}

    
}

// 主消息循环
void MainLoop() {
	AppState prevState = AppState::MAIN_MENU; 
    while (true) {
        if (MouseHit()) {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.uMsg == WM_LBUTTONDOWN) {
                // 主界面按钮处理
                if (currentState == AppState::MAIN_MENU) {
                    if (msg.x > 300 && msg.x < 300 + BTN_WIDTH) {
                        if (msg.y > 150 && msg.y < 150 + BTN_HEIGHT) {
                            CreateVMProcess();
                        } else if (msg.y > 250 && msg.y < 250 + BTN_HEIGHT) {
                            OpenVMProcess();
                        } else if (msg.y > 350 && msg.y < 350 + BTN_HEIGHT) {
                            SetVMProcess(); 
                        }
                    }
                }
            }
        }

        switch (currentState) {
            case AppState::MAIN_MENU:
                if (prevState!= AppState::MAIN_MENU) {
                    //cleardevice();
                }
                DrawMainMenu();
                break;
            case AppState::CREATE_VM:
                if (prevState!= AppState::CREATE_VM) {
                    //cleardevice();
                }
                DrawMainMenu();
                break;
            case AppState::OPEN_VM:
                if (prevState!= AppState::OPEN_VM) {
                    //cleardevice();
                }
                DrawMainMenu();
                break;
            case AppState::SETTINGS:
                if (prevState!= AppState::SETTINGS) {
                    //cleardevice();
                }
                DrawMainMenu();
                break;
        }

        prevState = currentState;

        Sleep(30);
    }
}

// 寄存器声明
unsigned char al = 0, ah = 0, bl = 0, bh = 0, cl = 0, ch = 0, dl = 0, dh = 0, si = 0;
unsigned short ax = 0, bx = 0, cx = 0, dx = 0, sp = 0x8000, bp = 0;
unsigned int org = 0, end_times = 0, end_AA55 = 0;
bool ZF = false, CF = false, SF = false; // 标志寄存器

// 标签和指令指针
std::unordered_map<std::string, size_t> labels;
size_t current_line = 0;
size_t new_current_line;
std::vector<std::string> program_lines;

// 内存模拟
std::vector<unsigned char> memory(0x10000, 0); // 64KB内存


std::mutex fileMutex;
std::ifstream file;

// 线程函数,用于读取文件
void readFile(const std::string& filename) {
    std::ifstream localFile(filename, std::ios::binary);
    if (localFile.is_open()) {
        const size_t bufferSize = 4096; // 每块读取4KB,可以根据需要调整
        char buffer[bufferSize];
        std::string currentLine;
        while (localFile.read(buffer, bufferSize)) {
            for (size_t i = 0; i < localFile.gcount(); ++i) {
                if (buffer[i] == '\n') {
                    size_t commentPos = currentLine.find(';');
                    if (commentPos!= std::string::npos) {
                        currentLine = currentLine.substr(0, commentPos);
                    }
                    while (!currentLine.empty() && std::isspace(currentLine.front())) {
                        currentLine.erase(currentLine.begin());
                    }
                    while (!currentLine.empty() && std::isspace(currentLine.back())) {
                        currentLine.erase(currentLine.length() - 1);
                    }
                    if (!currentLine.empty()) {
                        std::lock_guard<std::mutex> lock(fileMutex);
                        program_lines.push_back(currentLine);
                    }
                    currentLine.clear();
                } else {
                    currentLine += buffer[i];
                }
            }
        }
        // 处理剩余的行
        size_t commentPos = currentLine.find(';');
        if (commentPos!= std::string::npos) {
            currentLine = currentLine.substr(0, commentPos);
        }
        while (!currentLine.empty() && std::isspace(currentLine.front())) {
            currentLine.erase(currentLine.begin());
        }
        while (!currentLine.empty() && std::isspace(currentLine.back())) {
            currentLine.erase(currentLine.length() - 1);
        }
        if (!currentLine.empty()) {
            std::lock_guard<std::mutex> lock(fileMutex);
            program_lines.push_back(currentLine);
        }
        localFile.close();
    } else {
        std::cerr << "无法打开文件" << std::endl;
    }
}

// 图形输出参数
int textX = 0;
int textY = 48;
const int CHAR_WIDTH = 8;
const int LINE_HEIGHT = 16;
bool graphicsInitialized = false;

// 指令解析错误枚举
enum class InstructionError {
    INVALID_OPCODE,
    INVALID_OPERAND,
    LABEL_NOT_FOUND,
    UNKNOWN_INTERRUPT,
    OTHER_ERROR
};



// 输出错误信息到终端
void printError(const InstructionError& error, const std::string& details = "") {
    std::cerr << "ERROR: ";
    switch (error) {
    case InstructionError::INVALID_OPCODE:
        std::cerr << "无效的操作码";
        break;
    case InstructionError::INVALID_OPERAND:
        std::cerr << "无效的操作数";
        break;
    case InstructionError::LABEL_NOT_FOUND:
        std::cerr << "标签未找到";
        break;
    case InstructionError::UNKNOWN_INTERRUPT:
        std::cerr << "未知的中断号";
        break;
    case InstructionError::OTHER_ERROR:
        std::cerr << "其他错误";
        break;
    }
    if (!details.empty()) {
        std::cerr << " - " << details;
    }
    std::cerr << std::endl;
}


int parseImmediate(const std::string& immediateStr) {
    std::string result;
    bool inQuote = false;
    char quoteChar = '\0';

    for (size_t i = 0; i < immediateStr.size(); ++i) {
        const char c = immediateStr[i];
        if (c == '\'' || c == '"') {
            if (!inQuote) {
                inQuote = true;
                quoteChar = c;
                result += c;
            } else if (c == quoteChar) {
                inQuote = false;
                result += c;
            } else {
                result += c;
            }
        } else if (inQuote) {
            // 直接将引号内的字符添加到结果中,包括空格
            result += c;
        } else if (!std::isspace(c)) {
            // 非空格且不在引号内,将字符添加到结果中
            result += c;
        } else if (i > 0 &&!std::isspace(result.back())) {
            // 如果前一个字符不是空格,添加当前字符以保留中间的空格
            result += c;
        }
    }

    // 去除结果字符串两端可能残留的空格
    while (!result.empty() && std::isspace(result.front())) {
        result.erase(result.begin());
    }
    while (!result.empty() && std::isspace(result.back())) {
        result.erase(result.length() - 1);
    }

    if (result.empty()) return 0;
    if (result.length() == 3 && result[0] == '\'' && result[2] == '\'') {
        return static_cast<int>(result[1]);
    }
    else if (result.find("0x") == 0) {
        try {
            return std::stoi(result.substr(2), nullptr, 16);
        } catch (const std::invalid_argument& e) {
            throw std::invalid_argument("无效的十六进制立即数:" + result);
        } catch (const std::out_of_range& e) {
            throw std::out_of_range("十六进制立即数超出范围:" + result);
        }
    }
    else if (result.back() == 'h') {
        try {
            return std::stoi(result.substr(0, result.length() - 1), nullptr, 16);
        } catch (const std::invalid_argument& e) {
            throw std::invalid_argument("无效的十六进制立即数(以h结尾):" + result);
        } catch (const std::out_of_range& e) {
            throw std::out_of_range("十六进制立即数(以h结尾)超出范围:" + result);
        }
    }
    else {
        try {
            return std::stoi(result);
        } catch (const std::invalid_argument& e) {
            throw std::invalid_argument("无效的立即数:" + result);
        } catch (const std::out_of_range& e) {
            throw std::out_of_range("立即数超出范围:" + result);
        }
    }
}


std::unordered_map<std::string, unsigned char*>& createRegister8BitMap() {
    static std::unordered_map<std::string, unsigned char*> map = {
        {"al", &al}, {"ah", &ah}, {"bl", &bl}, {"bh", &bh},
        {"cl", &cl}, {"ch", &ch}, {"dl", &dl}, {"dh", &dh},
        {"si", &si}
    };
    return map;
}

std::unordered_map<std::string, unsigned short*>& createRegister16BitMap() {
    static std::unordered_map<std::string, unsigned short*> map = {
        {"ax", &ax}, {"bx", &bx}, {"cx", &cx}, {"dx", &dx},
        {"sp", &sp}, {"bp", &bp}
    };
    return map;
}

void UpdateTextPosition() {
    textX += CHAR_WIDTH;
    if (textX > 620) {
        textX = 20;
        textY += LINE_HEIGHT;
    }
    if (textY + LINE_HEIGHT > 480) {
        cleardevice();
        textX = 0;
        textY = 0;
    }
}

void MovInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, dest, src;
    iss >> opcode >> dest >> src;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    auto parseOperand = [&](const std::string& op) -> int {
        if (reg8.count(op)) return *reg8[op];
        if (reg16.count(op)) return *reg16[op];
        return parseImmediate(op);
    };

    int value = parseOperand(src);

    if (reg8.count(dest)) {
        *reg8[dest] = static_cast<unsigned char>(value);
    }
    else if (reg16.count(dest)) {
        *reg16[dest] = static_cast<unsigned short>(value);
    }
}

// add指令处理函数
void AddInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, dest, src;
    iss >> opcode >> dest >> src;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    auto parseOperand = [&](const std::string& op) -> int {
        if (reg8.count(op)) return *reg8[op];
        if (reg16.count(op)) return *reg16[op];
        return parseImmediate(op);
    };

    int val1 = parseOperand(dest);
    int val2 = parseOperand(src);
    int result = val1 + val2;

    if (reg8.count(dest)) {
        *reg8[dest] = static_cast<unsigned char>(result);
    }
    else if (reg16.count(dest)) {
        *reg16[dest] = static_cast<unsigned short>(result);
    }

    ZF = (result == 0);
    SF = (result < 0);
    CF = (static_cast<unsigned>(result) < static_cast<unsigned>(val1));
}

// sub指令处理函数
void SubInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, dest, src;
    iss >> opcode >> dest >> src;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    auto parseOperand = [&](const std::string& op) -> int {
        if (reg8.count(op)) return *reg8[op];
        if (reg16.count(op)) return *reg16[op];
        return parseImmediate(op);
    };

    int val1 = parseOperand(dest);
    int val2 = parseOperand(src);
    int result = val1 - val2;

    if (reg8.count(dest)) {
        *reg8[dest] = static_cast<unsigned char>(result);
    }
    else if (reg16.count(dest)) {
        *reg16[dest] = static_cast<unsigned short>(result);
    }

    ZF = (result == 0);
    SF = (result < 0);
    CF = (static_cast<unsigned>(val1) < static_cast<unsigned>(val2));
}

// inc指令处理函数
void IncInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, operand;
    iss >> opcode >> operand;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    if (reg8.count(operand)) {
        *reg8[operand] += 1;
        ZF = (*reg8[operand] == 0);
        SF = (*reg8[operand] < 0);
    }
    else if (reg16.count(operand)) {
        *reg16[operand] += 1;
        ZF = (*reg16[operand] == 0);
        SF = (*reg16[operand] < 0);
    }
}

void CmpInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, op1, op2;
    iss >> opcode >> op1 >> op2;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    auto parseOperand = [&](const std::string& op) -> int {
        if (reg8.count(op)) return *reg8[op];
        if (reg16.count(op)) return *reg16[op];
        return parseImmediate(op);
    };

    int val1 = parseOperand(op1);
    int val2 = parseOperand(op2);
    int result = val1 - val2;

    ZF = (result == 0);
    SF = (result < 0);
    CF = (static_cast<unsigned>(val1) < static_cast<unsigned>(val2));
}

void JmpInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, label;
    iss >> opcode >> label;
    if (labels.count(label)) {
        new_current_line = labels[label];
    } else {
        printError(InstructionError::LABEL_NOT_FOUND, "JMP指令中的标签: " + label);
    }
}

void JeInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, label;
    iss >> opcode >> label;
    if (ZF) {
        if (labels.count(label)) {
            new_current_line = labels[label];
        } else {
            printError(InstructionError::LABEL_NOT_FOUND, "JE指令中的标签: " + label);
        }
    } else {
        new_current_line = current_line + 1;
    }
}

void JneInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, label;
    iss >> opcode >> label;
    if (!ZF) {
        if (labels.count(label)) {
            new_current_line = labels[label];
        } else {
            printError(InstructionError::LABEL_NOT_FOUND, "JNE指令中的标签: " + label);
        }
    } else {
        new_current_line = current_line + 1;
    }
}

void PushInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, src;
    iss >> opcode >> src;

    auto& reg16 = createRegister16BitMap();
    unsigned short value = reg16.count(src)? *reg16[src] : parseImmediate(src);

    sp -= 2;
    memory[sp] = value & 0xFF;
    memory[sp + 1] = (value >> 8) & 0xFF;
}

void PopInstruction(const std::string& line) {
    std::istringstream iss(line);
    std::string opcode, dest;
    iss >> opcode >> dest;

    auto& reg16 = createRegister16BitMap();
    if (reg16.count(dest)) {
        *reg16[dest] = memory[sp] | (memory[sp + 1] << 8);
        sp += 2;
    }
}

void XorInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, dest, src;
    iss >> opcode >> dest >> src;

    auto& reg8 = createRegister8BitMap();
    auto& reg16 = createRegister16BitMap();

    auto parseOperand = [&](const std::string& op) -> int {
        if (reg8.count(op)) return *reg8[op];
        if (reg16.count(op)) return *reg16[op];
        return parseImmediate(op);
    };

    int val1 = parseOperand(dest);
    int val2 = parseOperand(src);
    int result = val1 ^ val2;

    if (reg8.count(dest)) {
        *reg8[dest] = static_cast<unsigned char>(result);
    }
    else if (reg16.count(dest)) {
        *reg16[dest] = static_cast<unsigned short>(result);
    }

    ZF = (result == 0);
    SF = (result < 0);
    CF = false;
}

void PreprocessLabels() {
    for (size_t i = 0; i < program_lines.size(); ++i) {
        std::string line = program_lines[i];
        std::istringstream iss(line);
        std::string address;
        if (iss >> address) {
            // 去除地址中的冒号
            address.erase(std::remove(address.begin(), address.end(), ':'), address.end());
            labels[address] = i;
        }

        size_t colonPos = line.find(':');
        if (colonPos!= std::string::npos) {
            std::string label = line.substr(0, colonPos);
            labels[label] = i;
            program_lines[i] = line.substr(colonPos + 1);
            std::cout << "Label found: " << label << " at line " << i << std::endl;
        }
    }
}

void IntInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, interrupt;
    iss >> opcode >> interrupt;

    if (interrupt == "0x10" || interrupt == "10h") {

        if (ah == 0x0E) {
            if (!graphicsInitialized) {
                initgraph(640, 480);
                HWND hwnd = GetHWnd();
				SetWindowPos(hwnd, HWND_TOP, 100, 100, 0, 0, SWP_NOSIZE);
                setbkcolor(BLACK);
                cleardevice();
                settextcolor(CYAN);
                settextstyle(16, 0, _T("Courier New Bold"));
                graphicsInitialized = true;
                outtextxy(textX, 0, "  VMwork BIOS (PCI)");
                outtextxy(textX, 16, "  This VGA/VBE BIOS is released under the GNU LGPL");
                settextcolor(RGB(192, 192, 192));
            }

            // 处理特殊字符
            if (al == 0x0D) {
                outtextxy(textX, textY, " ");
                textY += LINE_HEIGHT;
            }
            else if (al == 0x0A) {
                outtextxy(textX, textY, " ");
                textX = 0;
            }
            else {
                char str[2] = { static_cast<char>(al) };

                outtextxy(textX, textY, " ");
                outtextxy(textX, textY, str);
                UpdateTextPosition();
                outtextxy(textX, textY, "|");
            }
        }
        
        if (ah == 0x02 && bh == 0) {
            textX = 0;
            textY = 0;
        }
        if (ax == 0x0600 && bx == 0x0700 && cx == 0 && dx == 0x184f) {
        	
            setfillcolor(BLACK);
			bar(0, 0, 640, 480);
        	
        }
    }
    else if (interrupt == "0x16" || interrupt == "16h") {
        if (ah == 0) {
            while (true) {
                if (_kbhit()) {
                    al = _getch();
                    break;
                }

            }
        }
    }
    else {
        printError(InstructionError::UNKNOWN_INTERRUPT, "未知的中断号: " + interrupt);
    }
}

void CallInstruction(const std::string& line) {
    std::vector<std::string> tokens;
    std::istringstream iss(line);
    std::string token;
    while (iss >> token) {
        tokens.push_back(token);
    }
    if (tokens.size() < 2) {
        printError(InstructionError::INVALID_OPERAND, "CALL指令缺少操作数");
        return;
    }
    std::string label = tokens.back();

    if (labels.count(label)) {
        // 压入返回地址(当前行号的下一条指令)
        unsigned short return_line = current_line + 1;
        sp -= 2;
        memory[sp] = return_line & 0xFF;
        memory[sp + 1] = (return_line >> 8) & 0xFF;
        new_current_line = labels[label];
    } else {
        printError(InstructionError::LABEL_NOT_FOUND, "CALL指令中的标签: " + label);
    }
}

void OrgInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, interrupt;
    iss >> opcode >> interrupt;

    if (interrupt == "0x7c00" || interrupt == "0x7C00") {
        org = 0x7c00;
    } else {
        printError(InstructionError::INVALID_OPERAND, "ORG指令的操作数无效: " + interrupt);
    }
}

void TimesInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, interrupt;
    iss >> opcode >> interrupt;

    if (interrupt == "510-($-$$) db 0" || interrupt == "510-($-$$)") {
        end_times = 1;
    } else {
        printError(InstructionError::INVALID_OPERAND, "TIMES指令的操作数无效: " + interrupt);
    }
}

void DwInstruction(const std::string& line) {
    std::string processedLine = line;
    std::replace(processedLine.begin(), processedLine.end(), ',', ' ');
    std::istringstream iss(processedLine);
    std::string opcode, interrupt;
    iss >> opcode >> interrupt;

    if (interrupt == "0xAA55" || interrupt == "0xaa55") {
        end_AA55 = 1;
    } else {
        printError(InstructionError::INVALID_OPERAND, "DW指令的操作数无效: " + interrupt);
    }
}

void VM(const std::string& asmPath) {
    std::ifstream file(asmPath);
    if (!file.is_open()) {
        std::cerr << "无法打开文件: " << asmPath << std::endl;
        return;
    }
    std::string line;
    while (std::getline(file, line)) {
        size_t commentPos = line.find(';');
        if (commentPos!= std::string::npos) {
            line = line.substr(0, commentPos);
        }
        // 去除行首尾的空白字符
        while (!line.empty() && std::isspace(line.front())) {
            line.erase(line.begin());
        }
        while (!line.empty() && std::isspace(line.back())) {
            line.erase(line.length() - 1);
        }
        if (!line.empty()) {
            program_lines.push_back(line);
        }
    }
    file.close();

    for (auto& progLine : program_lines) {
        for (size_t i = 0; i < progLine.size(); ++i) {
            if (i < progLine.size() - 2 && progLine[i] == '\'' && progLine[i + 1] ==' ' && progLine[i + 2] == '\'') {
                progLine[i] = static_cast<char>(0x20);
                progLine.erase(i + 1, 2);  // 移除后面的空格和单引号
            }
            if (i < progLine.size() - 2 && progLine[i] == '\'' && progLine[i + 1] ==':' && progLine[i + 2] == '\'') {
                progLine[i] = '3';
                progLine[i + 1] = 'A';
                progLine[i + 2] = 'h';
            }
            if (i < progLine.size() - 2 && progLine[i] == '\'' && progLine[i + 1] ==',' && progLine[i + 2] == '\'') {
                progLine[i] = '2';
                progLine[i + 1] = 'C';
                progLine[i + 2] = 'h';
            }
            if (i < progLine.size() - 2 && progLine[i] == '\'' && progLine[i + 1] =='_' && progLine[i + 2] == '\'') {
                progLine[i] = '5';
                progLine[i + 1] = 'F';
                progLine[i + 2] = 'h';
            }
        }
    }

    PreprocessLabels();

    // 重置指令指针和新的指令指针
    new_current_line = current_line;
    while (current_line < program_lines.size()) {
        std::istringstream iss(program_lines[current_line]);
        std::string opcode;
        iss >> opcode;
        if (opcode == "mov") MovInstruction(program_lines[current_line]);
        else if (opcode == "int") IntInstruction(program_lines[current_line]);
        else if (opcode == "org") OrgInstruction(program_lines[current_line]);
        else if (opcode == "times") TimesInstruction(program_lines[current_line]);
        else if (opcode == "dw") DwInstruction(program_lines[current_line]);
        else if (opcode == "cmp") CmpInstruction(program_lines[current_line]);
        else if (opcode == "jmp") {
            std::string label;
            iss >> label;
            // 处理相对跳转地址表示法,假设这里的相对跳转是相对于当前行号(根据实际情况调整)
            if (label.find("0x") == 0) {
                try {
                    size_t targetAddress = std::stoi(label.substr(2), nullptr, 16);
                    // 如果找到地址标签,更新当前行号
                    if (labels.count(label)) {
                        new_current_line = labels[label];
                    } else {
                        // 处理相对地址
                        size_t relativeAddress = targetAddress - (current_line - labels.begin()->second);
                        new_current_line = current_line + relativeAddress;
                    }
                } catch (const std::invalid_argument& e) {
                    printError(InstructionError::LABEL_NOT_FOUND, "JMP指令中的非法地址标签: " + label);
                } catch (const std::out_of_range& e) {
                    printError(InstructionError::LABEL_NOT_FOUND, "JMP指令中的地址标签超出范围: " + label);
                }
            } else {
                JmpInstruction(program_lines[current_line]);
            }
        }
        else if (opcode == "je" || opcode == "jz") JeInstruction(program_lines[current_line]);
        else if (opcode == "jne" || opcode == "jnz") JneInstruction(program_lines[current_line]);
        else if (opcode == "push") PushInstruction(program_lines[current_line]);
        else if (opcode == "pop") PopInstruction(program_lines[current_line]);
        else if (opcode == "xor") XorInstruction(program_lines[current_line]);
        else if (opcode == "call") CallInstruction(program_lines[current_line]);
        else if (opcode == "add") AddInstruction(program_lines[current_line]);
        else if (opcode == "sub") SubInstruction(program_lines[current_line]);
        else if (opcode == "inc") IncInstruction(program_lines[current_line]);

        if (opcode == "jmp" || opcode == "je" || opcode == "jne") {
            current_line = new_current_line;
        }
        else {
            current_line++;
        }

        new_current_line = current_line + 1; 
    }
    if (graphicsInitialized) {
        _getch();
        //closegraph();
    }
}


int main() {
    InitGUI();
    LoadConfig();
    MainLoop();
    closegraph();
    system("pause");
    return 0;
}

要反汇编软盘操作系统,就要用到ndisasm

这个工具在下载nasm时附带了

kernel.asm操作系统内核

org 0x7c00
 
start:
	
	mov bp, 0x8000
	mov sp, bp
 
 
.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, 'e'
	je .check_input_e
	cmp al, 'p'
	je .check_input_6.py
	cmp al, '.'
	je .check_input_py
	cmp al, 'l'
	je .check_input_l
 
	cmp al, 0x0D
	je .bad_input
	mov ah, 0x0E
	int 0x10
	jmp .wait_input
 
.check_input_l:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 's'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'Y'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, '2'
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'Y'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, '4'
	int 0x10
	mov al, '4'
	int 0x10
	mov al, '0'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
 
	jmp .print
 
.check_input_py:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '\'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input
 
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '6'
	int 0x10
	mov al, '6'
	int 0x10
	mov al, '6'
	int 0x10
 
	jmp .print
 
.check_input_e:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	MOV AL,0x13
	MOV AH,0x00
	INT 0x10
	jmp .done
 
.check_input_c1:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .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
 
.check_input_6.py:
	mov ah, 0x0E
	int 0x10
 
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '.'
	jne .wait_input
 
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input
 
	
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'y'
	jne .wait_input
 
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
 
	mov al, 'p'
	int 0x10
 
	mov al, 'r'
	int 0x10
 
	mov al, 'i'
	int 0x10
 
	mov al, 'n'
	int 0x10
 
	mov al, 't'
	int 0x10
 
	mov al, '('
	int 0x10
 
	mov al, '"'
	int 0x10
 
	mov al, '6'
	int 0x10
 
	mov al, '6'
	int 0x10
 
	mov al, '6'
	int 0x10
 
	mov al, '"'
	int 0x10
 
	mov al, ')'
	int 0x10
 
	jmp .print
 
 
 
 
 
times 510-($-$$) db 0
dw 0xAA55

toasm.py用于转换标准nasm

import re
import sys
import chardet

def process_files(input_file_path, output_file_path):
    # 探测原始文件的编码
    with open(input_file_path, 'rb') as f:
        result = chardet.detect(f.read())
        encoding = result['encoding']
    pattern = re.compile(r'^([0-9A-Fa-f]{8})\s+([0-9A-Fa-f ]+)\s+(.*)$')
    with open(input_file_path, 'r', encoding=encoding) as input_file, open(output_file_path, 'w',
                                                                       encoding='utf - 8') as output_file:
        for line in input_file:
            line = line.rstrip()
            if match := pattern.match(line):
                addr_str, _, instr = match.groups()
                addr = int(addr_str, 16)
                output_file.write(f"0x{addr:x}:\n")
                output_file.write(f"{instr}\n")
            else:
                output_file.write(line + "\n")


if __name__ == "__main__":
    if len(sys.argv)!= 3:
        print("Usage: python script_name.py input_file output_file")
        sys.exit(1)
    input_file_path = sys.argv[1]
    output_file_path = sys.argv[2]
    process_files(input_file_path, output_file_path)

接下来

nasm kernel.asm -o os.img

os.img是完整的操作系统,可以VMware运行

反汇编

.\ndisasm 123.img > os.img.asm
python toasm.py os.img.asm os.asm

可能需要

pip intall chardet

 编译

g++ main.cpp -o VMwork -std=c++11 -leasyx -lcomdlg32

 双击VMwork.exe

新建虚拟机选择os.asm

打开虚拟机

 运行成功

接下来移植我们以前自制的操作系统HanOS

 


; TAB=4

[INSTRSET "i486p"]
    mov ah, 0x00
    mov al, 0x03 ; 80x25 文本模式
    int 0x10

    ; 设置矩形的起始坐标和大小
    mov dh, 0 ; 矩形上边的 y 坐标
    mov dl, 0 ; 矩形左边的 x 坐标
    mov bh, 0  ; 页面号
    mov cx, 0  ; 矩形的宽度和高度
    mov cl, 10  ; 宽度
    mov ch, 10  ; 高度

    ; 绘制矩形
draw_rect:
    ; 设置光标位置
    mov ah, 0x02
    int 0x10

    ; 设置矩形颜色
    mov ah, 0x09
    mov al, ' ' ; 空格字符
    mov bl, 0x04 ; 使用预设的蓝色
    int 0x10
    add dl, 1
    loop draw_rect
	mov ah, 02h
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 10h
	jmp .start

.wait_input3:
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	je .error
	mov ah, 0x0E
	int 0x10
	jmp .wait_input3

.wait_input4:
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	je .error
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jmp .wait_input4

.error:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	jmp .check_input_pass
.start:
	mov si, 0
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '"'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '('
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ')'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ','
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

.check_input_pass:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '('
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'w'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, ':'
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'l'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'h'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'o'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'g'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'h'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'a'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input3
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input3
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'W'
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ':'
	int 0x10
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input4

_start:
    ; 初始化文本模式视频
    mov ah, 0x00
    mov al, 0x03 ; 80x25 文本模式
    int 0x10

    ; 设置矩形的起始坐标和大小
    mov dh, 0 ; 矩形上边的 y 坐标
    mov dl, 0 ; 矩形左边的 x 坐标
    mov bh, 0  ; 页面号
    mov cx, 0  ; 矩形的宽度和高度
    mov cl, 10  ; 宽度
    mov ch, 10  ; 高度

    ; 绘制矩形
    draw_rect1:
        ; 设置光标位置
        mov ah, 0x02
        int 0x10

        ; 设置矩形颜色
        mov ah, 0x09
        mov al, ' ' ; 空格字符
        mov bl, 0x1E ; 使用预设的蓝色
        int 0x10
        add dl, 1
        loop draw_rect1


    mov ah, 0x0E
	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, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'S'
	int 0x10
    mov dh, 23 ; 矩形上边的 y 坐标
    mov dl, 43 ; 矩形左边的 x 坐标
    mov bh, 0  ; 页面号
    mov cx, 0  ; 矩形的宽度和高度
    mov cl, 1  ; 宽度
    mov ch, 1  ; 高度

    ; 绘制矩形
    draw_rect2:
        ; 设置光标位置
        mov ah, 0x02
        int 0x10

        ; 设置矩形颜色
        mov ah, 0x09
        mov al, ' ' ; 空格字符
        mov bl, 0xF0 ; 使用预设的蓝色
        int 0x10

        ; 更新坐标并绘制下一个字符
        add dl, 1
        loop draw_rect2

start:
	mov ah, 02h
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 10h
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '"'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '('
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ')'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ','
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	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
	
    inc cx
    cmp cx, 5
    je _start

	cmp si, 1
	je .c
	cmp si, 2
	je .d
	cmp si, 6
	je .cSystem

	mov al, '>'
	int 0x10

	mov al, '>'
	int 0x10

.wait_input:
	mov ah, 0x00
	int 0x16
	cmp al, 'c'
	je .check_input_c1
	cmp al, 'e'
	je .check_input_e
	cmp al, 'p'
	je .check_input_print.py
	cmp al, '.'
	je .check_input_.
	cmp al, 'l'
	je .check_input_l
	cmp al, 'W'
	je .check_input_WiFi
	cmp al, 'O'
	je .OS
	cmp al, 'w'
	je .writer
	cmp al, 'R'
	je .README
	cmp al, 'h'
	je .help
	cmp al, 0x0D
	je .bad_input
	mov ah, 0x0E
	int 0x10
	jmp .wait_input

.wait_input2:
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	je .bad_input
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jmp .wait_input2


.c:
	mov al, 'C'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '>'
	int 0x10
	mov al, '>'
	int 0x10
	jmp .wait_input

.cSystem:
	mov al, 'C'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, '>'
	int 0x10
	mov al, '>'
	int 0x10
	jmp .wait_input

.d:
	mov al, 'D'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '>'
	int 0x10
	mov al, '>'
	int 0x10
	jmp .wait_input

.check_input_.:
	mov ah, 0x0E
	int 0x10
	cmp si, 6
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '\'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'O'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'S'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '"'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '('
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ')'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ','
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	jmp .print

.check_input_l:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 's'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	cmp si, 0
	je .check_input_l0
	cmp si, 1
	je .check_input_l1
	cmp si, 6
	je .check_input_l6
	cmp si, 2
	je .check_input_l2

.check_input_l0:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, ':'
	int 0x10
	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, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'C'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ':'
	int 0x10
	jmp .print

.check_input_l1:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, ':'
	int 0x10
	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, 'C'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
	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
	mov al, 'S'
	int 0x10
	mov al, 'Y'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, '4'
	int 0x10
	mov al, '4'
	int 0x10
	mov al, '0'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
	jmp .print

.check_input_l6:
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, ':'
	int 0x10
	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, 'C'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'R'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
	jmp .print

.check_input_l2:

	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, ':'
	int 0x10
	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, 'D'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'L'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'M'
	int 0x10
	mov al, 'E'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, 'D'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'S'
	int 0x10
	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
	mov al, 'B'
	int 0x10
	mov al, 'I'
	int 0x10
	mov al, 'N'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '2'
	int 0x10
	mov al, 'K'
	int 0x10
	mov al, 'B'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'P'
	int 0x10
	mov al, 'Y'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '1'
	int 0x10
	mov al, '2'
	int 0x10
	mov al, 'B'
	int 0x10
	jmp .print

.check_input_py:
	cmp si, 2
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'h'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'o'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, ' '
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'r'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '.'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'y'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '6'
	int 0x10
	mov al, '6'
	int 0x10
	mov al, '6'
	int 0x10

	jmp .print

.check_input_e:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'x'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	MOV AL,0x13
	MOV AH,0x00
	INT 0x10
	jmp .done

.check_input_cd0:
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, ' '
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'H'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'a'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'O'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'S'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '/'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'C'
	je .check_input_cd1
	cmp al, 'D'
	je .check_input_cd2
	cmp al, 0x0D
	jne .wait_input
	mov si, 0
	jmp .print

.check_input_cd1:
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, ':'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '/'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'S'
	je .cd11
	cmp al, 0x0D
	jne .wait_input
	mov si, 1
	jmp .print

.cd11:
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'y'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 's'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'e'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'm'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '/'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 0x0D
	jne .wait_input
	mov si, 6
	jmp .print


.check_input_cd2:
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, ':'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '/'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 0x0D
	jne .wait_input
	mov si, 2
	jmp .print

.check_input_c1:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'd'
	je .check_input_cd0
	cmp al, 'l'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 's'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	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 _start

.help:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'e'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'l'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'x'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'w'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'W'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	jmp .print

.README:
	mov ah, 0x0E
	int 0x10
	cmp si, 6
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'E'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'A'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'D'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'M'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'E'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '.'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'm'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'd'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '#'
	int 0x10
	mov al, ' '
	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, 'I'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, 'u'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'g'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'b'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'g'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, ','
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'C'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'u'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'k'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'f'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'g'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'w'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'b'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 'f'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'T'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'H'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'O'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'a'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'g'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'S'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, ':'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 's'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'c'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'x'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'w'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'W'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, 'F'
	int 0x10
	mov al, 'i'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, 'l'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 'p'
	int 0x10
	mov al, 'y'
	int 0x10
	mov al, 't'
	int 0x10
	mov al, 'h'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, '`'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, 'A'
	int 0x10
	mov al, 'n'
	int 0x10
	mov al, 'd'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 'm'
	int 0x10
	mov al, 'o'
	int 0x10
	mov al, 'r'
	int 0x10
	mov al, 'e'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, '.'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	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

.check_input_WiFi:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'F'
	jne .wait_input
	
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'N'
	int 0x10

	mov al, 'A'
	int 0x10

	mov al, 'M'
	int 0x10

	mov al, 'E'
	int 0x10

	mov al, ':'
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '1'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '2'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '3'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '4'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '5'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'P'
	int 0x10

	mov al, 'A'
	int 0x10

	mov al, 'S'
	int 0x10

	mov al, 'S'
	int 0x10
	mov al, 'W'
	int 0x10

	mov al, 'O'
	int 0x10

	mov al, 'R'
	int 0x10

	mov al, 'D'
	int 0x10
	mov al, ':'
	int 0x10
	mov ah, 0x00
	int 0x16
	cmp al, '1'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '2'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '3'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '4'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '5'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '6'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '7'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '8'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '9'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, '0'
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	mov ah, 0x0E
	mov al, '*'
	int 0x10
	jne .wait_input2
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'W'
	int 0x10

	mov al, 'i'
	int 0x10

	mov al, 'F'
	int 0x10

	mov al, 'i'
	int 0x10

	mov al, ' '
	int 0x10

	mov al, 'i'
	int 0x10

	mov al, 's'
	int 0x10

	mov al, ' '
	int 0x10

	mov al, 'r'
	int 0x10

	mov al, 'e'
	int 0x10

	mov al, 'a'
	int 0x10

	mov al, 'd'
	int 0x10

	mov al, 'y'
	int 0x10

	jmp .print

.check_input_print.py:
	mov ah, 0x0E
	int 0x10
	cmp si, 2
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'y'
	je .check_input_py
	cmp al, 'r'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input

	
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'n'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '.'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'p'
	jne .wait_input

	
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'y'
	jne .wait_input

	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'p'
	int 0x10

	mov al, 'r'
	int 0x10

	mov al, 'i'
	int 0x10

	mov al, 'n'
	int 0x10

	mov al, 't'
	int 0x10

	mov al, '('
	int 0x10

	mov al, '"'
	int 0x10

	mov al, '6'
	int 0x10

	mov al, '6'
	int 0x10

	mov al, '6'
	int 0x10

	mov al, '"'
	int 0x10

	mov al, ')'
	int 0x10

	jmp .print

.OS:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'S'
	jne .wait_input


	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'O'
	int 0x10

	mov al, 'S'
	int 0x10

	mov al, ':'
	int 0x10

	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

	mov al, ' '
	int 0x10

	mov al, '('
	int 0x10

	mov al, '1'
	int 0x10

	mov al, ')'
	int 0x10

	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	mov al, 'C'
	int 0x10

	mov al, 'h'
	int 0x10

	mov al, 'o'
	int 0x10

	mov al, 'o'
	int 0x10

	mov al, 's'
	int 0x10

	mov al, 'e'
	int 0x10

	mov al, ':'
	int 0x10

	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, '1'
	jne .print
	jmp .asmhead_code

.writer:
	mov ah, 0x0E
	int 0x10
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'r'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'i'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 't'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'e'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	mov ah, 0x0E
	int 0x10
	cmp al, 'r'
	jne .wait_input
	mov ah, 0x00
	int 0x16
	cmp al, 0x0D
	jne .wait_input
	mov ah, 0x0E
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '+'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '-'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '_'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '\'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '_'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '|'
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, ' '
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, '/'
	int 0x10
	mov al, '|'
	int 0x10
	mov al, 0x0D
	int 0x10
	mov al, 0x0A
	int 0x10

	jmp .print

	

.asmhead_code:

运行成功! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工作流引擎Camunda

一&#xff0c;什么是Camunda&#xff1f; Camunda是一个开源的工作流引擎和业务流程管理平台&#xff0c;基于Java和Spring框架构建。它支持BPMN 2.0标准&#xff0c;允许用户通过图形界面或编程方式定义复杂的工作流和业务流程。Camunda可以嵌入到任何Java应用程序中&#x…

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…

【已解决】黑马点评项目Redis版本替换过程的数据迁移

黑马点评项目Redis版本替换过程的数据迁移 【哭哭哭】附近商户中需要用到的GEO功能只在Redis 6.2以上版本生效 如果用的是老版本&#xff0c;美食/KTV的主页能正常返回&#xff0c;但无法显示内容 上次好不容易升到了5.0以上版本&#xff0c;现在又用不了了 Redis 6.2的windo…

文献阅读 250201-The carbon budget of China: 1980–2021

The carbon budget of China: 1980–2021 来自 <https://www.sciencedirect.com/science/article/pii/S2095927323007703> 中国碳预算&#xff1a;1980–2021 年 ## Abstract: Using state-of-the-art datasets and models, this study comprehensively estimated the an…

《OpenCV》——图像透视转换

图像透视转换简介 在 OpenCV 里&#xff0c;图像透视转换属于重要的几何变换&#xff0c;也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点&#xff1a;要在源图像和目标图像上分别找出至少四个对应的点。这些对…

条件变量 实现2生产者2消费者模型

1个生产者在生产的时候&#xff0c;另个生产者不能生产(生产者之间互斥) 条件变量用于线程同步&#xff0c;线程挂起/被唤醒。 条件变量和互斥锁共同保证生产者之间互斥生产者和消费者的同步。 思路&#xff1a; 1 定义、初始化共享资源 a 缓冲区&#xff1a;存储物品…

一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI

一、GenBI AI 代理介绍&#xff08;文末提供下载&#xff09; github地址&#xff1a;https://github.com/Canner/WrenAI 本文信息图片均来源于github作者主页 在 Wren AI&#xff0c;我们的使命是通过生成式商业智能 &#xff08;GenBI&#xff09; 使组织能够无缝访问数据&…

使用C#开发一款通用数据库管理工具

由于经常使用各种数据库&#xff0c;笔者自己动手丰衣足食&#xff0c;使用C#开发了一款通用数据库管理工具&#xff0c;支持Mysql、Oracle、Sqlite、SQL Server等数据库的表、视图、存储过程、函数管理功能&#xff0c;并支持导入导出、数据字典生成、拖拽式跨机器跨库数据一键…

sqli-labs靶场通关

sqli-las通关 mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有…

DNS缓存详解(DNS Cache Detailed Explanation)

DNS缓存详解 清空DNS缓存可以让网页访问更快捷。本文将从什么是DNS缓存、为什么清空DNS缓存、如何清空DNS缓存、清空DNS缓存存在的问题四个方面详细阐述DNS缓存清空的相关知识。 一、什么是DNS缓存 1、DNS缓存的定义&#xff1a; DNS缓存是域名系统服务在遇到DNS查询时自动…

【VM】VirtualBox安装CentOS8虚拟机

阅读本文前&#xff0c;请先根据 VirtualBox软件安装教程 安装VirtualBox虚拟机软件。 1. 下载centos8系统iso镜像 可以去两个地方下载&#xff0c;推荐跟随本文的操作用阿里云的镜像 centos官网&#xff1a;https://www.centos.org/download/阿里云镜像&#xff1a;http://…

2024第十五届蓝桥杯网安赛道省赛题目--rc4

rc4 一、查壳 无壳&#xff0c;32位 二、IDA分析 1.main 2.sub_401005 根据题目以及该函数的内容都可以让我们确定这是个rc4加密题。 所以

区块链项目孵化与包装设计:从概念到市场的全流程指南

区块链技术的快速发展催生了大量创新项目&#xff0c;但如何将一个区块链项目从概念孵化成市场认可的产品&#xff0c;是许多团队面临的挑战。本文将从孵化策略、包装设计和市场落地三个维度&#xff0c;为你解析区块链项目成功的关键步骤。 一、区块链项目孵化的核心要素 明确…

【机器学习】自定义数据集 使用scikit-learn中svm的包实现svm分类

一、支持向量机(support vector machines. &#xff0c;SVM)概念 1. SVM 绪论 支持向量机&#xff08;SVM&#xff09;的核心思想是找到一个最优的超平面&#xff0c;将不同类别的数据点分开。SVM 的关键特点包括&#xff1a; ① 分类与回归&#xff1a; SVM 可以用于分类&a…

电信传输基本理论/5G网络层次架构——超三万字详解:适用期末考试/考研/工作

电信传输的基本概念 信息、通信、电信、电信传输的定义 信息 信息指的是消息中的有效信息量 通信 通信指的是利用传输媒质将信息从一段传输到另一端 电信 电信的意思是利用电子技术来将信息从一段传输到另一端 电信传输 电信传输的概念就是将含有信息的电信号进行传输…

代码练习3

1 #include <stdio.h>void draw(int n) {for (int i n; i > 1; i--) {// 打印空格for (int j 0; j < n - i; j) {printf(" ");}// 打印星号for (int j 0; j < 2 * i - 1; j) {printf("*");}// 换行printf("\n");} }int main()…

好用的翻译工具

最近看到个好用的翻译工具&#xff0c;叫沉浸式翻译 沉浸式翻译 - 双语对照网页翻译插件 | PDF翻译 | 视频字幕翻译 我下载的是谷歌插件 点击下载插件会跳转到使用文档&#xff0c;跟着一步步操作即可 翻译的效果&#xff0c;我这里用的是免费版的&#xff0c;如果需要加强&…

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…

el-table组件样式如何二次修改?

文章目录 前言一、去除全选框按钮样式二、表头颜色的修改 前言 ElementUI中的组件el-table表格组件提供了丰富的样式&#xff0c;有一个全选框的el-table组件&#xff0c;提供了全选框和多选。 一、去除全选框按钮样式 原本默认是有全选框的。假如有一些开发者&#xff0c;因…

一起学SysML v2规范(01)

1 00:00:01,560 --> 00:00:05,840 今天我们开始一个新的系列 2 00:00:06,690 --> 00:00:08,190 一起学SysML v2 3 00:00:08,200 --> 00:00:09,570 规范 4 00:00:15,770 --> 00:00:17,040 这里说一起学 5 00:00:17,050 --> 00:00:18,920 就是说我和大家一起学…