Makefile 入门
在 day02 文件夹中(文件夹需要复制到z_tools同级目录下),执行make.bat 会报错imgout BPB data error.
原因是:JMP entry的未知放错了。
JMP entry 指令直接从程序开头跳转到了 entry 标签。但是,在你的代码中,entry 标签定义在 RESB 18 之后。这看起来没问题,但实际上entry标签的位置并不在BPB数据定义的末尾,导致跳转后程序无法正常执行,edimg工具在检查BPB表时发现了不匹配的数据,从而报错
修改方法:将改行放到 RESB 18 行后
完整代码如下:
; hello-os
; TAB=4ORG 0x7c00; 标准FAT12格式软盘专用的代码DB 0xeb, 0x4e, 0x90DB "HELLOIPL"DW 512DB 1DW 1DB 2DW 224DW 2880DB 0xf0DW 9DW 18DW 2DD 0DD 2880DB 0,0,0x29DD 0xffffffffDB "HELLO-OS "DB "FAT12 "RESB 18 ; 先空出18字节; ========== 关键修改:将 JMP entry 移动到这里 ==========JMP entry ; 移动至此,BPB数据定义完成后才进行跳转; 程序主体
entry: ; 入口标签MOV AX,0MOV SS,AXMOV SP,0x7c00MOV DS,AXMOV ES,AX
; ... 其余代码保持不变 ...msg:DB 0x0a, 0x0aDB "hello, world"DB 0x0aDB 0RESB 0x7dfe-$DB 0x55, 0xaa
edimg.exe 这个工具在制作镜像时,会严格按照偏移量去读取BPB数据。将 JMP entry 指令放在BPB数据块(RESB 18)之后,确保了从偏移量 0x03 到 0x3D 的这59个字节全部是正确的、连续的磁盘参数数据。
这样修改后,计算机从 0x7c00 地址开始执行,会先顺序通过这59字节的BPB数据(作为数据,不是代码),然后在第60字节处才执行到 JMP entry 指令,正确跳转到你的主程序,开始打印 "hello, world"。
注:该答案参考deepseek回答
