1.我們都知道,8086可以訪問1MB內存,其中,0xF0000~9FFFF屬於常規內存,由內存條提供;0xF0000~0xFFFFF由主板上的一個芯片提供,即ROM-BIOS。這樣一來,中間還有一個320KB的空間,即0xA0000~0xEFFFF。傳統上,這段地址空間由特定的外圍設備來提供,其中就包括顯卡。因為顯示功能對於現代計算機來說實在太重要了。
2.由於歷史原因,所有在個人計算機上使用的顯卡,在加電自檢之后都會把自己初始化到80*25的文本格式。在這種模式下,屏幕上可以顯示25行,每行80個字符(一個字符兩個字節組成)。每屏總共2000個字符(4000字節)。
3.一直以來,0xB8000~0xBFFFF這段物理地址空間,是留給顯卡的。
tip:不允許將立即數傳送到段寄存器。
4.屏幕上的每個字節對應着顯存中的兩個連續字節,前一個是字符的ASCLL代碼,后面是字符的顯示屬性,包括字符顏色(前景色)和底色(背景色)。字符的顯示屬性(1字節)分為兩部分,低4位定義的是前景色,高4位定義的是背景色。格式:K R G B + I R B G(K是閃爍位,為0時不閃爍,為1時閃爍;I是亮度位,為0時正常,為1時高亮)
RGB:(000黑;001藍;010綠;011青;100紅;101品紅;110棕;111白)
tip:mov指令的目的操作數不允許為立即數,而且,目的操作數和源操作數不允許同時為內存單元。
5.在源程序的編譯階段,編譯器會把源程序整體上作為一個獨立的段來處理,並從0開始計算和跟蹤每一條指令的地址。因為該地址是在編譯期間計算的,故稱匯編地址。匯編地址是在源程序編譯期間,編譯器為每條指令確定的匯編位置,指示該指令相對於程序或者段起始處的距離,以字節計。當編譯后的程序裝入物理內存后,它又是該指令在內存段內的偏移地址。
6.在NASM匯編語言中,每條指令的前面都可以擁有一個標號,以代表和指示指令所在的匯編地址。
例如:
0x0000012B infi: jmp near infi
在這里,行首帶冒號的標號是“infi”。這條指令的匯編地址是0x0000012B,故infi就代表數值0x0000012B。或者說是0x0000012B的符號化表示。
7.在程序中聲明並初始化數據:要放在程序中的數據使用DB指令來聲明的(Declare)的,DB的意思是聲明字節(Declare Byte),所以,跟在它后面操作數都占一個字節的長度。注意,如果聲明超過一個以上的數據,各個操作數之間必須以逗號隔開。
除此之外,DW(Declare Word)用於聲明字數據,DD(Declare Double Word)用於聲明雙字數據,DQ(Declare Quad Word)用於聲明四字數據。DB,DW,DD和DQ並不是處理器指令而是匯編指令(偽指令)。
8.8086處理器提供除法指令div,它可以做兩種類型的除法。
第一種:是用16位的二進制數除以8位的二進制數。在這種情況下,被除數必須在寄存器AX中,必須事先傳送到AX寄存器里。除法可以由8位的通用寄存器或者內存單元提供。指令執行后,商在寄存器AL中,余數在寄存器AH中。
第二種:使用32位的二進制數除以16位的二進制數。在這種情況下,因為16位的處理器無法直接提供32位的被除數,故要求被除數的高16位在DX中,低16位在AX中。我們通常用DX:AX來描述32位的被除數。同時,除數可以由16位的通用寄存器或者內存單元提供,指令執行后,商在AX中,余數在DX中。
9.使程序進入無限循環狀態(初步了解jump指令)
例:infi : jump near infi
jump是轉移指令,用於使處理器脫離當前的執行序列,轉移到指定的地方執行。關鍵字near(偽指令)表示目標依然在當前代碼段內。
第一種情況,若jump后跟物理地址(即段地址:偏移地址)則jump的操作碼是0xEA
第二種情況,若jump后跟匯編地址,則jump的操作碼是0xE9
10.主引導扇區有效標志:計算機的設計者決定,一個有效的主引導扇區,其最后兩個字節的數據必須是0x55和0xAA。否則,這個扇區里保存的就不是一些有意而為的數據。
在示例代碼中,通過計算得到前面的內容和結尾的0xAA55之間,有203字節的空洞。因此,源程序的第102行,用於聲明203為0的數值來填補。
例:times 203 db 0(重復db 0指令203次)