首先背景知識指令包含兩個部分:操作碼和操作數
1:立即數尋址
立即數尋址一般被用在初始化寄存器的初始值,例如你在C++中的一個函數里寫下
char a = 4,翻譯成匯編語言就是 MOV AL, 0x04,進一步翻譯成機器碼就是 0xB004。
匯編:MOV AL,0x04
機器碼:0xB004
這個機器碼是一個指令,其高字節為操作碼:0xB0告訴CPU把一個立即數放入寄存器AL中(MOV AL, immed8),低字節0x04是操作數,代表立即數的值。
2:直接尋址
匯編:MOV AL, [0x04]
機器碼:0x8A0425
04000000
這里的操作碼:0x8A0425告訴CPU從一個偏移地址的內存中取出一個字節數據到AL中。
操作數: 0x04為該偏移地址,這里的0x04是一個立即數,只不過解釋為偏移地址。
3:相對尋址:
匯編:MOV AL,[RCX+0x04]
機器碼:8A4104
操作碼:0x8A41,告訴CPU利用RCX中的值和偏移量一起作為內存偏移地址,取出該偏移地址中內存的一個字節數據到AL中
操作數:0x04,就是一個固定偏移量,是一個立即數,解釋為地址偏移量。
所以立即數都是存放在指令中的操作數單元,僅僅跟隨著操作碼。而對于這個值來說你可以解釋為數字,也可以解釋為地址,就好比數字4816511,你可以解釋為人民幣數值,也可是電話號碼。
立即數當然是存在內存中啊,指令都在內存中,你說立即數呢?
立即數具體是什么含義那得看操作碼了,也就是看指令本身是做什么的?你把他當數據,
那就是數據,你把他當地址,然后訪問該地址的內存單元,那就是地址了啊。
為啥不能做除數?你可以看看CPU怎么做除法的,用寄存器的值去除以寄存器的值,沒有對應指令啊,就這么簡單,如果把CPU指令集中加上該方法不就可以了嗎?(當然應該是不可以加的,這里涉及到其他的原因,我個人覺得和CPU架構設計有關,沒辦法用內存中的值去直接和寄存器相互運算,除非內存速度很高可以直接做寄存器使用)。
需要 用byte ptr 或 word ptr 告訴 編譯器 是傳字節 還是 字。
或者將 movs 改為 movsb、movsw。;這是自動生成的代碼模板 STACKS SEGMENT STACK ;堆棧段 DW 128 DUP(?) ;注意這里只有128個字節 STACKS ENDS DATAS SEGMENT ;數據段;請在這里定義您的數據 SOURCE DW 100 DUP(?) DEST DW 100 DUP(?) DATAS ENDS CODES SEGMENT ;代碼段 ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS ;初始化 MOV DS,AX MOV ES,AX;請在這里添加您的代碼 MOV SI,OFFSET SOURCE MOV DI,OFFSET DEST MOV CX,100 REP MOVS WORD PTR [SI],[DI] MOV AX,4C00H ;退出程序 INT 21H CODES ENDS END START