Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > При чем тут %rip ?


Автор: delgado 22.11.2011, 23:10
Всем доброго времени суток.

Я хотел бы познакомится с ассемблером, но по ходу столкнулся с одной проблемой:

у меня есть файл primes.s:

Код

.altmacro
.arch i386
.code32
.data

j:
    .long 0
k:
    .long 0
n: 
    .long 10
eol:
    .long 16
.section .bss
    .set PRIME_LENGTH,500 
    .set OUT_BUF_LENGTH,10
prime:
    .space  PRIME_LENGTH*4    
out_buf:
    .space  OUT_BUF_LENGTH

.macro print_string str,str_size
    movl $4,%eax
    movl $1,%ebx
    movl \str,%ecx
    movl \str_size,%edx
    int $0x80
.endm

.macro print_long 
    LOCAL div10 
    movl out_buf, %ecx
    
    decl %ecx
    /* movl \input,%eax */

div10:    
    movl $10,%ebx
    movl $0 ,%edx
    divl %ebx   
    addl $48,%edx
    mov %dl,out_buf(%ecx)
    decl %ecx
    cmpl $0,(%edx)
    jne div10
    movl $OUT_BUF_LENGTH,%edx
    sub %ecx,%edx
    leal out_buf(%ecx),%ecx
    movl $4,%eax
    movl $1,%ebx
    int $0x80
.endm
 
.text 
.globl main
main:
    movl $n,%eax
    movl $3,(%eax)
    movl $j,%eax
    movl $1,(%eax)
    movl $1,%ecx
    movl $2,prime(,%ecx,4)

prime_number:
/*----V Это здесь----------*/    
        incl j
    movl j,%ecx
    movl n,%eax
    movl %eax,prime(,%ecx,4) 

    cmpl $PRIME_LENGTH,j
    jna print_values

next_prime_candidate:
    add $2,n
    movl $2,k

check_rem:
    movl k,%ecx
    leal prime(,%ecx,4),%ebx
    movl $0,%edx
    movl n ,%eax
    divl (%ebx)
    cmpl $0,%eax
    je next_prime_candidate
    cmpl (%ebx),%edx
    jl prime_number
    incl k
    jmp check_rem

    movl $0, %ecx

print_values:
    
    pushl %ecx
    movl prime(,%ecx,4),%eax
    print_long 
    print_string eol,$1
    popl %ecx
    cmp $PRIME_LENGTH,%ecx
    jge exit
    incl %ecx
    jmp print_values

exit:
    movl $1 ,%eax
    movl $0,%ebx
    int $0x80

    
В строке 66 по задумке переменная j должна увеличиться на 1, но вместо этого вылетает segmentation fault
когда я смотрю этот участок кода под отладчиком и дизассемблирую его, то выходит:
Код


=> 0x00000000004004ba <+0>:    incl   0x601200(%rip)        # 0xa016c0
   0x00000000004004c0 <+6>:    mov    0x601200(%rip),%ecx        # 0xa016c6
   0x00000000004004c6 <+12>:    movabs 0x208d048900601208,%eax
   0x00000000004004cf <+21>:    adc    0x0(%rax),%ah
   0x00000000004004d2 <+24>:    cmpl   $0x1f4,0x601200(%rip)        # 0xa016dc
   0x00000000004004dc <+34>:    jbe    0x40051e <print_values>


Пожалуйста объясните что здесь делает этот %rip регистр и как сделать так, чтобы адресация была прямой без этого регистра.
    







Автор: 500mhz 24.11.2011, 12:27
может вам начать с 16 разрядных вариантов под мсдос?

Автор: delgado 24.11.2011, 21:15
Цитата

может вам начать с 16 разрядных вариантов под мсдос?

Линукс как-то ближе )
И мне кажется, что начинать  программировать под сегментную модель памяти тяжелее, чем плоскую.
С опцией .code16 ассемблируется верно, но мне все таки хочется разобраться что я сделал не так.

 

Автор: 500mhz 24.11.2011, 21:36
мне как то непонятно у вас сорец 32 разрадный, а дебуг 64.
а RIP при том что в 64 разрядном варианте все обращения к памяти релативные по rip

Автор: delgado 25.11.2011, 19:14
Мне непонятно тоже )
У меня 64 разрядами даже и не пахнет.
Все делаю очень просто 
Код

as -g -o primes.0 primes.s
ld -o primes primes.o 


Система: Linux  3.0-ARCH  x86_64 Intel® Celeron® CPU 2.66GHz

Я вот подумал может as по умолчанию в моей системе генерит 64 - битный код? Как тогда можно подавить настройки?

Автор: 500mhz 25.11.2011, 20:59
Цитата

0x00000000004004ba

что то мне подсказывает что это не 32 разрядный адрес )))
как в прочем и это - movabs 0x208d048900601208,%eax

мой вам совет, 
ставьте fasm под линюх и отладчик с INTEL ситаксисом, отпадет куча вопросов сразу

Автор: delgado 25.11.2011, 22:33
Спасибо, кажется разобрался, дело не в as  а в системе - по ходу у меня платформа x86-64, ну или система так думает )
Чтоб собрать правильно, нужно ковырять опции as и ld.  Жаль fasm в репах к arch нет - придется качнуть отдельно (


Автор: 500mhz 26.11.2011, 00:10
мне вообще не понятно как as что то скомпилировал, он же вроде интел синтакс не понимает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)