交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
11 完善屏幕打印
分享
未结
0
2819
李延
LV6
2022-06-30
悬赏:20积分
# 1 目标 前面我们写了一个简单的向屏幕打印的方法,但还缺少以下功能,我们需要完善: - 对于换行符号的支持 - 因为屏幕最多显示2000个字符,如果屏幕满了,需要支持自动向下滚动的功能。 我们这次代码是再init_os上进行完善的,所有不再设置段寄存器。 # 2 代码 ```asm .code16 .global _start .equ GRAPHICS_INDEX, 0x3d4 # original address of boot-sector .equ GRAPHICS_READ, 0x3d5 # original address of boot-sector _start: movw $msg1,%bx call print ._start_loop: jmp ._start_loop print: pushw %bx pushw %cx .print_loop: ## 传输打印的字符 movw (%bx),%cx call put_char inc %bx ## 当字符位\0的时候跳出循环 cmp $0,(%bx) jne .print_loop popw %cx popw %bx ret # 读取光标位置 # 结果保存在ax中 load_cursor: pushw %bx pushw %dx movw $GRAPHICS_INDEX,%dx movb $0x0e,%al out %al,%dx movw $GRAPHICS_READ,%dx in %dx,%al mov %al,%ah movw $GRAPHICS_INDEX,%dx movb $0x0f,%al out %al,%dx movw $GRAPHICS_READ,%dx in %dx,%al popw %dx popw %bx ret # 设置光标位置 # ax为光标位置 set_cursor: pushw %ax pushw %bx pushw %dx movw %ax,%bx movw $GRAPHICS_INDEX,%dx movb $0x0e,%al out %al,%dx movw $GRAPHICS_READ,%dx movb %bh,%al out %al,%dx mov %al,%ah movw $GRAPHICS_INDEX,%dx movb $0x0f,%al out %al,%dx movw $GRAPHICS_READ,%dx movb %bl,%al out %al,%dx popw %dx popw %bx popw %ax ret # 检查是否需要滚动 # ax当前光标位置 put_rolling: ## 当前光标位置是否大于2000 cmp $2000,%ax jl .put_rolling_ret pushw %ds pushw %es pushw %si pushw %di pushw %cx pushw %ax movw $1920,%cx shl $1,%cx movw $0xb80a,%ax movw %ax,%ds movw $0xb800,%ax movw %ax,%es sub %si, %si sub %di, %di rep movsb ## 最后一行清空 movw $80,%cx .put_rolling_set_blank: movb $' ',%es:(%di) add $2,%di loop .put_rolling_set_blank popw %ax sub $80,%ax call set_cursor popw %cx popw %di popw %si popw %es popw %ds .put_rolling_ret: ret #换行 # 参数:ax 现在的关闭位置 # 返回: 新的光标位置 put_newline: pushw %bx # 计算当前有多少行,多少列 movb $80,%bl div %bl movb $0,%ah # 忽略余数 inc %ax imul $80,%ax call set_cursor popw %bx ret # 打印一个字符 # ax 光标位置 , cl 需要打印的字符 put_char: pushw %ax pushw %bp pushw %es call load_cursor # 读取光标位置 cmp $'\n',%cl je .put_char_newline # 显示字符 movw %ax,%bp movw $0xb800,%ax movw %ax,%es shl $1,%bp movb %cl,%es:(%bp) shr $1,%bp inc %bp movw %bp,%ax call set_cursor jmp .put_char_ret .put_char_newline: call put_newline .put_char_ret: call put_rolling popw %es popw %bp popw %ax ret msg1: .string "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\0" ```
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号