編程:啓動程序實現很簡單的功能在屏幕中央 ;打印一行字符串(彙編+c+red hat linux實現)
彙編語言編寫:
boot.asm啓動程序代碼:
;我們的啓動程序實現很簡單的功能在屏幕中央
;打印一行字符串
org 07c00h ;org指令明確告訴編譯器我程序開始地址是07c00h,而不是
;原來的00000
;int彙編指令 int 10h
mov ax,cs
mov es,ax
mov bp,msgstr ;es:bp ;指向的內容就是我們要顯示的
字符串的地址
mov cx,12 ;字符串長度
mov dh,12 ;顯示的行號
mov dl,36 ;顯示的列號
mov bh,0 ;顯示的頁數
mov al,1 ;顯示的是串結構
mov bl,0ch ;顯示字符屬性 黑底紅字
mov ah,13h ;明確調用13h子程序
msgstr: db "hello my osi"
int 10h
times 210-($-$$) db 0 ;重複N次每次填充值爲0
dw 55aah
jmp $ ;不斷跳轉到當前位置是個死循環。注:$是當前地址。
彙編運行環境圖例:
虛擬機系統:red hat linux運行環境下編寫c語言代碼實現:
將自己已經編譯好的彙編boot.asm啓動程序載入虛擬機中,在虛擬機中寫入c語言代碼實現boot.bin的512B啓動程序拷貝。
#include<stdio.h>
#include<fcnt1.h>
#include<sys/types.h>
#include<sys/stat.h>
int main(int argc,char *argv[])
{
int fd_source;
int fd_dest;
int read_count = 0;
char buffer[512]={0};
fd_source=open("boot.bin",0_RDONLY);
if(fd_source<0)
{
perror("open boot.bin error:");
return 0;
}
fd_dest=ope("virtual_floppy.vfd",0_RWONLY);
while ((read_count=read(fd_source,buffer,512))>0)
{
write(fd_dest,buffer,read_count);
memset(buffer,0,512);
}
printf("write image ok!");
return 0;
}
操作步驟圖例:
第一步:將我們在彙編寫好的空白boot啓動鏡像加載
接下來,我們在輸入此命令準備寫入c語言代碼
第二步:我們有了c語言基礎,那麼我們開始將512B的boot.bin的啓動程序開始進行拷貝
第三步:好了,我們已經將boot.bin寫好了
用winImage啓動下我們編寫好的程序。
作者註明:剛學習彙編,請大牛勿噴!!!