LINUX.ORG.RU

Assembler, вызов функции

 ,


0

1

Хочу реализовать что-то на подобии (2 упорядоченных массива, объединить их чтобы 3 массив остался тоже упорядоченным):

void foo(int *a, int *b, int n, int k){ 
    int t = n + k;
    int *end_a = a + n, end_b = b + k;
    int c[t] = {0}, end_c = c + t;
    while (c < end_c) {
        if((a != end_a && b != end_b && *a < *b) || b == end_b) {
            *c++ = *a++;
        } else { 
            *c++ = *b++;
        }
    }
}
здесь на nasm'e. проблема на 100 строчке после вызова foo. После этого следующая инструкция переходит на строчку (в отладчике)

0x000000000040068a <foo.while+12>: 3b 06 cmp eax,DWORD PTR [rsi]

, это 41 строчка. Подскажите в какую сторону копать.

Такого быть не может. Функция вызывается правильно, следом за call будет выполняться первая инструкция функции foo.

Вангую кривой отладчик. Пользуйся gdb.

anonymous
()
Ответ на: комментарий от anonymous

у меня стоит gdb-7.10.1, но при чем здесь отладчик? если просто не в отладчике запустить программу она тоже выпадет с ошибкой «Ошибка сегментации».

SmilePlz
() автор топика
Ответ на: комментарий от anonymous

и потом компилирует не отладчик, а gcc

SmilePlz
() автор топика
Ответ на: комментарий от AlexVR

спасибо что посмотрел, это действительно создало бы проблемы если бы дошло до тех инструкций. но проблема в том что оно перескакивает то что не должно. пойду смотреть до просветления =)

SmilePlz
() автор топика

Где точка входа? Почему метка main не внутри секции text? И вообще, лучше используй _start вместо main. Должно быть что-то вроде

section .text
_start:
    xor rax, rax
    ...
Где print_mass.inc ?

SZT ★★★★★
()
Ответ на: комментарий от SZT

print_mass тут просто макрос для печати int массива, принимает указатель на начало и конец. спасибо за совет, пойду попробую

SmilePlz
() автор топика
Ответ на: комментарий от SZT

спасибо за советы, но они не помогли. чё-то бред какой-то у меня получается. если добавлять строчки кода в текстовый файл, строка с инструкцией на которую переходит программа меняется =) тупняк

SmilePlz
() автор топика
Ответ на: комментарий от SmilePlz

упростил до

section .text
global main
main:
    push rbp
    mov eax, 2
    call foo
    pop rbp
    ret
foo:
    push rbp
    mov eax, 1
    pop rbp
    ret

 вызов foo игнорируется, в отладчике продолжает работать со след строки pop rbp. подскажите, пожалуйста, куда копать...t
SmilePlz
() автор топика
Ответ на: комментарий от SmilePlz

Во-первых линкуй через ld. Во-вторых разберись с соглашениями вызовов. Попробуй напиши хеллоувордл для начала. nasm -f elf64 -g -F dwarf test.asm используй, чтоб дебаг-инфу генерировало как надо. Короче, вот http://dump.bitcheese.net/files/yjefuny/nasm.tar.gz

вызов foo игнорируется, в отладчике продолжает работать со след строки pop rbp. подскажите, пожалуйста, куда копать...t

Ты наверное просто в своем отладчике перешагиваешь через этот call. Используй step вместо next

SZT ★★★★★
()
Ответ на: комментарий от SZT

не у меня с системой что-то не в порядке, на лайв сиди пробовал все нормально работает. у меня жесткие глюки чет я где-то напортачил.

SmilePlz
() автор топика
Ответ на: комментарий от SmilePlz

Какие глюки? Если ты int 0x80 используешь в 64-битном окружении, и оно не работает, и ядро у тебя руками сконфигурировано и собрано, я знаю в чем проблема. Ты, вероятно, отрубил поддержику интерфейса 32-битных системных вызовов, и 32-битные системные вызовы не работают. Но вооще это глупо, использовать 32-битные системные вызовы из 64-битной программы. Используй там 64-битные вызовы

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

Если честно я сам не особо понимаю что именно у меня не так. Глюки связаны с тем что например если в файл .Xdefaults для urxvt у меня есть коментарии, urxvt не запускается через раз, я ставил Deluge, он вообще просто не запускался если в выше упомянутом файле были комментарии. Причем если их удаляешь все нормально. У меня было аниме в папке mplayer все файлы воспроизводит нормально. mpv нет, в этой же папке у меня были файлы OP.xxx и END.xxx. почему то он (mpv) их воспроизводил а не те файлы которые я выбирал, это вылечилось пока я файлы OP.xxx и END.xxx не удалил. На многих страницах в Firefox не работали стили, хотя в других браузерах все нормально. И такой лагодром только увеличивался... Хотя это может быть совпадением.

32 битных инструкций... если значение меньше 32 бит компилятор сам использует эти инструкции. я просто его копировал в некоторых случаях. но например не обойтись в этом случае

mov eax, [rdx]
нельзя написать
mov dword rax, [rdx] 
, nasm меня на ... посылает. спасибо за твое участие и мнение, мне очень приятно что кто-то смотрел мой код и старался мне помочь.

SmilePlz
() автор топика
Ответ на: комментарий от SmilePlz

нельзя написать
mov dword rax, [rdx]

dword убери

SZT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.