djm*_*i11 5 assembly nasm bootloader
我编写了基于以下内容的简单引导加载程序:http : //www.viralpatel.net/taj/tutorial/hello_world_bootloader.php
[BITS 16] ;16bit
[ORG 0x7C00] ;offset
MOV AH, 0x00 ; change video mode
MOV AL, 0x13 ; 0x13
INT 0x10 ; interrupt
CALL DrawTenLines ;lets draw
JMP $ ;hang it
DrawOneLine:
MOV CX, 0x00 ;x = 0
nextpixel:
MOV AH, 0x09 ;func number - WritePixelOnScreen [wiki]
MOV AL, 0x05 ;color - Magenta
MOV BH, 0x00 ;Page no
INT 0x10 ;Video interrupt - BIOS
CMP CX, 10 ;if (x == 10) {
JE exitfunc ;exit function } else {
JNE nextpixel ;next pixel }
ADD CX, 0x01 ;add one :D
exitfunc: ;exit :D
RET
DrawTenLines: ;draw some lines
MOV DX, 0x00 ;y = 0
CALL DrawOneLine
MOV DX, 0x01 ;y = 1
CALL DrawOneLine
MOV DX, 0x02 ;y = 2
CALL DrawOneLine
MOV DX, 0x03 ;y = 3
CALL DrawOneLine
MOV DX, 0x04 ;y = 4
CALL DrawOneLine
MOV DX, 0x05 ;y = 5
CALL DrawOneLine
RET
;Data
TIMES 510 - ($ - $$) db 0 ;Fillers
DW 0xAA55 ;boot signature
Run Code Online (Sandbox Code Playgroud)
但这并没有按预期工作 - 不绘制,只有黑屏并挂起(如预期)。
用 NASM 编译,-f bin。此站点的示例有效。在 Virtualbox 中测试。
编辑:忘记更改视频模式 - 但仍然不起作用。
编辑 2:此代码:[BITS 16] ;16bit [ORG 0x7C00] ;offset
MOV AH, 0x00
MOV AL, 0x13
INT 0x10
MOV AH, 0x09 ;WritePixelOnScreen [wiki]
MOV AL, 0x0F ;color - White
MOV BH, 0x00 ;page no.
MOV CX, 1 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
MOV CX, 2 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
MOV CX, 3 ;x
MOV DX, 1 ;y
INT 0x10 ;interrupt
JMP $ ;hang
;Data
TIMES 510 - ($ - $$) db 0 ;filler
DW 0xAA55 ;boot signature
Run Code Online (Sandbox Code Playgroud)
你有一个无限循环DrawOneLine。该行永远不会被执行:
ADD CX, 0x01 ;add one :D
Run Code Online (Sandbox Code Playgroud)
您的循环代码应该看起来更像这样:
CMP CX, 10 ;if (x == 10) {
JE exitfunc ;exit function } else {
ADD CX, 0x01 ;add one :D
JMP nextpixel ;next pixel }
Run Code Online (Sandbox Code Playgroud)
我认为您的问题可能是使用了错误的视频模式。您将视频模式设置为模式 0x13,然后调用INT 0x10, AH=0x09,我认为这是一个文本模式函数。IIRC,模式0x13的屏幕数据位于0xA000:0x0000,可以直接写入。
编辑:我认为INT 0x10, AH=0x0C这是你试图使用的,而不是INT 0x10, AH=0x09.