2013-05-06 4 views
1

Я изучаю ядро ​​Linux, поэтому мне нужно прочитать код сборки. Вот пример кодаКак использовать как в linux с языком ассемблера


SYSWRITE=4 
.globl mywrite,myadd 
.text 
mywrite: 
    pushl %ebp 
    movl %esp,%ebp 
    pushl %ebx 
    movl 8(%ebp),%ebx 
    movl 12(%ebp),%ecx 
    movl 16(%ebp),%edx 
    movl $SYSWRITE,%eax 
    int $0x80 
    popl %ebx 
    movl %ebp,%esp 
    popl %ebp 
    ret 

myadd: 
    pushl %ebp 
    movl %esp,%ebp 
    movl 8(%ebp),%eax 
    movl 12(%ebp),%edx 
    xorl %ecx,%ecx 
    addl %eax,%edx 
    jo 1f 
    movl 16(%ebp),%eax 
    movl %edx,(%eax) 
    incl %ecx 
1: 
    movl %ecx,%eax 
    movl %ebp,%esp 
    popl %ebp 
    ret 

Я использую как в этом случае
«как -o callee.o callee.s»

скомпилировать его, но он терпит неудачу с сообщением говоря что-то вроде этого
«callee.s | 5 | Ошибка: суффикс или операндами недопустимые для` толчке '»

+0

Рядом Дубликат: https://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit- system-gnu-toolchain, который говорит о 'gcc' и' ld', но не 'as'. (Вы можете использовать 'gcc -m32 foo.S' для сборки и соединения.) –

ответ

3

Вы, вероятно, на 64-битной машине, так что ваш as по умолчанию - 64-разрядный. Поскольку у вас есть 32-битный код, вы хотите использовать:

as -32 -o callee.o callee.s 
Смежные вопросы