美文网首页
hello world

hello world

作者: 禽兽家族 | 来源:发表于2016-10-31 17:37 被阅读0次

            在开始之前讲个有意思的笑话。某日,一程序猿退休在家,闲来无事想学习书法。开始时候左思右想,不知如何下笔,突然灵光一闪提笔写下了几个大字,定睛一看“hello world”。

    所以这里,国际惯例我这里也是按照hello world开始。OK。

            编译连接完成了以后,这个代码必须是在MBR上大小为512个字节并且必须要以0xAA55结束,这里不要问我为啥子。我也不晓得,估计这个需要问IBM的PC开发的工程师为啥要这样定。开机自检完成以后PC会将MBR上的前512个字节的程序,读取到内存0x0000:0x07c0处,然后跳转到这个地址执行,这里执行的就是我们的程序。这个Hello world 程序相当简单,调用0x10号中断,完成清屏和显示“terrycheng”。这个程序我是在ubuntu下面实际能够编译完成,在bochsrc能够运行的。嘎嘎。

    详细代码:boot.asm

    .section .text

    .global _start

    .code16

    #这个也很重要,因为这里实际PC还是在实模式下,也就说为16位的机器,所以这里的数据都是要16位的。

    .extern main

    _start:

    movw %cx, %ax

    movw %ax, %ds

    movw %ax, %es

    #上面3行的作用是设置数据段寄存器,这个时候PC跳转到了0x0000:0x07c0处,所以CX寄存器地址为0x0000,然而其他的数据段确不是这个地址。

    #所以需要设置和代码段一样否则后面的terrycheng这个数据,是找不到的。

    call ClearScreen

    #调用后面的ClearScreen函数,完成清屏。

    movw $msgstr, %bp

    movw $10,    %cx

    call Display

    #调用0x10号中断,显示terrycheng

    1:

    jmp 1b

    #不解释,死循环。

    ClearScreen:

    movw $0x0700,  %ax

    movw $0x0000,  %cx

    movw $0xFFFF,  %dx

    int $0x10

    ret

    Display:

    movw $0x1300, %ax

    movw $0,      %dx

    movw $0x000C, %bx

    int $0x10

    ret

    msgstr:

    .asciz  "terrycheng"

    #terrycheng的数据位置。

    len:

    .int    . - msgstr

    #计算terrycheng的长度

    .org    0x1fe,  0x00

    #进行填充,之前我说过的MBR大小必须为512个字节,所以这里就把后面的数据填充为0

    .word  0xaa55

    #魔数 0xaa55。

    下面是makefile:

    TARGET=boot.img

    OBJECTS=

    CSRC=$(wildcard *.c)

    COBJ=$(patsubst %.c,%.o,$(CSRC))

    ASRC=$(wildcard *.asm)

    AOBJ=$(patsubst %.asm,%.o,$(ASRC))

    ALLSRC=$(ASRC) $(CSRC)

    ALLOBJECTS=$(AOBJ) $(COBJ)

    %.o : %.c

    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

    %.o : %.asm

    $(AS) -o $@ $<

    $(patsubst %.img,%.bin,$(TARGET)):$(ALLOBJECTS)

    ld -Ttext 0x7c00 -e _start $(ALLOBJECTS)  -o $@

    $(TARGET):$(patsubst %.img,%.bin,$(TARGET))

    objcopy -R .note -R .comment -S -O binary $< $@

    Debug:$(TARGET)

    objdump -D -b binary -mi8086 $(TARGET)

    cleanDebug:

    rm -fr $(ALLOBJECTS) $(TARGET) $(patsubst %.img,%.bin,$(TARGET))

    惯例,上图上真相:

    相关文章

      网友评论

          本文标题:hello world

          本文链接:https://www.haomeiwen.com/subject/fieputtx.html