对于学校作业,我必须编写下面描述的程序,我真的希望得到一些如何处理这个问题的帮助。要说清楚,我不希望你解决这个问题,我只是想要一些指导如何去做。
问题:
编写启动时间程序,该程序将在没有操作系统的虚拟计算机中运行。程序必须根据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)
答案 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