實(shí)模式和保護(hù)模式
在計(jì)算機(jī)上面,實(shí)模式存在的時(shí)間非常之短,所以一般我們是感覺(jué)不到它的存在的。CPU復(fù)位(reset)或加電(power on)的時(shí)候就是以實(shí)模式啟動(dòng),在這個(gè)時(shí)候處理器以實(shí)模式工作,不能實(shí)現(xiàn)權(quán)限分級(jí),也不能訪問(wèn)20位以上的地址線,也就是只能訪問(wèn)1M內(nèi)存。之后一般就加載操作系統(tǒng)模塊,進(jìn)入保護(hù)模式
從顯示字符串開(kāi)始
屏幕有 25列X80行
列和行從0開(kāi)始計(jì)數(shù)
顯存地址空間:
0xB8000~0xBFFFF
屏幕上的每個(gè)字符對(duì)應(yīng)著顯存中的兩個(gè)連續(xù)字節(jié),前一個(gè)是字符的ASCII代碼,后面是字符的顯示屬性,包括字符顏色(前景色)和底色(背景色)
一般情況下,如果沒(méi)有附加任何指示,段地址默認(rèn)在段寄存器DS中。比如
mov byte [0x00],'L'
使用ES作為段地址的情況:
mov byte [es:0x00],'L'
使用方括號(hào)括起來(lái)的原因:目的操作數(shù)給出的是一個(gè)內(nèi)存地址,我們要用源操作數(shù)來(lái)修改這個(gè)地址里的內(nèi)容,所以,目的操作數(shù)必須用方括號(hào)圍起來(lái),以表明它是一個(gè)地址。
關(guān)鍵字byte用來(lái)修飾目的操作數(shù),指出本次傳送是以字節(jié)的方式進(jìn)行的。
初始化段寄存器ES
mov ax,0xb800
mov ex,ax ;不能直接將立即數(shù)移到段寄存器中
顯示標(biāo)號(hào)的匯編地址
在源程序的編譯階段,編譯器會(huì)把源程序整體上作為一個(gè)獨(dú)立的段來(lái)處理,并從0開(kāi)始計(jì)算和跟蹤每一條指令的地址。
在NASM匯編語(yǔ)言里,每條指令的前面都可以擁有一個(gè)標(biāo)號(hào),以代表和指示該指令的匯編地址。
在程序中聲明并初始化數(shù)據(jù)
db byte 0,0,0,0,0
代表聲明了5個(gè)字節(jié),并初始化為0
db,dw,dd,dq不是處理器指令,它指示編譯器提供的匯編指令,所以稱做偽指令。
訪問(wèn)操作數(shù)
在 nasm 語(yǔ)法里,對(duì) memory 操作數(shù)需要加 [ ] 括號(hào)
常用運(yùn)算符積累
mul
兩個(gè)相乘數(shù),要么都是8位,要么都是16位。 8位乘法,16位乘法。
如果是8位,一個(gè)數(shù)字默認(rèn)存放在al中,另外一個(gè)數(shù)字存放在其他8位寄存器中或者字節(jié)型內(nèi)存單元中。
如果是16位,一個(gè)數(shù)字默認(rèn)存放在ax中,另外一個(gè)數(shù)字存放在其他16位寄存器中或者字型內(nèi)存單元中。
結(jié)果: 8位乘法,得到一個(gè)16位數(shù), 結(jié)果存放在ax中
16位乘法,得到一個(gè)32位數(shù), 低16位存放在ax中,高16位存放在dx中
獲取字符串長(zhǎng)度
string db '你的字'
len_string equ $ - string
$就是當(dāng)前地址,$-string 就是當(dāng)前地址減去string的初始地址,即可得到string的長(zhǎng)度。
總結(jié)
以上所述是小編給大家介紹的8086匯編語(yǔ)言nasm版本,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)html5模板網(wǎng)網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!