linux-0.12 编译.s的步骤

本文记录了作者在Debian 9环境下使用as86和ld86编译Bootloader的过程,对比了nasm与as86生成代码的差异,并尝试解决在真实机器上运行的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

现在闲下来,开始学linux0.12.
给自己定的学习目标是:实验在真机+U盘上可以运行, 这样才有满足感:)

看其他同学,包括书上,都是在bochs下做实验。这样不能在真机上跑的实验,意义不大。

以前有段时间特别的闲, 玩过一个月的nasm, 写的bootloader在bochs和真机(插入载有bootloader的U盘)上都能跑。

照着书上最初的boot.s, 编译出来的bin, 写入镜像和U盘后,只在bochs2.6.9中能运行,在真机+U盘上不能运行。bochs真假:(

同样的汇编源码,用nasm和as86都写了一次,语义相同。但是用nasm和as86+ld86生成的汇编代码不一样(用bc4进行2进制比较)。明天用bochsdbg再查一下汇编代码的区别。

如果真是as86+ld86生成的代码不能在真机上跑,我决定找新版本的as系列编译器或用nasm重写as86版的代码(不同家的汇编,看起来都差不多,语法上稍有区别。改起来应该不是很难)。

今天做的实验,只能说明as86+ld86的编译过程,没有其他意义了。

实验

编译环境 :debian9 + as86 + ld86

boot.s实验代码

!
! @file D:\ls\study\linux_prj\old_linux\src\3.1.2\boot.s
! @brief
!
! 编译环境: debian9.6
! 系统自带的as, ld无法编译16位的boot代码
!
! 安装as86, ld86
! apt-get install bin86
!
! as86 -v
! as86 version: 0.16.17
!
! ld86 -v
! ld86 version: 0.16.17
!
! as86的帮助 => man as86 => 翻页用page_up page_down, 
! 在SecureCRT中还是用上下箭头来翻页吧,虽然看的有点晕(用page_up, page_down, 翻到man之外了)
!
! as86参数的含义
!	-0     start with 16-bit code segment, warn for all instructions > 8086
!	-1     start with 16-bit code segment, warn for all instructions > 80186
!	-2     start with 16-bit code segment, warn for all instructions > 80286
!	-3     start with 32-bit code segment, don't warn for any instructions. (not even 486 or 586)
! 	-l => 显示列表文件
! 
! ld86参数的含义
!	-0     produce header with 16-bit magic
!	-3     produce header with 32-bit magic
!	-s => 去掉符号
!
! 编译出来的./boot比512多出了32bytes的minix头, 用dd命令去掉
! dd命令参数的含义
!	bs=1 块大小为0
!	skip=32 跳过32个块
!	if=./boot 指定输入文件
!	of=./boot_512b 指定输出文件
! dd命令执行完的验证
!	用bc4比较./boot和./boot_512, 可以看到./boot_512内容和./boot后面的512字节内容相同
!
! 编译源码
! rm ./*.o ./boot
! as86 -2 -l -o ./boot.o ./boot.s
! ld86 -0 -s -o ./boot ./boot.o
! dd bs=1 skip=32 if=./boot of=./boot_512b

.globl begtext, begdata, begbss, endtext, enddata, endbss

.text
begtext:

.data
begdata:

.bss
begbss:

.text
! BOOTSEG = 0x7c00

entry start
.org 0
start:
!	jmpi go, BOOTSEG
! go:
	mov ax, cs
	mov ds, ax
	mov es, ax

! org code
!	mov [msg1+17], ah
!	mov cx, #20
!	mov dx, #0x1004
!	mov bx, #0x000c
!	mov bp, #msg1
!	mov ax, #0x1301

! code transplant from nasm
! show "666666" on monitor
	mov bh, #0
	mov bl, #0x47
	mov cx, #8
	mov al, #0x36 ! '6' is 0x36
	mov ah, #9

	int 0x10
loop0:
	jmp loop0

! msg1:
! 	.ascii "Loading system ..."
! 	.byte 0x0d, 0x0a

.org 510
	.word 0xAA55

.text
endtext:

.data
enddata:

.bss
endbss:


编译的脚本

#!/bin/sh
# @file D:\my_svn_checkout\my_svn_rep_2019\old_linux\src\3.1.2\build_as86_asm_on_debian.sh
rm ./boot
rm ./*.o
rm ./boot_512b
as86 -0 -l -o ./boot.o ./boot.s
ld86 -0 -s -o ./boot ./boot.o
dd bs=1 skip=32 if=./boot of=./boot_512b


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值