【问题标题】:Assembly in instruction math syntax [duplicate]指令数学语法中的汇编[重复]
【发布时间】:2014-09-21 17:03:25
【问题描述】:

在汇编中经常有这样的指令:

mov eax, [ebp+4]
mov eax, [ebx + ecx*4]

我的问题是:我可以在这个刹车中做什么? 我可以添加和乘以所有寄存器和立即数还是有限制? 我也可以使用除法和减法吗? 我用谷歌搜索了它,但我找不到任何好的参考。

【问题讨论】:

标签: assembly x86


【解决方案1】:

32 位和 64 位模式下地址操作数的一般格式为:

[reg1 + reg2*mult + ofs]

mult 必须是 1,2,4,8 之一。 ofs 是一个立即数,即一个常数数值。可以是正面的,也可以是负面的。

不必指定所有三个部分,例如[eax][ecx*2 + 5] 是有效的。

通常,eip/rip 寄存器不能用作寄存器值之一。但在 64 位模式下有一种特殊的“RIP-relativeaddressing”模式,可以指定为[rip + ofs]

【讨论】:

  • 我想补充一点,立即数必须是数字文字,所以你必须在输入指令时将其指定为数字。
  • @MicroVirus 在这种情况下,这就是“立即”的意思。我已经澄清了。
  • @interjay 是 8、16 还是 32 位?
  • @kaetzacoatl 最高可达 32 位。
【解决方案2】:
Instruction Prefix                0 oder 1 Byte
Address-Size Prefix               0 oder 1 Byte
Operand-Size Prefix               0 oder 1 Byte
Segment Prefix                    0 oder 1 Byte
Opcode                            1 oder 2 Byte
Mod R/M                           0 oder 1 Byte
SIB, Scale Index Base (386+)      0 oder 1 Byte
Displacement                      0, 1, 2 oder 4 Byte (4 nur 386+)
Immediate                         0, 1, 2 oder 4 Byte (4 nur 386+)

Format of Postbyte(Mod R/M aus Intel-Doku)
------------------------------------------
MM RRR MMM

MM  - Memory addressing mode
RRR - Register operand address
MMM - Memory operand address

RRR Register Names
Filds  8bit  16bit  32bit
000    AL     AX     EAX
001    CL     CX     ECX
010    DL     DX     EDX
011    Bl     BX     EBX
100    AH     SP     ESP
101    CH     BP     EBP
110    DH     SI     ESI
111    BH     DI     EDI

---

16bit memory (No 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
100   DS       [SI]      [SI+o8]     [SI+o16]
101   DS       [DI]      [DI+o8]     [SI+o16]
110   SS       [o16]     [BP+o8]     [BP+o16]
111   DS       [BX]      [BX+o8]     [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

32bit memory (Has 67h 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [EAX]     [EAX+o8]    [EAX+o32]
001   DS       [ECX]     [ECX+o8]    [ECX+o32]
010   DS       [EDX]     [EDX+o8]    [EDX+o32]
011   DS       [EBX]     [EBX+o8]    [EBX+o32]
100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
101   SS       [o32]     [EBP+o8]    [EBP+o32]
110   DS       [ESI]     [ESI+o8]    [ESI+o32]
111   DS       [EDI]     [EDI+o8]    [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

---

SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))

Fild   Default Base
BBB    Sreg    Register   Note
000    DS      EAX
001    DS      ECX
010    DS      EDX
011    DS      EBX
100    SS      ESP
101    DS      o32        if MM=00 (Postbyte)
SS      EBP        if MM<>00 (Postbyte)
110    SS      ESI
111    DS      EDI

Fild  Index
III   register   Note
000   EAX
001   ECX
010   EDX
011   EBX
100              never Index SS can be 00
101   EBP
110   ESI
111   EDI

Fild Scale coefficient
SS   =2^(SS)
00   1
01   2
10   4
11   8

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 2014-06-19
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2017-08-15
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多