Pregunta

Me gustaría obtener la dirección de una variable and'ed de 4096 (lo que correspondería a la dirección de su página de memoria). Puesto que esto es algo que puede ser calculada sin conexión que hice algo parecido a esto (v es la variable y vpágina debe contener la dirección de su página):

    .data
    v:        .zero 0x100
    vpage:  .long v & 0xfffff000

Tratando de compilar este archivo con los resultados de ensamblador x86 en el siguiente error:

test.S: Assembler messages:
test.S:3: Error: invalid sections for operation on `v' and `L0'

¿Por qué iba GAS basura para calcular esto? Ahora la parte extraña: sustituir 'y' por "+" y el código se compilará y la dirección siquiera se calcula correctamente después de la relación. Cualquier pista sobre el por qué de este comportamiento o cómo solucionarlo sería muy bien recibido.

¿Fue útil?

Solución

El problema con esto es que el gas genera archivos de objetos que serán procesadas por el enlazador (s). Mientras que el gas hace de soporte AND bit a bit operación, no puede hacerlo con direcciones absolutas. Están sujetos a cambio por el enlazador, y por lo tanto de gas debe generar entradas de reubicación que sólo soportan operaciones limitadas (principalmente sólo compensación). Si usted puede dar vuelta a su dirección absoluta en (local) en relación GAS dirección puede calcular que durante el tiempo de montaje. De lo contrario, tendrá que hacerlo desde el código en tiempo de ejecución.

Otros consejos

En Intel sintaxis que puede usar _AND, _OR, _NOT, _SHL, _SHR y tal vez otros para lograr esto. Este trabajo podría en ensamblador de GNU también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top