回覆列表
  • 1 # 使用者5239212291626

    首先背景知識指令包含兩個部分:操作碼和運算元

    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架構設計有關,沒辦法用記憶體中的值去直接和暫存器相互運算,除非記憶體速度很高可以直接做暫存器使用)。

  • 中秋節和大豐收的關聯?
  • 懷孕39周,總是覺得胃酸是什麼原因?