和標識內(nèi)存單元的偏移量相同,[bx]是用BX寄存器中的值作為偏移量表示內(nèi)存單元撒犀。
()用來表示寄存器和內(nèi)存單元中的內(nèi)容跨跨,這個作用有點像解引用操作符。它可以表示字或字節(jié)疯特,具體是哪個由寄存器名或具體的運算決定哗魂。
本書用了一個idata表示常量。
INC
BX:(BX)+=1漓雅,因此我想INC指令的作用就是給操作數(shù)加1录别。
我個人感覺loop有點像goto語句,它的用法如下所示:
loop標號
它的循環(huán)次數(shù)在CX中邻吞,每執(zhí)行一次就先執(zhí)行一次(CX)-=1组题,如果(CX)!=0就執(zhí)行l(wèi)oop。所以抱冷,loop又有點像while而不是do……while循環(huán)崔列。它的用法實例可以見P105程序5.1。
標號實際上代表了一個地址旺遮,該地址處有一條指令赵讯。
5.3在Debug中跟蹤用loop指令實現(xiàn)的循環(huán)程序
在匯編指令中,數(shù)據(jù)不能以字母開頭耿眉。比如說边翼,A000H要寫成0A000H。
Debug是把[idata]中的idata當成偏移量來處理鸣剪,而Masm把[idata]直接當成數(shù)值idata來處理组底。
因為匯編語法把idata當成偏移量,于是[bx]解決了這一問題筐骇。
另一種辦法是顯式地給出段基址和偏移量债鸡,比如下面:
MOV al,ds:[0]
本節(jié)提出了一個問題。
字和字節(jié)是不同的類型拥褂,16位寄存器和8位寄存器也是不同的類型娘锁,所以你不能直接在16位寄存器中計算8位的數(shù)據(jù)牙寞,反之亦然饺鹃。那又如何解決字節(jié)型數(shù)據(jù)累加越界的問題?作者的辦法是將8位數(shù)據(jù)送入一個臨時的16位寄存器中间雀,然后在這個16位寄存器中進行累加悔详,最后再把結(jié)果送入目的16位寄存器中。
從本節(jié)講解可以看出bx實際上就是一個變量惹挟,因此[bx]是可變的偏移地址茄螃,(bx)是一個可變的數(shù)值。
像MOV AL DS:[idata]這種寫法中的DS叫做段前綴连锯,該處也可以出現(xiàn)CS归苍、SS用狱、ES等,DS:[idata]可以作為一個整體表示一個內(nèi)存單元地址拼弃。