La línea de montaje 19 está mal, masm genera un error esperado constante, pero no sé qué está mal, supongo
Creo que esta es programación de 16 bits, que no incluye el factor de escala. Solo está disponible después de 32 bits, por lo que el direccionamiento de memoria no está disponible*
Y el de 32. factor de escala de bits Solo puede ser *1, *2, *4, *8, por lo que las opciones de alineación del lenguaje C solo pueden ser 1, 2, 4, 8
Problema de codificación de instrucciones x86, 16 formato de direccionamiento de memoria de bits Sí
Registro de dirección base + registro de índice + desplazamiento
El registro de dirección base puede ser BX, BP
El registro de índice puede ser SI , DI
El desplazamiento es cualquier parámetro o se calcula como una constante.
Como se mencionó anteriormente, mientras que el signo de multiplicación se puede usar en un ensamblado de 16 bits, solo se puede usar al calcular valores literales.
En detalle, puede escribir una declaración compleja en C y el resultado serán varias declaraciones cuando se descompile.
El poder del ensamblaje es que cada instrucción sólo realiza una operación. La división del trabajo está detallada y existe la posibilidad de optimización.
Y la CPU de 32 bits aún puede usar registros de propósito general de 32 bits en modo de 16 bits.
La codificación de bytes de código correspondiente específica es modo protegido, modo de dirección real, formato de instrucción en modo virtual-8086
══════════════ ═. ════════════════════════
¿Prefijo de instrucción?+?opcode?+?ModR/M?+?SIB +? ¿Desplazamiento?+?Número inmediato
───────────────────────────────── ── ──
Prefijo de comando: [opt] ¿Hasta cuatro prefijos, cada prefijo 1 byte?
──────────── ─────── ─────────────────────
Código de operación: 1, 2, 3 bytes
────── ─────────────────────────────────
ModR /M: 1 bytes, si es necesario
────────────────────────────── ───────
SIB: 1? byte, si es necesario
────────────────── ────────────── ─────
Desplazamiento: 1, 2, 4 bytes o ninguno
─── ────────────────── ─────────────────
Número inmediato: 1, 2, 4 bytes o Ninguno
═══════ ═════════════════════════════ Direccionamiento válido para codificación ═══16?bit?ModR/M?
═══════════════════════════ ════════════
r8(/ r)ALCLDLBLAHCHHDHBH
r16(/r)AXCXDXBXSPBPSIDI
r32(/r) EAXECXEDXEBXESPEBPESIEDI
mm(/r)MM0MM1MM2MM3MM4MM5MM6MM7
xmm (/r)XMM0?XMM1?XMM2?XMM3?XMM4?XMM5?XMM6?XMM7
(Decimal)/dígito(Código de operación)0?1?2?3?4?5?6?7
(Binario) REG?=?000001010011100101110111
─────── ─────────────────── ─── ──────────
[Mod][R/M]ModR/M
─────────────── ──────────────────────────
[BX+SI][00]?[000]?0008101820283038
[BX+DI]?[001]?0109111921293139
[BP+SI]?[010 ]?020A121A222A323A
[BP+DI]?[011]? 030B131B232B333B
[SI][100]?040C141C242C343C
[DI][101]? p>[BX][111]?070F171F272F373F
───────────── ───────────────── ─── ───────
[BX+SI]+disp8?[01]?[000]?4048505860687078
[BX+DI]+disp8[001]?4149515961697179
[BP+SI]+disp8[010]?424A52
5A626A727A
[BP+DI]+disp8[011]?434B535B636B737B
[SI]+disp8?[100]?444C545C646C747C
[DI]+disp8 ?[101]?454D555D656D757D
[BP]+disp8?[110]?464E565E666E767E
[BX]+disp8?[111]?474F575F676F777F
─ ──────────────────────────────────────
[B X+SI] +disp16?[10]?[000]?80889098A0A8B0B8
[BX+DI]+disp16?[001]?81899199A1A9B1B9
[BP+SI]+disp16?[010] ?828A929AA2AAB2BA
[BP+DI]+disp16?[011]?838B939BA3ABB3BB
[SI]+disp16?[100]?848C949CA4ACB4BC
[DI] +disp16?[101]?858D959DA5ADB5BD
[BP]+disp16?[110]?868E969EA6AEB6BE
[BX][111]?878F979FA7AFB7BF
── ───────────────────────────────────
EAX/AX/AL/ 0 /XMM0?[11]?[000]?C0C8D0D8E0E8F0F8
ECX/CX/CL/MM1/XMM1?[001]?C1C9D1D9E1E9F1F9
EDX/DX/DL/MM2/ XMM2 ?[010]?C2CAD2DAE2EAF2FA
ECX/BX/BL/MM3/XMM3?[011]?C3CBD3DBE3EBF3FB
ESP/SP/AH/MM4/XMM4?[100]?
EBP/BP/CH/MM5/XMM5?[101]?C5CDD5DDE5EDF5FD
ESI/SI/DH/MM6/XMM6?[110]?C6CED6DEE6EEF6FE
EDI/DI/BH/MM7/XMM7?[111]?C7CFD7DFE7EFF7FF
══════════════════════════ ═ ════════════