首先背景知識指令包含兩個部分:操作碼和運算元
1:立即數定址
立即數定址一般被用在初始化暫存器的初始值,例如你在C++中的一個函數里寫下
char a = 4,翻譯成組合語言就是 MOV AL, 0x04,進一步翻譯成機器碼就是 0xB004。
彙編:MOV AL,0x04
機器碼:0xB004
這個機器碼是一個指令,其高位元組為操作碼:0xB0告訴CPU把一個立即數放入暫存器AL中(MOV AL, immed8),低位元組0x04是運算元,代表立即數的值。
2:直接定址
彙編:MOV AL, [0x04]
機器碼:0x8A042504000000
這裡的操作碼:0x8A0425告訴CPU從一個偏移地址的記憶體中取出一個位元組資料到AL中。
運算元: 0x04為該偏移地址,這裡的0x04是一個立即數,只不過解釋為偏移地址。
3:相對定址:
彙編:MOV AL,[RCX+0x04]
機器碼:8A4104
操作碼:0x8A41,告訴CPU利用RCX中的值和偏移量一起作為記憶體偏移地址,取出該偏移地址中記憶體的一個位元組資料到AL中
運算元:0x04,就是一個固定偏移量,是一個立即數,解釋為地址偏移量。
所以立即數都是存放在指令中的運算元單元,僅僅跟隨著操作碼。而對於這個值來說你可以解釋為數字,也可以解釋為地址,就好比數字4816511,你可以解釋為人民幣數值,也可是電話號碼。
立即數當然是存在記憶體中啊,指令都在記憶體中,你說立即數呢?
立即數具體是什麼含義那得看操作碼了,也就是看指令本身是做什麼的?你把他當資料,
那就是資料,你把他當地址,然後訪問該地址的記憶體單元,那就是地址了啊。
為啥不能做除數?你可以看看CPU怎麼做除法的,用暫存器的值去除以暫存器的值,沒有對應指令啊,就這麼簡單,如果把CPU指令集中加上該方法不就可以了嗎?(當然應該是不可以加的,這裡涉及到其他的原因,我個人覺得和CPU架構設計有關,沒辦法用記憶體中的值去直接和暫存器相互運算,除非記憶體速度很高可以直接做暫存器使用)。
首先背景知識指令包含兩個部分:操作碼和運算元
1:立即數定址
立即數定址一般被用在初始化暫存器的初始值,例如你在C++中的一個函數里寫下
char a = 4,翻譯成組合語言就是 MOV AL, 0x04,進一步翻譯成機器碼就是 0xB004。
彙編:MOV AL,0x04
機器碼:0xB004
這個機器碼是一個指令,其高位元組為操作碼:0xB0告訴CPU把一個立即數放入暫存器AL中(MOV AL, immed8),低位元組0x04是運算元,代表立即數的值。
2:直接定址
彙編:MOV AL, [0x04]
機器碼:0x8A042504000000
這裡的操作碼:0x8A0425告訴CPU從一個偏移地址的記憶體中取出一個位元組資料到AL中。
運算元: 0x04為該偏移地址,這裡的0x04是一個立即數,只不過解釋為偏移地址。
3:相對定址:
彙編:MOV AL,[RCX+0x04]
機器碼:8A4104
操作碼:0x8A41,告訴CPU利用RCX中的值和偏移量一起作為記憶體偏移地址,取出該偏移地址中記憶體的一個位元組資料到AL中
運算元:0x04,就是一個固定偏移量,是一個立即數,解釋為地址偏移量。
所以立即數都是存放在指令中的運算元單元,僅僅跟隨著操作碼。而對於這個值來說你可以解釋為數字,也可以解釋為地址,就好比數字4816511,你可以解釋為人民幣數值,也可是電話號碼。
立即數當然是存在記憶體中啊,指令都在記憶體中,你說立即數呢?
立即數具體是什麼含義那得看操作碼了,也就是看指令本身是做什麼的?你把他當資料,
那就是資料,你把他當地址,然後訪問該地址的記憶體單元,那就是地址了啊。
為啥不能做除數?你可以看看CPU怎麼做除法的,用暫存器的值去除以暫存器的值,沒有對應指令啊,就這麼簡單,如果把CPU指令集中加上該方法不就可以了嗎?(當然應該是不可以加的,這裡涉及到其他的原因,我個人覺得和CPU架構設計有關,沒辦法用記憶體中的值去直接和暫存器相互運算,除非記憶體速度很高可以直接做暫存器使用)。