汇编语言操作数类型
x86 的指令格式為:
?
[label:] mnemonic [operands][ ;comment ]
指令包含的操作數(shù)個(gè)數(shù)可以是:0 個(gè),1 個(gè),2 個(gè)或 3 個(gè)。這里,為了清晰起見(jiàn),省略掉標(biāo)號(hào)和注釋:
mnemonic
mnemonic [destination] mnemonic [destination] , [source] mnemonic [destination] , [source-1] , [source-2]
操作數(shù)有 3 種基本類型:
- 立即數(shù)——用數(shù)字文本表達(dá)式
- 寄存器操作數(shù)——使用 CPU 內(nèi)已命名的寄存器
- 內(nèi)存操作數(shù)——引用內(nèi)存位置
下表說(shuō)明了標(biāo)準(zhǔn)操作數(shù)類型,它使用了簡(jiǎn)單的操作數(shù)符號(hào)(32 位模式下),這些符號(hào)來(lái)自 Intel 手冊(cè)并進(jìn)行了改編。本教程將用這些符號(hào)來(lái)描述每條指令的語(yǔ)法。
| reg8 | 8 位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL |
| reg16 | 16 位通用寄存器:AX、BX、CX、DX、SI、DI、SP、BP |
| reg32 | 32 位通用寄存器:EAX、EEX、ECX、EDX、ESI、EDI、ESP、EBP |
| reg | 通用寄存器 |
| sreg | 16 位段寄存器:CS、DS、SS、ES、FS、GS |
| imm | 8 位、16 位或 32 位立即數(shù) |
| imm8 | 8 位立即數(shù),字節(jié)型數(shù)值 |
| imm16 | 16 位立即數(shù),字類型數(shù)值 |
| imm32 | 32 位立即數(shù),雙字型數(shù)值 |
| reg/mem8 | 8 位操作數(shù),可以是 8 位通用寄存器或內(nèi)存字節(jié) |
| reg/mem16 | 16 位立即數(shù),可以是 16 位通用寄存器或內(nèi)存字 |
| reg/mem32 | 32 位立即數(shù),可以是 32 位通用寄存器或內(nèi)存雙字 |
| mem | 8位、16 位或 32 位內(nèi)存操作數(shù) |
直接內(nèi)存操作數(shù)
變量名引用的是數(shù)據(jù)段內(nèi)的偏移量。例如,如下變量 varl 的聲明表示,該變量的大小類型為字節(jié),值為十六進(jìn)制的10:
.data var1 BYTE 10h可以編寫(xiě)指令,通過(guò)內(nèi)存操作數(shù)的地址來(lái)解析(查找)這些操作數(shù)。假設(shè) var1 的地址偏移量為 10400h。如下指令將該變量的值復(fù)制到 AL 寄存器中:
mov al var1指令會(huì)被匯編為下面的機(jī)器指令:
A0 00010400這條機(jī)器指令的第一個(gè)字節(jié)是操作代碼(即操作碼(opcode))。剩余部分是 var1 的 32 位十六進(jìn)制地址。雖然編程時(shí)有可能只使用數(shù)字地址,但是如同 var1 一樣的符號(hào)標(biāo)號(hào)會(huì)讓使用內(nèi)存更加容易。
另一種表示法。一些程序員更喜歡使用下面這種直接操作數(shù)的表達(dá)方式,因?yàn)?#xff0c;括號(hào)意味著解析操作:
mov al, [var1]MASM 允許這種表示法,因此只要愿意就可以在程序中使用。由于多數(shù)程序(包括 Microsoft 的程序)印刷時(shí)都沒(méi)有用括號(hào),所以,本書(shū)只在出現(xiàn)算術(shù)表達(dá)式時(shí)才使用這種帶括號(hào)的表示法:
mov al,[var1 + 5]下一篇:MOV指令
強(qiáng)力推薦閱讀文章
年薪40+W的大數(shù)據(jù)開(kāi)發(fā)【教程】,都在這兒!
總結(jié)
- 上一篇: 创建链表和遍历链表算法演示
- 下一篇: 汇编语言MOVZX和MOVSX指令