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