如何实现WriteHexBytes子程序 读取扇区并显示指定子程序的机器码
实现方案
1 前置修复:修正现有writeHexByte逻辑
现有writeHexByte仅处理了单个半字节(4位),无法完整输出一个字节的2位十六进制字符,修复后的代码如下:
# 原sector4的writeHexByte替换为以下内容 writeHexByte: .equ byte, 4 .equ row, 6 .equ col, 8 push %bp mov %sp, %bp push %ax push %bx # 处理高4位 mov byte(%bp), %al mov %al, %ah shr $4, %ah push %ah call convertHexNibble add $2, %sp # 输出高半字节 push row(%bp) push col(%bp) call moveCursor add $4, %sp push %ax push $0xe3 call displayChar add $4, %sp # 处理低4位 and $0x0f, %al push %al call convertHexNibble add $2, %sp # 输出低半字节,列偏移1位 mov col(%bp), %bx add $1, %bx push row(%bp) push %bx call moveCursor add $4, %sp push %ax push $0xe3 call displayChar add $4, %sp pop %bx pop %ax pop %bp ret . = writeHexByte + 512
2 调整扇区加载参数
原有引导代码中readSector $4仅加载前4个非引导扇区,新增的WriteHexBytes位于第6扇区,需要将读取扇区数修改为5:
# 引导区_start下的readSector调用修改为 readSector $5
3 实现WriteHexBytes子程序
将以下代码放在convertHexNibble之后的第6扇区,子程序参数约定:调用时从右到左压栈 起始列、起始行、字节长度、内存起始地址:
# Sector 6 新增WriteHexBytes writeHexBytes: .equ start_addr, 4 .equ length, 6 .equ start_row, 8 .equ start_col, 10 push %bp mov %sp, %bp push %si push %cx push %dx push %bx mov start_addr(%bp), %si # 待遍历内存起始地址 mov length(%bp), %cx # 待输出字节总长度 mov start_row(%bp), %dh # 显示起始行 mov start_col(%bp), %dl # 显示起始列 loop_write: jcxz end_write # 遍历完成则退出 # 输出当前字节 movb (%si), %al push %dx push %dl push %dh push %ax call writeHexByte add $6, %sp pop %dx # 更新显示位置 add $2, %dl cmp $79, %dl # 一行80字符,超出则换行 jl next_byte inc %dh mov $0, %dl next_byte: inc %si dec %cx jmp loop_write end_write: pop %bx pop %dx pop %cx pop %si pop %bp ret . = writeHexBytes + 512
4 功能测试
在引导代码的cli指令前添加调用代码,即可输出另外两个子程序的机器码:
# 输出moveCursor子程序的机器码,地址0x7e00,长度512,从第2行第0列开始显示 push $0 push $2 push $512 push $0x7e00 call writeHexBytes add $8, %sp # 输出displayChar子程序的机器码,地址0x8000,长度512,从第10行第0列开始显示 push $0 push $10 push $512 push $0x8000 call writeHexBytes add $8, %sp
内容的提问来源于stack exchange,提问作者user7502173
相关产品推荐
相关产品推荐

