在没有OS的虚拟计算机上运行的引导时间程序

时间:2013-12-19 20:04:06

标签: nasm

对于学校作业,我必须编写下面描述的程序,我真的希望得到一些如何处理这个问题的帮助。要说清楚,我不希望你解决这个问题,我只是想要一些指导如何去做。

问题:

编写启动时间程序,该程序将在没有操作系统的虚拟计算机中运行。程序必须根据ALT键的状态打印出您的姓名和“按下ALT键”或“未按下ALT键”字样。

其他提示: - 程序必须以16位模式写入

  • 编译后的程序包括其数据大小必须小于510字节

  • 指令“org 0x7c00”指定加载程序的内存中的正确地址

  • 在数据之前写入指令

  • 程序应该在无限循环中执行

  • 没有printf功能,你必须使用中断0x10

  • 读取alt键的状态,你可以使用中断0x16

  • 定位文本输出中断0x10

  • 可执行文件的二进制格式应为“bin”(nasm -f bin -o boot.bin code.asm)

  • 将二进制文件的大小调整为软盘大小(truncate -s 1474560 boot.bin)

  • 将二进制文件标记为可引导磁盘:在0x1FE位置保存值0x55和at 位置0x1FF保存值0xAA(使用十六进制编辑器,例如:ghex2)

  • 使用二进制文件作为软盘启动虚拟机:(很好-n 19 qemu -fda boot.bin)

1 个答案:

答案 0 :(得分:0)

我建议你在程序集引导加载程序上阅读this。摘自那篇文章,这里是你好世界 -

        org 7C00h

        jmp short Start ;Jump over the data (the 'short' keyword makes the jmp instruction smaller)

Msg:    db "Hello World! "
EndMsg:

Start:  mov bx, 000Fh   ;Page 0, colour attribute 15 (white) for the int 10 calls below
        mov cx, 1       ;We will want to write 1 character
        xor dx, dx      ;Start at top left corner
        mov ds, dx      ;Ensure ds = 0 (to let us load the message)
        cld             ;Ensure direction flag is cleared (for LODSB)

Print:  mov si, Msg     ;Loads the address of the first byte of the message, 7C02h in this case

                        ;PC BIOS Interrupt 10 Subfunction 2 - Set cursor position
                        ;AH = 2
Char:   mov ah, 2       ;BH = page, DH = row, DL = column
        int 10h
        lodsb           ;Load a byte of the message into AL.
                        ;Remember that DS is 0 and SI holds the
                        ;offset of one of the bytes of the message.

                        ;PC BIOS Interrupt 10 Subfunction 9 - Write character and colour
                        ;AH = 9
        mov ah, 9       ;BH = page, AL = character, BL = attribute, CX = character count
        int 10h

        inc dl          ;Advance cursor

        cmp dl, 80      ;Wrap around edge of screen if necessary
        jne Skip
        xor dl, dl
        inc dh

        cmp dh, 25      ;Wrap around bottom of screen if necessary
        jne Skip
        xor dh, dh

Skip:   cmp si, EndMsg  ;If we're not at end of message,
        jne Char        ;continue loading characters
        jmp Print       ;otherwise restart from the beginning of the message


times 0200h - 2 - ($ - $$)  db 0    ;Zerofill up to 510 bytes

        dw 0AA55h       ;Boot Sector signature

;OPTIONAL:
;To zerofill up to the size of a standard 1.44MB, 3.5" floppy disk
;times 1474560 - ($ - $$) db 0