@(讀書筆記)[匯編語言, 王爽]
前置知識
- 8086寄存器為16位,為了和以前的8位架構(gòu)的CPU兼容,把寄存器可以邏輯上分為兩部分——高位和低位。比如通用寄存器AX,BX,CX和DX都可以分為AH,AL,BH,BL,CH,CL,DH和DL。
- 由此而來的,CPU可以一次性對兩種尺寸的數(shù)據(jù)進行處理。一種是字節(jié)(Byte),是8位結(jié)構(gòu),也就是8個bit組成;另一種是字(word),由兩個字節(jié)組成,把它分為高字節(jié)位和低字節(jié)位,是16位。于是8086的寄存器里可以一次存儲一個字或者兩個字節(jié)。
注意 00101010 11010001 這一串二進制碼前面為高位,后面為低位。第0位數(shù)是從右往左數(shù)的,也就是1,而不是0。 - 也因為字和字節(jié)的不同,匯編指令要注意操作數(shù)的位數(shù)應(yīng)當一致。比如MOV AX,BL就是錯誤的,因為BL只有8位,而AX有16位。
- 還要注意的是,當我們對al進行操作的時候,al是一個獨立的8位寄存器來使用,和ah沒有關(guān)系。比如在al和某數(shù)相加需要進位時,寄存器是不會給ah加上1的。但是若時ax做加減,那么al和ah之間是會有進位和退位的??傊灰唵蔚卣J為ax=ah+al。
物理地址
由于內(nèi)存需求比較大,需要的地址總線會比CPU內(nèi)部總線多。8086中地址總線是20位,而CPU一次只能處理16位。為了合成20位的內(nèi)存地址,設(shè)計了一個段地址*16+偏移地址=物理地址的機制。
- 物理地址是指每一個內(nèi)存單元在計算機系統(tǒng)內(nèi)存空間里唯一的內(nèi)存地址。
段寄存器
CS:IP
這是代碼段寄存器。CS代表當前指令所在物理地址的段地址,ip代表偏移地址。這是一個默認的配對,不能認為修改。
于是指令執(zhí)行的具體過程是:從CS和IP中讀取數(shù)據(jù),送入CPU中的地址加法器得到物理地址,然后通過外部地址總線找到該物理地址指向的內(nèi)存單元,讀取到指令送回CPU中的指令緩沖器中,然后給IP加上該指令的長度,將IP從指向當前要執(zhí)行的指令的內(nèi)存地址改成指向下一條指令的內(nèi)存地址。最后通過執(zhí)行控制器執(zhí)行指令。
注意:這里是先改變IP,然后再執(zhí)行指令。這一點在當指令中有改變IP值的命令時,尤為重要。改變IP不能用MOV,得用jmp。
語法代碼示例
mov ax,2000h
mov cs,ax //改變cs的值
jmp 2ae3:3 //執(zhí)行后cs=2ae3,ip=3
jmp ax //執(zhí)行后ip為ax里的值