80x86 16-битный asm: lea cx, [cx * 8 + cx] вызывает ошибку на NASM (компиляция файла .com) - PullRequest
6 голосов
/ 26 апреля 2010

Ошибка, выдаваемая NASM (несмотря на мою работающую ОС), - «неверный эффективный адрес».

Теперь я видел много примеров того, как использовать LEA, и я думаю, что я понял это правильно, но мой NASM не любит это. Я попытался lea cx, [cx+9], и это сработало; lea cx, [bx+cx] нет.

Теперь, если бы я расширил свои регистры до 32-битных (т.е. lea ecx, [ecx*8+ecx]), все было бы хорошо, но я ограничен в использовании только 16- и 8-битных регистров.

Есть ли здесь такой знающий человек, который мог бы объяснить мне, ПОЧЕМУ мой ассемблер не позволяет мне использовать то, что, как я предполагал, следует использовать?

Ответы [ 3 ]

9 голосов
/ 26 апреля 2010

Это потому, что [bx+cx] недопустим в любом режиме адресации на 16-битном x86, для получения дополнительной информации см. Этот сайт .

lea cx, [bx+di] или lea cx, [bx+si] должно работать.

Если ваш код будет работать на 386 или более поздней версии в 16-битном режиме, вы можете использовать lea cx, [ecx + 9] (префикс размера адреса, но все еще 16-битный размер операнда).

См. Также эти вопросы и ответы о режимах адресации x86 (в основном обсуждаются 32/64-битные режимы адресации и вики-тег .

6 голосов
/ 27 апреля 2010

lea cx,[cx*8+cx] не работает, потому что адресация "scale-index-base" доступна только для 32-битных регистров. Это не ограничение ассемблера - это ограничение процессора.

3 голосов
/ 03 февраля 2013

В следующих таблицах для построения постбайта показано, какой регистр можно использовать в качестве адресного регистра, а какой из них можно объединить со вторым адресным регистром (baseregister + indexregister и, возможно, масштабированием) для создания с ним адреса. (Наблюдается в 16-разрядном режиме адресации, где D-флаг не установлен.)

Instruction Prefix                0 or 1 Byte
Address-Size Prefix               0 or 1 Byte
Operand-Size Prefix               0 or 1 Byte
Segment Prefix                    0 or 1 Byte
Opcode                            1 or 2 Byte
Mod R/M (Postbyte)                0 or 1 Byte
SIB, Scale Index Base (386+)      0 or 1 Byte
Displacement                      0, 1, 2 or 4 Byte (4 only 386+)
Immediate                         0, 1, 2 or 4 Byte (4 only 386+)

Format of Postbyte(Mod R/M from Intel-Manual)
------------------------------------------
MM RRR MMM

MM  - Memeory addressing mode
RRR - Register operand address
MMM - Memoy 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

Dirk

...