16位汇编引导扇区打印字符串时出现内存越界访问问题
引导扇区代码乱码问题排查
核心错误原因
- 校验逻辑时序错误:当前代码逻辑是先打印字符、再偏移指针、最后做终止判断,哪怕指针指向了终止符,也会先执行打印逻辑,再偏移到终止符后面的内存位置才做校验,直接跳过了对字符串末尾0终止符的有效校验。
- 终止符匹配宽度错误:你用16位寄存器
cx读取内存做0值判断,但你的字符串终止符是单字节的0,只有当终止符位置+后1个字节同时为0时才会触发退出,只要后续任意字节非0,程序就会继续读取打印内存中的指令、填充值等无关内容,也就是你看到的乱码来源。 - 缺少BIOS中断必要参数:
int 0x10的0x0eteletype输出功能需要明确设置bh(显示页号,通常设为0)、bl(字符显示属性,文本模式下通常设为0x07对应黑底白字),参数缺失可能引发额外的输出异常。
修正后可正常运行的代码
bits 16 org 0x7c00 boot: mov bx, string call print_string hlt string: db 'Booting OS', 0 print_string: pusha mov ah, 0x0e mov bh, 0 ; 设置显示页号为0 mov bl, 0x07 ; 设置字符属性为黑底白字 printloop: mov al, [bx] cmp al, 0 ; 先判断当前字符是否为终止符 je print_fin ; 是终止符直接退出 int 0x10 ; 非终止符再执行打印 inc bx ; 指针后移 jmp printloop print_fin: popa ret ; Mark the device as bootable times 510-($-$$) db 0 dw 0xAA55
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

