Linux核心注釋-1/boot/bootsect.s 該代碼來自linux0.11核心代碼/boot/bootsect.s這段代碼使用asm彙編格式啟動代碼,之所以不使用AT&T,原因是當時的AT&T彙編不支援16位元模式. www.2cto.com 彙編知識:串操作指令:串操作指令的運算元是主存中連續存放的資料串(String)——即在連續的主存地區中,位元組或字的序列串操作指令的操作對象是以字(W)為單位的字串,或是以位元組(B)為單位的位元組串 串定址方式:源運算元用寄存器SI定址,預設在資料區段DS中,但允許段超越:DS:[SI]目的運算元用寄存器DI定址,預設在附加段ES中,不允許段超越:ES:[DI]每執行一次串操作指令,SI和DI將自動增(減) 串傳送指令MOVW,MOVB把位元組(B)或字(W)運算元從主存的源地址傳送至目的地址 REP重複首碼指令REP :每執行一次串指令,CX減1,直到CX=0,重複執行結束 1 BOOTSEG = 0x07c0 2 INITSEG = 0x9000 3 ... .... 4 entry start 5 start: 6 mov ax , #BOOTSEG 7 mov ds , ax !ds = 0x07c0 8 mov ax , #INITSEG 9 mov es , ax !es = 0x900010 mov cx , #256 !cx = 256 用於迴圈計數11 sub si , si !si = si - si 意味著si = 0 12 !ds:si = 0x07c0:0x0000 = 0x7c0013 sub di , di !di = di - di 意味著di = 014 !ds:si = 0x9000:0x0000 = 0x9000015 rep !開始迴圈操作 直到 cx = 016 movw !每次移動1個字,執行256次,實現:17 !0x7c00開始的256個字(word)即512位元組的資料到0x9000處18 !即將bootsect.s移到0x9000處19 jmpi go , INITSEG !跳轉到0x90000處開始執行,下面的代碼