Estaba haciendo un ejemplo del libro que me estoy leyendo sobre asm, cuyo codigo es:
Código:
# signtest.s - An example of using the sign flag
.section .data
value:
.int 21, 15, 34, 11, 6, 50, 32, 80, 10, 2
output:
.asciz "The value is: %d\n"
.section .text
.globl _start
_start:
movl $9, %edi
loop:
pushl value(, %edi, 4)
pushl $output
call printf
add $8, $esp
dec %edi
jns loop
movl $1, %eax
movl $0, %ebx
int $0x80
El problema esta que mi cpu es de 64 bits, y creo que el codigo este es para 32 bits. (segun lei push y pop ya no se usan en 64 bits, es cierto?)
Si lo compilo tal cual:
Código:
~/asm/jumps$ as -o signed.o signed.s
signed.s: Assembler messages:
signed.s:12: Error: suffix or operands invalid for `push'
signed.s:13: Error: suffix or operands invalid for `push'
signed.s:15: Error: suffix or operands invalid for `add'
~/asm/jumps$
Pero si le digo al ensamblador que haga el codigo para 32 bits:
Código:
~/asm/jumps$ as --32 -o signed.o signed.s
signed.s: Assembler messages:
signed.s:15: Error: suffix or operands invalid for `add'
~/asm/jumps$
No dice nada de los push, pero se queja de la instrucción add. No es correcta esa instruccion en 32 bits? O me falta indicarle si estoy moviendo 8 bits, 16 o 32?
Por otro lado, otra duda que tengo, es que si en lugar de decirle al push que estoy moviendo 32 btis, le digo que mueva 64 con pushq, tampoco se queja de los push. Igualmente usar pushq no seria correcto ya que estoy moviendo un entero, y este ocupa 4 bytes.
Gracias de antemano