【发布时间】:2015-03-12 02:53:58
【问题描述】:
我正在尝试使用 USB 上的引导加载程序加载一些数据,但显然 int 13h 不起作用!
引导加载程序:
[bits 16]
[ORG 0x7c00]
jmp 0x0000:start
start:
cli
xor ax, ax
mov ss, ax
mov sp, 0x7c00
mov ax, cs
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
sti
mov [driveno], dl
reset:
;reset drive
xor ax, ax
mov dl, [driveno]
int 0x13
or ah, ah
jnz reset
mov ah, 0x02
mov al, 0x01
mov bx, 0x0000
mov es, bx
mov bx, 0x7e00
mov dl, [driveno]
xor dh, dh
mov cx, 0x0002
int 0x13
or ah, ah
jnz reset
mov dx, [0x7e00] ;So i can check and see if it has been loaded
call printhex
cli
hlt
jmp $
print:
loop:
lodsb
or al, al
jz done
mov ah, 0x0e
mov bx, 0x0003 ;page 0 and default color
int 0x10
jmp loop
done:
ret
printhex:
push bx
push si
mov si, hex_template
mov bx, dx
shr bx, 12
mov bx, [bx+hexabet]
mov [hex_template+2], bl
mov bx, dx
shr bx, 8
and bx, 0x000f
mov bx, [bx+hexabet]
mov [hex_template+3], bl
mov bx, dx
shr bx, 4
and bx, 0x000f
mov bx, [bx+hexabet]
mov [hex_template+4], bl
mov bx, dx
and bx, 0x000f
mov bx, [bx+hexabet]
mov [hex_template+5], bl
call print
pop si
pop bx
ret
hex_template db '0x????',0
hexabet db '0123456789abcdef'
driveno db 0 ;Storing dl
times 510-($-$$) db 0
dw 0aa55h
dw 0x1234 ;This wont load!!!!
times 510 db 0
我希望我的十六进制转储方法将 0x1234 打印到屏幕上,但它会打印 0x0000!我知道我的十六进制转储方法有效,问题是 0x1234 永远不会被加载。有什么想法吗?
我在 Windows 上运行。我编译并生成一个图像:
nasm -f bin -o boot.bin boot.asm
dd if=boot.bin of=\\.\e: bs=512 count=2
我正在使用来自chrysocome 的dd。谁能解释这种行为?
【问题讨论】:
-
对我来说唯一看起来“有趣”的是
of=\.\e:。它必须有效,否则您根本看不到任何输出。我习惯使用的是of=/dev/fd0- 我有一个真正的软盘驱动器。对于 USB,我会“期待”类似of=/dev/sdb(?) 的东西。这是dd的Windows 端口吗?这可以解释我的困惑。我在您的代码中没有发现任何错误 - 实际上非常好。祝你好运! -
是的,它是一个 Windows 端口。有没有其他的程序我可以试试?
-
"rawrite" 也许(我不熟悉 Windows 工具),但我认为您的
dd必须工作,否则您根本看不到任何输出。返回int 13h。我认为检查ah的错误号会起作用,但错误的指示是进位标志设置。你可以试试jc reset... -
@MichaelMorrow :这是一个较老的问题,您可能已经弄清楚了,但我知道出了什么问题。为了为这个问题制定一个有用的答案,这将有助于我了解您使用的
dd的版本。是cygwin下的dd吗?系统? msys2?还是您使用了这里的一个:chrysocome.net/dd?还是其他地方的? -
您好,我使用的是 chrysocome.net 版本。
标签: assembly x86 usb bootloader dd