Entiendo que imul es multiplicación con signo, y la documentación parece sugerir que la sintaxis de tres operandos es imulq dest, source1, source2. Por lo tanto, la línea se leería así: Multiplique el contenido de la dirección almacenada en% rbx y el valor en% rax, luego almacénelo en la ubicación de memoria 44, pero ¿esto seguramente no es correcto?

0
Jordan Mackie 5 may. 2017 a las 00:02

2 respuestas

La mejor respuesta

Está utilizando la variante de tres operandos de la instrucción imul, que se define en la referencia del conjunto de instrucciones como IMUL r64, r/m64, imm8 y significa "Multiplicar el contenido de r/m64 por imm8 y almacena el resultado en r64 ". También hay otra variante de esta instrucción, que toma un inmediato de 32 bits, pero es imposible saber qué variante emitirá realmente el ensamblador en este caso.

Ahora, su ensamblador parece estar usando la sintaxis de AT&T del ensamblaje x86. Es utilizado por el ensamblador GNU por defecto. Es conocido por especificar los operandos de la instrucción en orden inverso. Por lo tanto, imulq $44, (%rbx), %rax multiplicará el contenido de la memoria en la dirección almacenada en %rbx por 44 y almacenará el resultado en %rax.

4
Daniel Kamil Kozar 4 may. 2017 a las 21:10

Estaba leyendo el orden de los operandos de manera diferente a cómo lo describe la documentación.

Se lee como: "Obtenga el valor entero con signo almacenado en la dirección de memoria en el registro rbx, multiplíquelo por 44 y coloque el resultado en el registro rax".

O simplemente: imulq multiplier1, multiplier2, destination

0
Jordan Mackie 4 may. 2017 a las 21:08