No se puede utilizar 'y' operador en Gnu como la expresión
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.
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.