编辑代码

org 0x7c00  ; 引导扇区加载到0x7c00地址

section .data
    ; 显存属性设置(黑底白字)
        attr db 0x07

        section .text
            ; 初始化段寄存器
                mov ax, cs
                    mov ds, ax
                        mov ax, 0xb800  ; 显存段地址0xB8000(ES:0)
                            mov es, ax

                                ; 读取键盘输入
                                read_char:
                                    mov ah, 0  ; BIOS INT 16H功能0:等待键盘输入
                                        int 16h     ; 读取字符到AL(ASCII码)
                                            
                                                ; 检查是否为数字字符
                                                    cmp al, '0'
                                                        jb not_digit
                                                            cmp al, '9'
                                                                ja not_digit

                                                                    ; 转换为数值(可选,此处直接显示字符)
                                                                        ; sub al, '0'  ; 若需数值运算可取消注释

                                                                            ; 显示字符到屏幕中央
                                                                                mov di, 12*160 + 32*2  ; 12行*80列=960字节,中央位置偏移512字节
                                                                                    mov [es:di], al          ; 低字节存字符,高字节默认0
                                                                                        mov byte [es:di+1], attr ; 设置显示属性

                                                                                            jmp $

                                                                                            not_digit:
                                                                                                ; 显示错误提示(非数字字符)
                                                                                                    mov di, 0
                                                                                                        mov cx, 10
                                                                                                        print_zero:
                                                                                                            mov byte [es:di], '0' - 1
                                                                                                                add di, 2
                                                                                                                    loop print_zero

                                                                                                                    times 510-($-$$) db 0     ; 填充剩余扇区
                                                                                                                    dw 0xaa55                ; 引导扇区签名