欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

匯編語言中MOVS的使用方法?

錢斌斌2年前68瀏覽0評論

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

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