Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: BioHazardTM en 20 Diciembre 2011, 13:46 PM

Título: [SOLUCIONADO]Problema con sufijos en ASM de AT&T
Publicado por: BioHazardTM en 20 Diciembre 2011, 13:46 PM
Hola buenas, tengo un problema al ensamblar un programa escrito en ensamblador con sintaxis de AT&T en un ordenador Linux de 64 bits.
El problema es que al ensamblar con:
Código (bash) [Seleccionar]
gcc -nostartfiles -g -o power power.s

Me da estos errores:
power.s: Assembler messages:
power.s:10: Error: operand type mismatch for `push'
power.s:17: Error: operand type mismatch for `pop'
power.s:24: Error: operand type mismatch for `push'
power.s:45: Error: operand type mismatch for `pop'


Si pongo pushb, pushw, pushl o pushq no se soluciona el problema.
A ver si me podéis ayudar.


Este es mi programa fuente:
Código (asm) [Seleccionar]

.section .data
.section .text
.globl _start
_start:
push $3
push $2
call power
add $8, %esp

push %eax

push $2
push $5
call power
add $8, %esp

pop %ebx
add %eax, %ebx
mov $1, %eax
int $0x80

.type power, @function
power:
push %ebp
mov %esp, %ebp
sub $4, %esp

mov 8(%ebp), %ebx
mov 12(%ebp), %ecx

mov %ebx, -4(%ebp)

power_loop_start:
cmp $1, %ecx
je end_power
mov -4(%ebp), %eax
imul %ebx, %eax
mov %eax,-4(%ebp)
dec %ecx
jmp power_loop_start

end_power:
mov -4(%ebp), %eax
mov %ebp, %esp
pop %ebp
ret
Título: Re: Problema con sufijos en ASM de AT&T
Publicado por: Eternal Idol en 20 Diciembre 2011, 14:14 PM
Estas trabajando con los registros de 32 bits (eax vs rax, etc.) y usando la convencion de llamada x86 ...

http://en.wikipedia.org/wiki/Stdcall#System_V_AMD64_ABI_convention

Tal vez estas buscando esto:
http://code.google.com/p/ass-ground-up/source/browse/assembly/power.s?spec=svnf0f0de9b6a6e9a69a98afd87f0fe3e82960f5361&r=f0f0de9b6a6e9a69a98afd87f0fe3e82960f5361
Título: Re: Problema con sufijos en ASM de AT&T
Publicado por: BioHazardTM en 20 Diciembre 2011, 15:08 PM
Gracias por responder Eternal Idol, al final lo he solucionado ensamblando y linkeando por separado para una máquina de 32 bits que es como he aprendido a programar.

Código (bash) [Seleccionar]
as --32 -o power.o power.s
ld -m elf_i386 -o power power.o