diff --git a/README.md b/README.md
index 5daf7af..3b1f9d6 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,30 @@
 bootsect
 ========
+
+1、第1行.globl是汇编指示符(或称为汇编伪指令，伪操作符)，汇编指示符均以一个字符.开始，编译时，不会产生任何代码，
+汇编指示符由一个伪操作码，后跟0个或多个操作数组成；(后面的那些标号就是.globl的操作数)
+
+2、第3行 标号是后面带有冒号的标示符，引用一个标号时无须带冒号；
+
+3、.global伪操作符用于定义随后的标号标识符是外部的或全局的，并且即使不使用也强制引用，.text，.data，.bss分别对应汇编程序编译产生目标文件中的3个段，即正文段、数据段和未初始化数据段；每个标号标识段的开始位置，并把当前段切换到相应的段。
+
+4、由3可知，行2~8用于在每个段中定义一个符号，最后切换到text段开始编写随后的代码；
+
+5、标识符entry是保留关键字，用于迫使链接器ld86在生成的可执行文件中包括进其后指定的标号start，通常在链接多个目标文件生成一个可执行文件时应该在其中一个汇编程序中使用关键词entry指定一个入口标号，以便调试；
+
+6、第13行，段间远距离调转语句，就跳转到下一条指令；
+
+7、第18行是间接寻址；
+
+8、第19~23行是立即数寻址；
+
+9、第27行定义字符串，定义字符串需要使用伪操作符.ascii，使用伪操作符.asciiz还会自动在字符串后添加一个NULL(0)字符；
+
+10、第28行定义字符，定义字符需要使用伪操作符.byte，并且需要使用单引号括住，也可以直接写字符的ascii；
+
+11、第29行的伪操作符.org定义了当前汇编的位置。这条语句会把当前汇编器编译过程中当前段的位置计数器值调整位该伪操作符语句上给出的值；
+
+12、第30行，伪操作符.word用于在当前位置定义一个双字节内存对象(变量)，其后可以是一个数或者是一个表达式，由于后面已经没有代码或数据了，因此确定此.s文件编译出来的执行程序应该正好是512B；
+
+13、第31~36行，又在3个段中分别设置了3个标号。分别用来表示3个段的结束位置。这样设置可以用来链接多个目标模块时区分各个模块中各个段的开始和结束位置。
+
diff --git a/bootsect.S b/bootsect.S
index e69de29..35b56d5 100644
--- a/bootsect.S
+++ b/bootsect.S
@@ -0,0 +1,36 @@
+.globl begtext, begdata, begbss, endtext, enddata, endbss
+	.text
+begtext:
+	.data
+begdata:
+	.bss
+begbss:
+	.text
+	BOOTSEG = 0x07c0
+
+	entry start
+start:
+	jmpi go, BOOTSEG
+go:
+	mov ax, cs
+	mov ds. ax
+	mov es, ax
+	mov [msgl+17], ah
+	mov cx, #20
+	mov dx, #0x1004
+	mov bx, #0x000c
+	mov bp, #msgl
+	mov ax, #0x1301
+	int 0x10
+loop0:
+	jmp loop0
+msgl:	.ascii "Loading system ..."
+	.byte 13, 10
+	.org 510
+	.word 0xAA55
+	.text
+endtext:
+	.data
+enddata:
+	.bss
+endbss: