我有两个NASM文件用于我的操作系统我正在编写汇编,我几乎100%肯定他们工作,但我不知道,因为我不知道究竟如何编译他们。我知道如何使用命令nasm -f bin boot.asm -o boot.bin
和cat boot.bin > image.hdd
,但现在我有两个文件要使用,我不知道如何链接它们。我已经尝试将它们中的两个编译成单独的.bin文件,然后使用cat boot.bin other.bin > image.hdd
但是当我尝试用VirtualBox打开它时(我用它来测试我的操作系统的东西)它不会让我。
如果您需要查看它们,我的两个汇编文件中的代码是
;--------------------------------------------
; 'boot.asm'
; loaded from BIOS
[org 0x7C00]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
resetdisk:
mov ah, 0x00 ; reset function
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc resetdisk
readdisk:
mov bx, 0x8000 ; segment
mov es, bx
mov bx, 0x0000 ; offset
mov ah, 0x02 ; read function
mov al, 0x03 ; sectors
mov ch, 0x00 ; cylinder
mov cl, 0x02 ; sector
mov dh, 0x00 ; head
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc readdisk
db 0eah
dw 00000h ; offset
dw 08000h ; segment
;--------------------------------------------
times 510 - ($ - $$) db 0x00
db 0x55, 0xAA
和
;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'
[org 0x8000]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
jmp $ ; hang
SIDE注意:我在Mac OS X Mountain Lion上,所以我最终得到了帮助。
答案 0 :(得分:2)
假设您使用的是硬盘而不是软盘映像( image.hdd ),您首先想要像这样更改 boot.asm :< / p>
;--------------------------------------------
; 'boot.asm'
; loaded from BIOS
[org 0x7C00]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
resetdisk:
mov ah, 0x00 ; reset function
mov dl, 0x80 ; drive
int 0x13 ; disk int
jc resetdisk
readdisk:
mov bx, 0x8000 ; segment
mov es, bx
mov bx, 0x0000 ; offset
mov ah, 0x02 ; read function
mov al, 0x01 ; sectors
mov ch, 0x00 ; cylinder
mov cl, 0x02 ; sector
mov dh, 0x00 ; head
mov dl, 0x80 ; drive
int 0x13 ; disk int
jc readdisk
db 0eah
dw 00000h ; offset
dw 08000h ; segment
;--------------------------------------------
times 510 - ($ - $$) db 0x00
db 0x55, 0xAA
请注意,驱动器( dl )和扇区计数( al )在两次int 0x13调用之前已更改。 然后你想要创建一个512字节的倍数的图像,如下所示:
$ nasm -f bin boot.asm -o boot.bin
$ nasm -f bin load.asm -o load.bin
$ dd if=/dev/zero of=pad504 bs=1 count=504
$ cat boot.bin load.bin pad504 > image.hdd
填充 504 字节,因为 load.bin 8 字节且 512 - 8 = 504 。因此,当您修改 load.asm 时,您需要更改命令以生成适当大小的填充
$ dd if=/dev/zero of=padding bs=1 count=$((512 - $(ls -l load | cut -d ' ' -f 5) % 512))
$ cat boot.bin load.bin padding > image.hdd
答案 1 :(得分:1)
Virtualbox不会“让”你做什么?
除了Scottt的建议之外,我还指出你正在阅读load.bin
以分段0x8000偏移0,并跳转到分段0x8000偏移0,但load.asm
指定org 0x8000
。这是不正确的。在这个基本程序中它不会打扰你,但是一旦你尝试打印msg
,它就会失败。与普通的编程环境不同,在引导环境中没有用于管理段寄存器的操作系统 - 您需要自己保持顺序。 cs
由远程跳转设置(或者我们正在执行其他一些代码!)但是ds(等等)取决于你。一个理智的ss:sp
也不是一个坏主意。你还不需要这个,但很快就会有。